Cuando trabajamos en aplicaciones empresariales, nuestro trabajo es escribir una lógica empresarial que implemente las reglas empresariales, es decir, las reglas que nuestra empresa ha especificado para su aplicación. ¿Cómo podemos hacer este trabajo más fácil? Una forma es utilizar el patrón de diseño de especificación. El patrón de diseño de especificación proporciona una forma flexible de definir y combinar reglas o condiciones comerciales de una manera reutilizable y fácil de mantener, promoviendo así la separación de preocupaciones y reduciendo la duplicación de código. En este artículo, presentaré el patrón de diseño de especificación y mostrar cómo podemos aprovecharlo en C#, proporcionando una serie de ejemplos de código para ilustrar los conceptos. Cree un proyecto de aplicación de consola en Visual Studio En primer lugar, creemos un proyecto de aplicación de consola .NET Core en Visual Studio. Suponiendo que Visual Studio 2022 esté instalado en su sistema, siga los pasos que se describen a continuación para crear un nuevo proyecto de aplicación de consola .NET Core. Inicie el IDE de Visual Studio. Haga clic en «Crear nuevo proyecto». En la ventana «Crear nuevo proyecto», seleccione «Aplicación de consola (.NET Core)» de la lista de plantillas que se muestran. Haga clic en Siguiente. En la ventana «Configura tu nuevo proyecto», especifica el nombre y la ubicación del nuevo proyecto. Haga clic en Siguiente. En la ventana «Información adicional» que se muestra a continuación, elija «.NET 7.0 (soporte estándar)» como la versión de Framework que le gustaría utilizar. Haga clic en Crear. Usaremos este proyecto de aplicación de consola .NET 7 para trabajar con el patrón de diseño de especificación en las secciones siguientes de este artículo. ¿Qué es el patrón de diseño de especificación? El patrón de diseño de especificación proporciona un enfoque modular y estructurado para definir las reglas de su negocio y combinar ellos en la aplicación. Esto le permite hacer que su código fuente sea más fácil de mantener, probar y reutilizar mientras encapsula las reglas comerciales dentro de objetos de especificación. Al utilizar un patrón de diseño de especificación, se aísla la lógica de validación de las entidades comerciales a las que se aplica. Esto se logra introduciendo un objeto de especificación que encapsula una condición y expone un método para determinar si un objeto en particular la satisface. ¿Por qué utilizar el patrón de diseño de especificación? En el patrón de especificación, los criterios y reglas se definen, encapsulan y se vuelven reutilizables usando un enfoque orientado a objetos. Esto, a su vez, mejora la organización, la capacidad de prueba y la reutilización de su código. Las reglas y condiciones comerciales se pueden representar más fácilmente cuando se utiliza el patrón de diseño de especificación. Al utilizar el patrón de especificación, puede: Modularizar el código: las especificaciones encapsulan reglas y condiciones comerciales en clases separadas, haciéndolas más fáciles de entender, modificar y mantener. Además, ayudan a mantener una base de código limpia y enfocada al aislar las preocupaciones en una aplicación. Mejorar la reutilización: las especificaciones se pueden reutilizar con una lógica de validación similar en todas las partes de la aplicación. Puede evitar la duplicación de código y garantizar una validación coherente en todo el sistema encapsulando las reglas en objetos de especificación reutilizables. Composición dinámica: las especificaciones se pueden combinar utilizando operadores lógicos como Y, O y NO para crear condiciones complejas. La combinación de múltiples especificaciones le permite crear consultas o filtros dinámicos. Optimice las pruebas: las especificaciones representan reglas comerciales individuales, lo que hace que sea fácil probarlas de forma aislada. Como resultado, las pruebas unitarias son más fáciles de escribir y la lógica de validación es más sólida. Implementación del patrón de diseño de especificación en C# Para comenzar a implementar el patrón de especificación, primero puede diseñar la interfaz ISpecification. Esto tendrá un método llamado IsSatisfied que acepta un objeto como parámetro y devuelve un valor booleano en función de si el objeto pasado como parámetro satisface la especificación requerida.interfaz pública ISpecification
{ bool Está satisfecho (elemento T); }Ahora podemos crear una clase llamada IncentiveSpecification que verifica si un empleado es elegible para recibir incentivos como se muestra en el fragmento de código que se muestra a continuación.public class IncentiveSpecification: ISpecification
{ public bool está satisfecho
{ return empleado.Básico >=5000 && empleado.IsFullTime; } }En el fragmento de código anterior, el método IsSatisfied comprueba si la propiedad básica del empleado es mayor o igual a 5000 y si el empleado es un empleado de tiempo completo. Si se cumple esta condición, el código devuelve verdadero; en caso contrario, falso. Creación y combinación de especificaciones en C#El patrón de diseño de especificaciones facilita la combinación de especificaciones. Puede combinar especificaciones utilizando los operadores lógicos (Y, O, NO) para representar condiciones complejas en el código de su aplicación. Cree una nueva clase base abstracta de C# denominada Especificación e ingrese el siguiente código.clase abstracta pública EspecificaciónBase : IEspecificación
{ public abstract bool IsSatisfied(T elemento); Especificación pública Y (Especificación especificación) {devolver nueva especificación y(esta, especificación); } especificación pública O (especificación especificación) { devolver nueva OrSpecification(esta, especificación); } especificación pública Not() { devolver nueva NotSpecification(este); } }Cree clases para implementar condiciones. Ahora cree clases de implementación concretas de las especificaciones AndSpecification, OrSpecification y NotSpecification como se muestra en el listado de códigos que figura a continuación.clase pública AndSpecification : Base de especificación
{Base de especificación privada de solo lectura _leftEspecificación; EspecificaciónBase privada de solo lectura _rightEspecificación; público y especificación (base de especificación izquierdaEspecificación, Base de especificación especificaciónderecha) { _especificaciónizquierda = especificaciónizquierda; _rightSpecification = rightSpecification; } anulación pública bool IsSatisfied(T elemento) { return _leftSpecification.IsSatisfied(item) && _rightSpecification.IsSatisfied(item); } } clase pública o especificación : Base de especificación
{Base de especificación privada de solo lectura _leftEspecificación; EspecificaciónBase privada de solo lectura _rightEspecificación; público o especificación (base de especificación izquierdaEspecificación, Base de especificación especificaciónderecha) { _especificaciónizquierda = especificaciónizquierda; _rightSpecification = rightSpecification; } anulación pública bool IsSatisfied(artículo T) { return _leftSpecification.IsSatisfied(artículo) || _rightSpecification.IsSatisfied(artículo); } } clase pública NotSpecification : Base de especificación
{Base de especificación privada de solo lectura _especificación; NotSpecificación pública (Base de especificación especificación) { _especificación = especificación; } public override bool IsSatisfied(T item) { return !specification.IsSatisfied(item); } }Crear clases para implementar especificacionesAhora, cree dos clases adicionales que representen especificaciones concretas: una para el estado de tiempo completo y la otra para la especificación básica, como se muestra en el fragmento de código que se muestra a continuación.clase pública FullTimeSpecification: Especificación
{ public override bool IsSatisfied(Empleado empleado) { return empleado.IsFullTime; } } clase pública Especificación básica: Especificación
{ public override bool IsSatisfied(Empleado empleado) { return empleado.Básico >= 5000; } }Validar especificaciones frente a condicionesFinalmente, puede escribir el siguiente fragmento de código para comprobar si se cumplen las condiciones. Empleado empleado = nuevo Empleado(); empleado.FirstName = «Joydip»; empleado.Apellido = «Kanjilal»; empleado.Básico = 1000; empleado.IsFullTime = verdadero; var especificación básica = nueva especificación básica(); var fullTimeSpecification = nueva FullTimeSpecification(); var especificación compuesta = nueva especificación y(especificación básica, especificación de tiempo completo); var isSatisfied = compositeSpecification.IsSatisfied(empleado); if (isSatisfied) Console.WriteLine(«Las condiciones se cumplen…»); else Console.WriteLine(«Las condiciones no se cumplen…»); Console.ReadLine();Debido a que el valor de la propiedad Básica del objeto empleado es 1000, cuando ejecuta el código anterior, verá el texto «Las condiciones no se cumplen…» en la ventana de la consola. El patrón de diseño de especificación le permite escribir código estructurado, modular y reutilizable mientras define las reglas comerciales de la aplicación de una manera flexible. Puede utilizar el patrón de diseño de especificación en escenarios que requieren la validación de condiciones, consultar y filtrar datos, aplicar reglas comerciales y evaluar condiciones complejas. Es un patrón muy útil para tener en su caja de herramientas. Copyright © 2023 IDG Communications, Inc.

Source link