java - software - ¿Patrones de diseño que todo desarrollador debe conocer?
patrones de diseño web (11)
¿Cuáles son los patrones de diseño que todo desarrollador debe saber?
Estoy interesado en el contexto de los desarrolladores web de Java que trabajan con Spring & Hibernate. A menudo he escuchado que un buen conocimiento de los patrones de diseño es esencial para trabajar con esos marcos. ¿Alguien puede enumerar los detalles?
Por ejemplo, sé que entender el patrón abstracto de fábrica y fábrica, patrón de singleton, etc. es absolutamente esencial. Estoy buscando una lista completa.
Inversión de control
Si alguna vez va a diseñar sistemas desacoplados, necesitará saber cómo vincular adecuadamente las dependencias entre clases.
Patrón de Comando y Variantes
En Java en particular, es esencial aprender cómo pasar una pieza de funcionalidad a otro método como un objeto debido a la falta de cierres y punteros de función en el lenguaje.
Patrón de fábrica
Las fábricas son ubicuas en los marcos de Java y es esencial aprender por qué y cuándo usar el patrón de fábrica.
Singleton (patrón y anti-patrón)
Aprender a usar el patrón Singleton de manera responsable es muy útil para comprender las dificultades del código de otras personas que puede estar leyendo.
En general, aprender el por qué con respecto a los patrones es mucho más importante que el cómo . Saber cuándo no aplicar un patrón es tan importante como saber cuándo.
¡Todos deberían saber sobre Singleton, pero también cuándo no usarlo! Actualmente es la fuente de mucho dolor para mí en un proyecto en el trabajo.
Singletons hace que el código sea difícil de entender y seguir, y hace que las pruebas de unidad de escritura sean mucho más difíciles. Me gusta la entrada del blog Singletons are Pathological Liars .
¿Hibernar? Entonces, la Unidad de Trabajo es imprescindible http://martinfowler.com/eaaCatalog/unitOfWork.html
Compuesto, está presente en el framework JUnit. (Test-TestCase-TestSuite)
Los patrones de Adaptador, Generador, Comando, Método de Plantilla y Estrategia son fáciles y, a menudo, utilizables en la práctica.
El patrón del estado también me ayudó a limpiar el desorden en los códigos fuente heredados.
Aparte de los patrones Abstract factory
, Factory Method
y Singleton
, que ya ha citado, creo que a continuación los patrones son útiles.
Patrón de puente : la abstracción y la implementación pueden cambiar de forma independiente
Patrón decorador : cambia el comportamiento del objeto en el tiempo de ejecución
Patrón de mediador : habilite el medio de comunicación central entre diferentes objetos
Cadena de responsabilidad : si está agregando filtros a la solicitud de servicio web, esto es muy útil.
Patrón de estrategia : si desea cambiar el algoritmo de una familia de algoritmos en tiempo de ejecución, marque un parámetro
Patrón de fachada : si tiene muchos servicios en su sistema y no desea exponer todos los servicios al cliente, tenga una clase de fachada, que interactúe con otros servicios.
sourcemaking proporciona excelentes detalles sobre cada patrón de diseño: Intención, Estructura, Lista de verificación y Reglas generales.
Una pregunta más de SE sería definitivamente ayudarte:
Esto sería un comentario a la referencia de Greg Hewgill a "Singletons Are Pathological Liars", pero todavía no puedo hacer comentarios.
Ese artículo hace un caso convincente, pero su ira está mal dirigida. Como señalaron varios comentaristas en su blog, su problema es realmente un estado global. Su corrección de código aún podría estar haciendo uso de singletons, y aún así obtener el aumento exacto de claridad y comprobabilidad.
Vuelve a leer el artículo. No le molesta que OfflineQueue necesite una instancia de base de datos inicializada, ni que CreditCardProcessor necesite un OfflineQueue inicializado. Le molesta que esas dependencias no sean visibles, lo que causa problemas con la capacidad de mantenimiento y la capacidad de prueba.
Su problema es con el estado global secreto ( ¿esto me hace sonar como un teórico de la conspiración? ).
Sin embargo, está (imo) malinterpretando ese estado global secreto como culpa de singletons.
Eso no significa que estoy a favor de los singletons donde no son necesarios; ciertamente, tienen inconvenientes (incluida la obvia posibilidad de cuellos de botella en la contención del hilo). Pero prefiero tener claro qué prácticas evito.
Por cierto, iría más allá en mi refactorización: según los nombres de las clases, afirmaría en una revisión del código que CreditCardProcessor debería, bueno, procesar los cargos, así que en lugar de él:
card.charge(cardProcessor, 100);
Tendría esto, en cambio:
cardProcessor.chargeCard (card, 100);
(y sí, reemplazé sus nombres de variables c
y ccp
con nombres que consideré más legibles)
La mayoría de los patrones de diseño son bastante obvios: ya los conoce y los usa si ha estado programando durante algunos años.
La mayor ventaja que he encontrado para diseñar patrones es compartir un conjunto común de nombres. Si alguien dice "Devolución de llamada", eso puede significar bastantes cosas, pero si alguien dice "Patrón de escucha", eso significa un conjunto de llamadas más específico e implica una relación de mayor nivel entre los objetos.
Así que, en esencia, lea un buen libro de patrones de diseño, tenga una idea del nombre de cada patrón, dedique un tiempo a comprender lo que no sabe y estará listo.
No ignoraría completamente a ninguno de ellos, todos son buenos haberlos visto. Debería poder reconocer una situación que podría beneficiarse de un patrón específico y saber dónde buscar para obtener más información al respecto.
Le recomendaría que obtenga y lea el libro Patrones de diseño, ya que le proporciona el vocabulario.
Modelo-vista-controlador solo tiene que estar en la lista, Spring tiene un marco MVC:
Pero no olvides los fundamentos :)
Entrevistar a los desarrolladores de Java con lágrimas en mis ojos http://java.sys-con.com/node/1040135
Singleton - Singletons aparentemente puede y debe usarse para todo
Te recomiendo leer el libro Head First Design Patterns . Este es un libro bien escrito sobre todos los bienes comunes y patrones útiles.