viernes, 31 de mayo de 2013

La fiesta de los bocazas. (Blowhard Jamboree)

Buscando en Internet los antipatrones para refrescarlos en mi mente y redactar el post anterior he caído en un antipatrón (título de este post) que aunque no es muy común en los ambientes que me muevo actualmente es muy fácil caer en ellos y además refleja la paradoja de que yo mismo soy un bocazas.

Este antipatrón consiste en tomas decisiones y asumir cosas simplemente con la información salida de lo que ha publicado un señor cualquiera en un medio de comunicación. Por ejemplo, este blog.

En mi caso en concreto me ha pasado con "el lado oscuro" de los patrones de diseño.

Los antipatrones más comunes a los que me enfrento de forma diaria.

Como descanso a DDD y como forma de desahogo voy a poner una lista de los antipatrones de diseño que día tras día veo que se repiten una y otra vez sin que nadie que cuente con la capacidad decisoria para poder atajar el problema mueva un dedo al respecto.

lunes, 20 de mayo de 2013

Arquitecturas para Domain-Driven Design - Parte VI

Capa de Persistencia.
Esta capa sirve como puente entre la lógica de negocio (servicios y entidades) y el proveedor de datos. Históricamente es una capa que se usa para encapsular las especificaciones del proveedor de datos. Aunque esto sigue siendo, en cierta manera, así, gracias a nuevas tecnologías como los ORM (los cuales ya realizan una abstracción del proveedor de datos) su propósito puede llegar a ser el de abstraerse de los detalles de implementación del ORM y proporcionar mecanismos para la satisfacción de consultas utilizando el ORM escogido.

viernes, 26 de abril de 2013

Un uso para la función RAND() en SQL

Gran parte de mi trabajo transcurre con los ojos pegados al Server Management Studio de SQL. En ocasiones tengo que buscar soluciones a ciertos problemas, y a veces encuentro maneras (unas veces más elegantes que otras) de salvar el escollo. El caso es que cuando un año después me surge otro problema semejante me mata tener que buscar un fragmento de código entre cientos de procedimientos almacenados con más o menos líneas de Transact-SQL... Y como no todo el monte es NetBean o Arquitecturas DDD, voy a poner aquí una "breve" reseña sobre un uso de la función RAND() que he necesitado en un par de ocasiones y que, a buen seguro, volveré a necesitar.

lunes, 8 de abril de 2013

Un proyecto en NetBeans de principio a fin (V). Conexión con la base de datos

No es por desanimar, pero si la entrada anterior os pareció larga y cansina agarraros con ésta. Si estáis siguiendo este tutorial con tanto entusiasmo que no podéis parar de leer y enredar con NetBeans hasta llegar al final de cada post, más vale que vayáis a mear y a picar algo a la cocina... En esta ocasión vamos a centrarnos en la comunicación entre la base de datos y la aplicación. Añadiremos unos cuantos datos a la base de datos y examinaremos algunas de las características que proporciona el editor de SQL del IDE. Configuraremos el origen de datos y un pool de conexiones en el servidor GlassFish, y crearemos una página JSP para probar la conexión mediante alguna consulta simple a la base de datos.

martes, 2 de abril de 2013

Arquitecturas para Domain-Driven Design - Parte V

Overview de la Arquitectura 

Como ya comenté en un post anterior, DDD es el candidato perfecto para grandes y complejos sistemas que conllevan un buen montón de procesos; los cuales colaboran entre si siguiendo unas reglas para mantener la coherencia y consistencia del propio sistema al que pertenece.

Empecemos a dividir en capas las distintas partes para hacernos una idea.

martes, 12 de marzo de 2013

Referencias teoría DDD

Voy a dejar las referencias sobre DDD que suelo consultar y de las cuales he fusilado más contenido del que me gustaría por culpa de mi pereza.

Espero que esto sirva para que no me denuncien por plagio y que los autores reciban el reconocimiento que se merecen.




Guía de Arquitectura N- Capas Orientada al Dominio con .NET 4.0

Para lectores mas avanzados dejo una serie de documentos PDF que discute distintas formas de modelar  agregados junto con sus ventajas y desventajas:

Effective Aggregate Design

viernes, 8 de marzo de 2013

Buddy classes en .NET

Las Buddy classes son una técnica para añadir metadatos a clases que son generadas automáticamente por herramientas, ya sean estas herramientas del Visual Studio o herramientas externas; también son útiles para la segregación de responsabilidades.

La introducción de clases parciales, que permiten ampliar los miembros de una clase creada por una herramienta sin que volver a crear la clase se machaque nuestra personalización, es una gran idea, pero tiene un problema a la hora de modificar un miembro ya declarado. Si en vez de añadir nuevos miembros a una clase queremos añadir un atributo a un miembro ya existente nos encontramos con un problema, puesto que el atributo añadido a un miembro de la clase se borraría al regenerar la clase de nuevo.

Para solventar este problema tenemos las buddy clases. Estas son clases que amplían los metadados de otra clase, pudiendo definir el miembro de la clase a modificar dentro de la buddy y añadiéndole el atributo que corresponda.

Imaginemos que tenemos la siguiente clase generada por una plantilla T4 en VS:

Partial Public Class Clasificacion

    Private _ID as String

    Private Descripcion as String



    Public Sub New(ByVal id As String)

    End Function



    Public Property ID() As String

    End Property



    Public Property Descripcion() As String

    End Property

End Class

Queremos añadir un atributo de validación a la propiedad Descripcion, por lo que debemos crear una Buddy Class con esa propiedad sin implementación y asociar esa Buddy Class a la extensión de la clase parcial utilizando el atributo MetadataType.

Public Class ClasificacionMetadata

<StringLength(50, ErrorMessage:="El campo descripcion de una Clasificacion no puede superar los 50 caracteres.")> _
    Public Property Descripcion() As String
        Get
        End Get
        Set
        End Set
    End Property
End Class

<MetadataType(GetType(ClasificacionMetadata))> _
Partial Public Class Clasificacion
    Public Function tieneDescricion As Boolean
        Return not String.IsNullOrEmpty(Me.Descripcion)
    End Function
End Class

Con esta definición, algunas tecnologías .NET recuperan el atributo MetadataType utilizando reflexión y obtendrán el atributo StringLengthAttribute de la Buddy Class cuando procesen la propiedad Descripcion de la clase generada.

Desgraciadamente, si nuestro código necesita procesar estos metadatos a través de la reflexión de tipos debemos programar explícitamente la posibilidad de que la clase parcial tenga asociado un MetadataType, recuperarlo y al procesar la clase parcial buscar en la clase Buddy su correspondencia para mirar si tiene algún atributo que extienda algún miembro. Esto es muy oscuro, aburrido y provoca que todo aquel que toque el codigo fuente de nuestro programa tenga conocimiento de la necesidad de este comportamiento. No me gusta.

Por suerte, .NET provee una manera de ampliar las descripciones de las clases administradas para que sean procesadas de forma transparente por el framework de reflexión de tipos.

domingo, 3 de marzo de 2013

Un proyecto en NetBeans de principio a fin (IV). Páginas y servlet del controlador

Me temo que esta cuarta entrega va a ser enorme... Tenemos mucho que hacer aquí. Nuestro objetivo es empezar a organizar el front-end de la aplicación, preparando las vistas de las páginas y a situándolas en la estructura apropiada del proyecto (usaremos HTML y CSS para esto). La idea es tener una maqueta, ahora con código fuente, de los esquemas que obtuvimos en la fase de diseño. Crearemos un pie y una cabecera que aplicaremos a todas las vistas, y configuraremos el servlet del controlador para las peticiones entrantes. Empecemos sin más preámbulos. 

lunes, 25 de febrero de 2013

Arquitecturas para Domain-Driven Design - Parte IV

Ya queda poco para explicar los conceptos mas básicos de DDD y ponernos con la arquitectura. Quiero recordar a los lectores que el tema de DDD es un campo enorme y estos posts son simplemente orientativos para facilitar un punto de entrada sencilla a cualquiera que quiera documentarse y aprender a fondo DDD. Al finalizar esta lista de conceptos básicos agregare reseñas a la bibliografía y documentación de la cual he plagiado todo esto.