domingo, 8 de diciembre de 2019

Otras Buenas Prácticas Y Patrones de Comportamiento

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

"Cuando todo lo demás falla, lea las instrucciones". - 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 thisen la clase Elemento siempre se asigna al tipo base Elemento.


Cuando se invoca el firstDispatch()método polimórfico en un Firstobjeto abstracto , el tipo concreto de ese objeto se "recupera". Cuando se invoca el secondDispatch() método polimórfico en un Secondobjeto 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.




27 comentarios:



  1. Ustedes 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?

    ResponderBorrar
    Respuestas
    1. 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
  2. ¿Como podría saber por cual patron debería irme si quisiera aplicarlo a un problema en particular?

    ResponderBorrar
    Respuestas
    1. Los 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

      Borrar
  3. Sabes 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 ?

    ResponderBorrar
    Respuestas
    1. Lo 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.

      Borrar
  4. Una ventaja de este tipo de practicas es que muchas veces son aplicables en cualquier lenguaje o fácilmente transpolables a los diferentes tipos existente.

    ResponderBorrar
  5. Gracias 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.

    ResponderBorrar
  6. Sabemos 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?

    ResponderBorrar
    Respuestas
    1. En 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.

      Borrar
  7. Muy 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
  8. ¿Que relación existe entre las buenas practicas con los patrones de comportamiento?

    ResponderBorrar
    Respuestas
    1. Los 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

      Borrar
  9. Las 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.

    ResponderBorrar
  10. En 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.

    ResponderBorrar
  11. Utilizar 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.

    ResponderBorrar
  12. Sabemos 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?

    ResponderBorrar
    Respuestas
    1. La 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.

      Borrar
  13. Los 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.

    ResponderBorrar
  14. Bá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.

    ResponderBorrar
  15. Ciertamente 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?

    ResponderBorrar
    Respuestas
    1. Las 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.

      Borrar
  16. El 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.

    ResponderBorrar
  17. Bastante 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?

    ResponderBorrar
    Respuestas
    1. Cuando 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.

      Borrar
  18. Se pueden desarrollar nuevos patrones de comportamiento?

    ResponderBorrar
    Respuestas
    1. Mientras 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