Desarrollo guiado por pruebas (TDD)
Escribir pruebas primero ofrece muchas ventajas, como verificabilidad,
prevención de regresión y documentación, entre otras.
Una prueba en sí misma puede considerarse como un usuario de algún código
que eventualmente se escribirá, y como resultado de ello, escribir código
utilizando el primer enfoque de pruebas impone un buen diseño del código. Esto
significa que el código escrito usando TDD generalmente está mejor diseñado, ya
que escribir las pruebas primero obliga al desarrollador a escribir código que
sea fácil de probar, que generalmente es un código bien diseñado.
Vale la pena señalar que TDD debe usarse junto con el Desarrollo
Conducido por el Comportamiento (BDD). TDD generalmente se basa demasiado en la
implementación específica que un desarrollador decidió usar, mientras que BDD
prueba el comportamiento del código. Esto es especialmente útil durante la
refactorización, ya que aún puede saber si el nuevo código implementa
correctamente el comportamiento requerido del código anterior, sin tener que
actualizar ninguna prueba de comportamiento.
Fuente única de verdad (SSOT)
El concepto de una sola fuente de verdad se refiere a la idea de
almacenar datos de aplicaciones en un solo lugar. Cualquier otro enlace a una
información específica se realiza simplemente por referencia y, por lo tanto,
este enfoque puede ayudar a evitar problemas de sincronización de datos y crear
una separación más clara de los datos y su representación.
SSOT también se puede aplicar a otros esfuerzos fuera del desarrollo de
software, como el desarrollo de una organización o producto.
Use sangría consistente
No hay sangría correcta
o incorrecta que todos deben seguir. El mejor estilo, es un estilo
consistente. Una vez que comience a competir en grandes proyectos,
comprenderá de inmediato la importancia de un estilo de código consistente.
Evite la anidación profunda
Demasiados niveles de anidación pueden hacer que el
código sea más difícil de leer y seguir.
Por ejemplo:
Se puede escribir como:
Limite la longitud de la línea
Las líneas largas son
difíciles de leer. Es una buena práctica evitar escribir líneas de código
horizontalmente largas.
Mantenga el código simple
El código siempre debe
ser simple. La lógica complicada para lograr tareas simples es algo que
desea evitar, ya que la lógica que un programador implementó un requisito puede
no tener mucho sentido para otro. Por lo tanto, siempre mantenga el código
lo más simple posible.
Por ejemplo:
Se puede escribir como:
Citas
"Como desarrolladores hay dos formas en que fallamos: construimos las cosas mal o construimos las cosas mal". - Steve Smith
Patrones de comportamiento
En ingeniería de
software, los patrones de diseño de comportamiento son patrones de diseño que
identifican patrones de comunicación comunes entre objetos y realizan estos
patrones. Al hacerlo, estos patrones aumentan la flexibilidad para llevar a
cabo esta comunicación.
Cadena de responsabilidad
Es una forma de pasar una solicitud entre una cadena de
objetos.
- Evite acoplar el remitente de una solicitud a su
receptor dando a más de un objeto la oportunidad de manejar la solicitud. Encadene
los objetos receptores y pase la solicitud a lo largo de la cadena hasta
que un objeto lo maneje.
- Inicie y deje solicitudes con una única
canalización de procesamiento que contiene muchos posibles controladores.
- Una lista vinculada orientada a objetos con
recorrido recursivo.
Las clases derivadas saben cómo satisfacer las
solicitudes del Cliente. Si el objeto "actual" no está
disponible o no es suficiente, entonces delega a la clase base, que delega al
objeto "siguiente", y el círculo de la vida continúa.
Varios manejadores podrían contribuir al manejo de
cada solicitud. La solicitud se puede pasar a lo largo de toda la cadena,
con el último enlace teniendo cuidado de no delegar a un "nulo
siguiente".
Ejemplo
El patrón de la cadena de responsabilidad evita el
acoplamiento del remitente de una solicitud al receptor al darle a más de un
objeto la oportunidad de manejar la solicitud. ATM utiliza la Cadena de
Responsabilidad en el mecanismo de entrega de dinero.
Comando
Encapsular
una solicitud de comando como un objeto.
- Encapsula una solicitud como un objeto, lo que te permite parametrizar clientes con diferentes solicitudes, solicitudes de cola o solicitudes de registro, y admite operaciones que no se pueden deshacer.
- Promueva la "invocación de un método en un objeto" al estado de objeto completo.
- Una devolución de llamada orientada a objetos.
El cliente
que crea un comando no es el mismo cliente que lo ejecuta. Esta separación
proporciona flexibilidad en el tiempo y la secuencia de los comandos. La
materialización de comandos como objetos significa que se pueden pasar,
organizar, compartir, cargar en una tabla y, de otro modo, instrumentar o
manipular como cualquier otro objeto.
Los objetos
de comando se pueden considerar como "tokens" creados por un cliente
que sabe lo que hay que hacer y se pasa a otro cliente que tiene los recursos
para hacerlo.
Ejemplo
El patrón de
comando permite que las solicitudes se encapsulen como objetos, lo que permite
que los clientes se parametricen con diferentes solicitudes. El
"cheque" en un restaurante es un ejemplo de un patrón de
comando. El camarero o camarera toma una orden o comando de un cliente y
encapsula esa orden escribiéndola en el cheque. El pedido se pone en cola
para un cocinero de pedido corto. Tenga en cuenta que la almohadilla de
"cheques" utilizada por cada camarero no depende del menú y, por lo
tanto, pueden admitir comandos para cocinar muchos artículos diferentes.
Intérprete
Es una
forma de incluir elementos del lenguaje en un programa.
- Dado un lenguaje, defina una
representación para su gramática junto con un intérprete que use la
representación para interpretar oraciones en el idioma.
- Asigna un dominio a un idioma, el
lenguaje a una gramática y la gramática a un diseño jerárquico orientado a
objetos.
El
intérprete sugiere modelar el dominio con una gramática recursiva. Cada
regla de la gramática es un 'compuesto' (una regla que hace referencia a otras
reglas) o un terminal (un nodo hoja en una estructura de árbol). El intérprete
se basa en el recorrido recursivo del patrón compuesto para interpretar las
"oraciones" que debe procesar.
Ejemplo
El patrón
Intérprete define una representación gramatical para un lenguaje y un
intérprete para interpretar la gramática. Los músicos son ejemplos de
intérpretes. El tono de un sonido y su duración se pueden representar en
notación musical en un pentagrama. Esta notación proporciona el lenguaje
de la música. Los músicos que tocan la música de la partitura pueden reproducir
el tono original y la duración de cada sonido representado.
Iterator
Accede secuencialmente a los elementos de una
colección.
- Proporcione una forma de acceder a los
elementos de un objeto agregado secuencialmente sin exponer su
representación subyacente.
- La abstracción de la biblioteca estándar
de C ++ y Java que hace posible desacoplar clases y algoritmos de
colección.
- Promueva al "estado de objeto
completo" el recorrido de una colección.
- Recorrido polimórfico.
El Cliente
utiliza la interfaz pública de la clase Colección directamente. Pero el
acceso a los elementos de la Colección está encapsulado detrás del nivel
adicional de abstracción llamado Iterator. Cada clase derivada de
Colección sabe qué clase derivada de Iterator crear y devolver. Después de
eso, el Cliente confía en la interfaz definida en la clase base Iterator.
Ejemplo
El iterador
proporciona formas de acceder a los elementos de un objeto agregado
secuencialmente sin exponer la estructura subyacente del objeto. Los
archivos son objetos agregados. En entornos de oficina donde el acceso a
los archivos se realiza a través del personal administrativo o de secretaría,
el patrón Iterator se demuestra con la secretaria actuando como
Iterator. Se han desarrollado varias parodias de comedia televisiva en
torno a la premisa de un ejecutivo que intenta comprender el sistema de archivo
de la secretaria. Para el ejecutivo, el sistema de archivo es confuso e
ilógico, pero la secretaria puede acceder a los archivos de manera rápida y
eficiente.
En los
primeros televisores, se usaba un dial para cambiar de canal. Al navegar
por el canal, el espectador tenía que mover el dial a través de cada posición
del canal, independientemente de si ese canal tenía o no recepción. En los
televisores modernos, se utilizan los botones siguiente y anterior. Cuando
el espectador selecciona el botón "siguiente", se mostrará el
siguiente canal sintonizado. Considere mirar televisión en una habitación
de hotel en una ciudad extraña. Al navegar por los canales, el número de
canal no es importante, pero la programación sí. Si la programación en un
canal no es de interés, el espectador puede solicitar el siguiente canal, sin
saber su número.
Mediador
Define comunicación simplificada entre clases.
- Defina un objeto que encapsule cómo
interactúa un conjunto de objetos. El mediador promueve el
acoplamiento suelto al evitar que los objetos se refieran entre sí
explícitamente, y le permite variar su interacción de forma independiente.
- Diseñe un intermediario para desacoplar
a muchos pares.
- Promueva las relaciones de muchos a
muchos entre pares que interactúan con el "estado de objeto
completo".
Los colegas
(o compañeros) no están unidos entre sí. Cada uno habla con el Mediador,
que a su vez conoce y dirige la orquestación de los demás. El "mapeo
de muchos a muchos" entre colegas que de otro modo existiría, ha sido
"promovido al estado de objeto completo". Esta nueva abstracción
proporciona un lugar de indirección donde se puede alojar un apalancamiento
adicional.
Ejemplo
El Mediador
define un objeto que controla cómo interactúa un conjunto de objetos. El
acoplamiento flojo entre los objetos del colega se logra haciendo que los
colegas se comuniquen con el Mediador, en lugar de entre sí. La torre de
control en un aeropuerto controlado demuestra muy bien este patrón. Los
pilotos de los aviones que se acercan o salen del área terminal se comunican
con la torre en lugar de comunicarse explícitamente entre sí. La torre
impone las restricciones sobre quién puede despegar o aterrizar. Es importante
tener en cuenta que la torre no controla todo el vuelo. Existe solo para
imponer restricciones en el área terminal.
Recuerdo
Capture y restaure el estado interno de un objeto.
- Sin violar la encapsulación, capture y
externalice el estado interno de un objeto para que el objeto pueda volver
a este estado más tarde.
- Una cookie mágica que encapsula una
capacidad de "punto de control".
- Promueva deshacer o revertir al estado
de objeto completo.
Ejemplo
El recuerdo
captura y externaliza el estado interno de un objeto para que luego el objeto
pueda restaurarse a ese estado. Este patrón es común entre los mecánicos
de bricolaje que reparan frenos de tambor en sus automóviles. Los tambores
se retiran de ambos lados, exponiendo los frenos derecho e izquierdo. Solo
un lado se desmonta y el otro sirve como un recuerdo de cómo encajan las piezas
del freno. Solo después de que el trabajo se haya completado en un lado,
se desarma el otro lado. Cuando se desarma el segundo lado, el primer lado
actúa como el recuerdo.
Objeto nulo
Diseñado para actuar como un valor predeterminado de un objeto.
La intención
de un objeto nulo es encapsular la ausencia de un objeto al proporcionar una
alternativa sustituible que ofrezca el comportamiento predeterminado de no
hacer nada. En resumen, un diseño donde "nada saldrá de la nada"
Utilice el
patrón de objeto nulo cuando:
- Un objeto requiere un
colaborador. El patrón de objeto nulo no introduce esta colaboración:
hace uso de una colaboración que ya existe.
- Algunas instancias de colaboradores no
deberían hacer nada.
- Desea abstraer el manejo de null lejos
del cliente.
Client
-
o Requiere un colaborador.
AbstractObject
-- Declara la interfaz para el colaborador
del Cliente.
- Implementa el comportamiento
predeterminado para la interfaz común a todas las clases, según
corresponda.
- RealObject -
o Define una subclase concreta de AbstractObject cuyas
instancias proporcionan un comportamiento útil que el Cliente espera.
- NullObject -
- Proporciona una interfaz idéntica a la
de AbstractObject para que un objeto nulo pueda ser sustituido por un
objeto real.
- Implementa su interfaz para no hacer
nada. Lo que significa exactamente no hacer nada depende de qué tipo
de comportamiento espera el Cliente.
- Cuando hay más de una forma de no hacer nada, se puede requerir más de una clase NullObject.
Observador
Una forma de notificar el cambio a varias clases.
- Defina una dependencia de uno a muchos
entre objetos para que cuando un objeto cambie de estado, todas sus
dependencias sean notificadas y actualizadas automáticamente.
- Encapsula los componentes centrales (o
comunes o del motor) en una abstracción de Asunto, y los componentes
variables (o opcionales o de interfaz de usuario) en una jerarquía de
Observador.
- La parte "Ver" de
Model-View-Controller.
El sujeto
representa la abstracción central (o independiente o común o motor). El
observador representa la abstracción variable (o interfaz dependiente u
opcional o de usuario). El Sujeto incita a los objetos Observador a hacer
lo suyo. Cada observador puede volver a llamar al sujeto según sea
necesario.
Ejemplo
El
observador define una relación de uno a muchos para que cuando un objeto cambie
de estado, los demás sean notificados y actualizados
automáticamente. Algunas subastas demuestran este patrón. Cada postor
posee una paleta numerada que se utiliza para indicar una oferta. El
subastador comienza la licitación y "observa" cuando se levanta una
paleta para aceptar la oferta. La aceptación de la oferta cambia el precio
de oferta que se transmite a todos los licitadores en forma de una nueva
oferta.
Estado
Altera el comportamiento de un objeto cuando su estado cambia.
- Permitir que un objeto altere su
comportamiento cuando cambia su estado interno. El objeto parecerá
cambiar su clase.
- Una máquina de estado orientada a
objetos.
- envoltura + envoltura polimórfica +
colaboración.
La interfaz
de la máquina de estado está encapsulada en la clase
"wrapper". La interfaz de la jerarquía de envoltura refleja la
interfaz de la envoltura con la excepción de un parámetro adicional. El
parámetro adicional permite que las clases derivadas de wrappee vuelvan a
llamar a la clase wrapper según sea necesario. La complejidad que de otro
modo arrastraría hacia abajo la clase del contenedor se divide y encapsula en
una jerarquía polimórfica a la que delega el objeto del contenedor.
Ejemplo
El patrón de
estado permite que un objeto cambie su comportamiento cuando cambia su estado
interno. Este patrón se puede observar en una máquina
expendedora. Las máquinas expendedoras tienen estados basados en el
inventario, la cantidad de moneda depositada, la capacidad de realizar cambios,
el artículo seleccionado, etc. Cuando se deposita la moneda y se realiza una
selección, una máquina expendedora entregará un producto y ningún cambio,
entregará un producto y cambio, no entregue ningún producto debido a una moneda
insuficiente en depósito, o no entregue ningún producto debido al agotamiento
del inventario.
Estrategia
Encapsula un algoritmo dentro de una clase.
- Defina una familia de algoritmos,
encapsule cada uno y hágalos intercambiables. La estrategia permite
que el algoritmo varíe independientemente de los clientes que lo usan.
- Capture la abstracción en una interfaz, entierre
los detalles de implementación en clases derivadas.
La entidad
de interfaz podría representar una clase base abstracta o las expectativas de
firma del método por parte del cliente. En el primer caso, la jerarquía de
herencia representa polimorfismo dinámico. En el último caso, la entidad
de interfaz representa el código de plantilla en el cliente y la jerarquía de
herencia representa el polimorfismo estático.
Ejemplo
Una
estrategia define un conjunto de algoritmos que se pueden usar indistintamente. Los
modos de transporte a un aeropuerto son un ejemplo de estrategia. Existen
varias opciones, como conducir el propio automóvil, tomar un taxi, un servicio
de transporte al aeropuerto, un autobús urbano o un servicio de limusina. Para
algunos aeropuertos, el metro y los helicópteros también están disponibles como
medio de transporte al aeropuerto. Cualquiera de estos modos de transporte
llevará al viajero al aeropuerto, y se pueden usar indistintamente. El
viajero debe elegir la Estrategia basada en compensaciones entre costo,
conveniencia y tiempo.
Método de plantilla
Aplaza los pasos exactos de un algoritmo a una subclase.
- Defina el esqueleto de un algoritmo en
una operación, difiriendo algunos pasos a las subclases de
clientes. El Método de plantilla permite que las subclases redefinan
ciertos pasos de un algoritmo sin cambiar la estructura del algoritmo.
- La clase base declara algoritmos
'marcadores de posición', y las clases derivadas implementan los
marcadores de posición.
La
implementación de
template_method()
es: llamada step_one()
,
llamada step_two()
y llamada step_three()
. step_two()
es
un método de "gancho": un marcador de posición. Se declara en la
clase base y luego se define en clases derivadas. Los marcos
(infraestructuras de reutilización a gran escala) utilizan mucho el Método de
plantilla. Todo el código reutilizable se define en las clases base del
marco, y luego los clientes del marco son libres de definir personalizaciones
creando clases derivadas según sea necesario.
Ejemplo
El Método de
plantilla define un esqueleto de un algoritmo en una operación y difiere
algunos pasos a subclases. Los constructores de viviendas usan el Método
de la Plantilla cuando desarrollan una nueva subdivisión. Una subdivisión
típica consiste en un número limitado de planos de planta con diferentes
variaciones disponibles para cada uno. Dentro de un plano de planta, los
cimientos, el entramado, la plomería y el cableado serán idénticos para cada
casa. La variación se introduce en las etapas posteriores de la
construcción para producir una variedad más amplia de modelos.
Otro
ejemplo: la rutina diaria de un trabajador.
Visitante
Define una nueva operación para una clase sin cambios.
- Representar una operación a realizar
sobre los elementos de una estructura de objeto. Visitor le permite
definir una nueva operación sin cambiar las clases de los elementos en los
que opera.
- La técnica clásica para recuperar
información de tipo perdido.
- Haz lo correcto según el tipo de dos
objetos.
- Doble despacho.
La jerarquía
de elementos está equipada con un "adaptador de método
universal". La implementación de
accept()
en cada clase
derivada de Element es siempre la misma. Pero, no se puede mover a la
clase base Elemento y heredarla todas las clases derivadas porque una
referencia a this
en la clase Elemento siempre se asigna al
tipo base Elemento.
Cuando se
invoca el
firstDispatch()
método polimórfico en un First
objeto abstracto ,
el tipo concreto de ese objeto se "recupera". Cuando se invoca
el secondDispatch()
método polimórfico en
un Second
objeto abstracto ,
su tipo concreto se "recupera". La funcionalidad de la
aplicación apropiada para este par de tipos ahora se puede ejercer.
Ejemplo
El patrón
Visitor representa una operación que se realizará en los elementos de una
estructura de objeto sin cambiar las clases en las que opera. Este patrón
se puede observar en la operación de una compañía de taxis. Cuando una
persona llama a una compañía de taxis (aceptando un visitante), la compañía
envía un taxi al cliente. Al entrar en el taxi, el cliente o visitante ya
no tiene el control de su propio transporte, el taxi (conductor) sí.
En el siguiente vídeo se explica un resumen del contenido de esta sección.
ResponderBorrarUstedes mencionan que debe emplearse TDD junto con el BDD para una mejor refactorización, de usarlos separados o con otros métodos, ¿el resultado final sería el mismo, ósea, tienen estos dos, una conexión obligatoria?
Lo esencial es usarlo, el BDD según Dan North se crea como respuesta para los problemas que surgían del TDD pero no es obligatorio usarlo, mas bien es decisión de cada desarrollador.
Borrar¿Como podría saber por cual patron debería irme si quisiera aplicarlo a un problema en particular?
ResponderBorrarLos patrones de comportamiento sirven para responder a distintos problemas de programación... depende de ese problema en particular para saber cual seria el indicado de usar
BorrarSabes que los TDD es una técnica que se apoya en 3 practica una de ellas es la refactorización, su objetivo principal es ofrecer una buena funcionabilidad y un código limpio diseñado a partir pruebas mi dudas es ¿ cuando aplicamos una buena practica que pasos debo considerar para realizar una refactorización y cual será su objetivo ?
ResponderBorrarLo ideal es hacer la refactorización sobre la marcha, según se va escribiendo código. Programar hasta que tiene hecha alguna parte del programa y se le hace una primera prueba, compilando y viendo que funciona. Luego seguir haciendo su programa, si consigue un trozo de código que se podría reaprovechar si estuviera separado en otra función o cualquier otra cosa que si estuviera hecha de otra forma, le facilitaría la tarea de seguir con su programa en ese momento se haría a refactorización recordando que el objetivo es reestructurar un código fuente, alterando su estructura interna sin cambiar su comportamiento externo.
BorrarUna ventaja de este tipo de practicas es que muchas veces son aplicables en cualquier lenguaje o fácilmente transpolables a los diferentes tipos existente.
ResponderBorrarGracias a el patron de comportamiento se puede saber como afectaría realizar ciertos cambios a algún proyecto, las consecuencias y el funcionamiento que puede llegar a tener este en un futuro, es importante tomar en cuenta todo estos patrones para tener una idea coherente con respecto a lo que se esta realizando al realizar determinados cambios.
ResponderBorrarSabemos que la identación o sangría como la definen acá es un estilo consistente que permite un programa sólido y eficiente. ¿Es obligatorio su implementación en algunos lenguajes de programación? De ser así ¿Pueden decir en cuáles?
ResponderBorrarEn ciertos lenguajes de programación como Haskell, Occam y Python, la sangría se utiliza para delimitar la estructura del programa permitiendo establecer bloques de código. Sin embargo son frecuentes discusiones entre programadores sobre cómo o dónde usar sangría, ya que cada programador tiene su propio estilo.
BorrarMuy interesante, creo que todos debemos saber que para ser un buen programador es necesario tener una buena organización ya que nos ayudará a que nuestros proyectos sean comprensibles, lógicos y que cada función, objeto y clase demuestre su propósito por si mismo, es decir, que ellos cuenten el porque fueron creados.
ResponderBorrar¿Que relación existe entre las buenas practicas con los patrones de comportamiento?
ResponderBorrarLos patrones de comportamiento, como los demás patrones de diseño se pueden considerar como buenas practicas de la programacion, solo que estas contienen un modelo que se debe seguir lo cual modifica tu código acuerdo al modelo de comportamiento, y las buenas practicas de un programador serian formas de como organizar, agilizar y mejorar su código al momento de hacerlo
BorrarLas buenas prácticas al igual que los patrones de comportamiento, son esenciales para presentar nuestra imagen como programadores. Estos brindan herramientas para ser un desarrollador destacado, ordenado y eficiente a la hora programar, por lo que hay que destacar su aplicación y sus beneficios.
ResponderBorrarEn la actualidad es más fácil aprender a programar por cuenta propia por la gran cantidad de información relacionada que encontramos en internet, pero estos aprendices solo quieren que su código funcione, es ahí donde los ingenieros debemos demostrar que la aplicación de éstas buenas prácticas y los patrones de diseño no solo hace que el software funcione correctamente, sino que son robustos, eficientes, y su código es legible y fácil de mantener.
ResponderBorrarUtilizar esta buenas practicas y otras nos garantizan un orden en la ejecución de nuestros proyectos ademas de que tendremos garantías de un desarrollo guiado y enmarcado dentro de las ciencias de la computacion.
ResponderBorrarSabemos que implementar las buenas practicas nos puede proporcionar un código limpio pero mi pregunta radica en que para obtener ese resultado ¿es necesario aplicar todas las practicas ya mencionadas o con utilizar una sola basta?
ResponderBorrarLa recomendación es aplicar la mayor cantidad posible ya que eso permitirá llevar a cabo de manera óptima el conjunto de actividades que comprenden el desarrollo de software.
BorrarLos patrones ayudan a estandarizar el código, haciendo que el diseño sea más comprensible para otros programadores. Son muy buenas herramientas, y como programadores , siempre deberíamos usar las mejores herramientas a nuestro alcance.
ResponderBorrarBásicamente se trata de escribir un código limpio, fácil de entender y fácil de mantener. Conocer todas estas prácticas y patrones jugaría un papel importante y representaría una habilidad más en el cinturón de herramientas de un programador ya que con el tiempo, desarrollará una intuición sobre cuándo aplicar cada una de estas.
ResponderBorrarCiertamente es conocido que las buenas práctica tienen el objetivo de proporcionar un código limpio, entre otros; pero las buenas pruebas pueden tener desventajas? Como por ejemplo, TDD puede tener desventajas? De ser así, usar SSOT puede ocasionar problemas?
ResponderBorrarLas buenas prácticas fueron diseñadas para brindar ventajas. Hubo sus excepciones como por ejemplo casos particulares con el TDD por los cuales se tuvo que diseñar el BDD y así aplicar ambas. Una en la implementación y la otra en prueba el comportamiento del código. Con respecto a los sistemas SSOT no ya que estos proporcionan datos que son auténticos, relevantes y referibles.
BorrarEl patrón de comportamiento Iterator se encuentra continuamente. Encaja muy bien con la idea de poder recorrer cosas como si fuesen secuencias, sin preocuparse de la estructura interna, y eso hace que sea especialmente útil para ese estilo funcional que cada vez se ve en más lenguajes. Es de gran utilidad saber que existen buenas prácticas que sirven de mucha ayuda.
ResponderBorrarBastante interesante el ejemplo de cadena de responsabilidad pero tengo una duda. ¿Cuándo no es recomendable usarla cadena de responsabilidad y que recomienda para usarla?
ResponderBorrarCuando cada solicitud sea manejada solo por un controlador o cuando el objeto del cliente sepa qué objeto de servicio debe manejar la solicitud. La recomendación es que debe asegúrese de que exista una red de seguridad para atrapar cualquier solicitud que no se maneje.
BorrarSe pueden desarrollar nuevos patrones de comportamiento?
ResponderBorrarMientras se sigan presentando particularidades a la hora de programar, vendrán desarrolladores a implementar técnicas de lógicas para terminar el trabajo que desean, y si lo mas seguro es que venga una persona y cree un patron que modele la forma agil y entendible para el resolver dicha particularidad, y cuando se presente un problema similar poder desarrollarlo de mas rapido
Borrar