El libro "Patrones de diseño orientado a objetos"

imagenHola habrozhiteli! Han pasado más de 25 años desde la primera impresión de Patrones de diseño. Durante este tiempo, el libro del popular se convirtió en un culto. En todo el mundo se recomienda leerlo a cualquiera que quiera conectar la vida con la tecnología de la información y la programación. El idioma "ruso" utilizado por las personas de TI ha cambiado, muchos términos en inglés se han vuelto familiares, los patrones han entrado en nuestras vidas.

Aquí hay una edición de aniversario con una traducción actualizada del libro, que se ha convertido en una lectura obligada para cada programador. Los "Patrones de diseño orientado a objetos" reemplazaron a las "Técnicas de diseño orientado a objetos".

Cuatro desarrolladores de primera clase, una pandilla de cuatro, le llaman la atención sobre la experiencia de OOP en forma de veintitrés patrones. Los patrones aparecieron porque los desarrolladores estaban buscando formas de aumentar la flexibilidad y el grado de reutilización de sus programas. Los autores no solo proporcionan principios para usar patrones de diseño, sino que también sistematizan la información. Aprenderá sobre el papel de los patrones en la arquitectura de sistemas complejos y podrá crear sus propias aplicaciones de manera rápida y eficiente, teniendo en cuenta todas las restricciones que surgen al desarrollar grandes proyectos. Todas las plantillas se toman de sistemas reales y se basan en la práctica real. Se muestra el código C ++ o Smalltalk para cada patrón, lo que demuestra sus capacidades.

Prefacio


El libro describe soluciones simples y elegantes a problemas típicos que surgen en el diseño orientado a objetos.

Los patrones aparecieron porque muchos desarrolladores estaban buscando formas de aumentar la flexibilidad y el grado de reutilización de sus programas. Las soluciones encontradas se materializan en una forma concisa y fácilmente practicable. The Gang of Four explica cada patrón con un ejemplo simple en un lenguaje claro y comprensible. El uso de patrones en el desarrollo de sistemas de software permite al diseñador pasar a un nivel superior de desarrollo de proyectos. Ahora el arquitecto y el programador pueden operar con nombres figurativos de patrones y comunicarse en un idioma.

Así, el libro resuelve dos problemas.

Primero, introduce el papel de los patrones en la creación de la arquitectura de sistemas complejos.

En segundo lugar, permite a los diseñadores desarrollar fácilmente sus propias aplicaciones utilizando los patrones contenidos en el manual.

¿Qué ha cambiado en la edición 2020?

  • La terminología se ha actualizado (por ejemplo, el término "refactorización" ya se ha enraizado para la "reorganización" del código, para el recurso compartido es "compartir" en lugar de "separación", y para mezclar es "mezcla");
  • estilo actualizado;
  • se han eliminado palabras innecesariamente voluminosas (por ejemplo, "especificación" o "creación de instancias"). La primera puede reemplazarse de manera bastante adecuada con "definición", la segunda con "crear una instancia");
  • el libro finalmente se llama "Patrones de diseño orientado a objetos".

MÉTODO DE PLANTILLA DE PATRÓN (MÉTODO DE PLANTILLA)


El nombre y la clasificación del patrón El

método de la plantilla es el patrón del comportamiento de la clase.

Propósito El

método de plantilla define la base del algoritmo y permite que las subclases redefinan algunos pasos del algoritmo sin cambiar su estructura como un todo.

Motivación

Considere el marco de la aplicación, que tiene las clases Aplicación y Documento. La clase de aplicación es responsable de abrir los documentos existentes almacenados en un formato externo (por ejemplo, en un archivo). Un objeto de la clase Documento representa información del documento después de leerlo desde un archivo.

Las aplicaciones creadas sobre la base de este marco pueden generar subclases de las clases Aplicación y Documento que satisfacen necesidades específicas.

Por ejemplo, un editor gráfico define subclases de DrawApplication y DrawDocument, y una hoja de cálculo define subclases de SpreadsheetApplication y SpreadsheetDocument.

imagen

La aplicación de clase abstracta define un algoritmo para abrir y leer un documento en la operación OpenDocument:

void Application::OpenDocument (const char* name) {
      if (!CanOpenDocument(name)) {
          //   
          return;
      }

      Document* doc = DoCreateDocument();

      if (doc) {
          _docs->AddDocument(doc);
          AboutToOpenDocument(doc);
          doc->Open();
          doc->DoRead();
      }
}

La operación OpenDocument define todos los pasos para abrir un documento. Comprueba si es posible abrir el documento, crea un objeto de la clase Documento, lo agrega al conjunto de documentos y lee el documento del archivo.

Una operación del formulario OpenDocument se denominará un método de plantilla que describe el algoritmo en las categorías de operaciones abstractas que se reemplazan en subclases para obtener el comportamiento deseado. Las subclases de la clase Aplicación verifican que pueden abrirse (CanOpenDocument) y crear un documento (DoCreateDocument). Las subclases de la clase Document leen el documento (DoRead). El método de plantilla también define una operación que permite que las subclases de la aplicación obtengan información de que un documento está por abrirse (AboutToOpenDocument).

Al definir algunos pasos del algoritmo utilizando operaciones abstractas, el método de plantilla captura su secuencia, pero permite que se implementen en subclases de las clases Aplicación y Documento.

Aplicabilidad

Condiciones básicas para aplicar el método de plantilla de patrón:

  • un solo uso de las partes invariantes del algoritmo, mientras que la implementación del comportamiento cambiante queda a discreción de las subclases;
  • La necesidad de aislar y localizar en una clase el comportamiento común a todas las subclases para evitar la duplicación de código. Este es un buen ejemplo de la técnica de "horquillado para generalizar" descrita por William Opdyke y Ralph Johnson [OJ93]. Primero, se revelan las diferencias en el código existente, que luego se transfieren a operaciones separadas. Finalmente, los diferentes fragmentos de código se reemplazan por el método de plantilla desde el que se llaman las nuevas operaciones;
  • Gestión de extensiones de subclase. El método de la plantilla se puede definir de modo que active ganchos (consulte la sección Resultados) en puntos específicos, permitiendo así la expansión solo en estos puntos.

Estructura

imagen

Participantes

AbstractClass (Aplicación) - clase abstracta:

  • define operaciones primitivas abstractas que se reemplazan en subclases específicas para implementar los pasos del algoritmo;
  • implementa un método de plantilla que define el esqueleto de un algoritmo. El método de plantilla llama operaciones primitivas, así como operaciones definidas en la clase AbstractClass o en otros objetos;

ConcreteClass (MyApplication) - clase específica:

  • implementa operaciones primitivas que realizan los pasos del algoritmo de una manera que depende de la subclase.

La relación

ConcreteClass supone que los pasos invariables del algoritmo se realizarán en AbstractClass.

Los

métodos de plantilla de resultados son una de las técnicas fundamentales para reutilizar código. Desempeñan un papel particularmente importante en las bibliotecas de clases, ya que brindan la capacidad de mostrar un comportamiento común en las clases de la biblioteca.

Los métodos de plantilla conducen a una estructura de código invertida, que a veces se llama el principio de Hollywood, lo que implica la frase "No nos llames, te llamaremos" que se usa a menudo en este imperio cinematográfico [Swe85]. En este caso, esto significa que la clase padre invoca operaciones de subclase, y no al revés.

Los métodos de plantilla llaman operaciones de los siguientes tipos:

  • operaciones específicas (ya sea de la clase ConcreteClass o de las clases del cliente);
  • operaciones específicas de la clase AbstractClass (es decir, operaciones útiles para todas las subclases);
  • operaciones primitivas (es decir, operaciones abstractas);
  • métodos de fábrica (ver patrón de método de fábrica (135));
  • operaciones de enlace que implementan un comportamiento predeterminado que se puede extender en subclases. A menudo, tal operación predeterminada no hace nada.

Es importante que las operaciones de plantilla distingan claramente entre las operaciones de enlace (que se pueden reemplazar) y las operaciones abstractas (que se deben reemplazar). Para reutilizar una clase abstracta con la máxima eficiencia, los autores de las subclases deben comprender qué operaciones están destinadas a ser reemplazadas.

Una subclase puede extender el comportamiento de una operación al reemplazarla e invocar explícitamente la operación desde la clase padre:

void DerivedClass::Operation () {
      //   DerivedClass
      ParentClass::Operation();
}

Desafortunadamente, es muy fácil olvidarse de la necesidad de invocar una operación heredada. Dicha operación se puede transformar en un método repetitivo para dar al padre control sobre cómo las subclases lo extienden. La idea es invocar una operación de enlace desde un método de plantilla en la clase primaria. Luego, las subclases podrán redefinir exactamente esta operación:

void ParentClass::Operation () {
      //  ParentClass
      HookOperation();
}

En la clase primaria ParentClass, la operación HookOperation no hace nada:

void ParentClass::HookOperation () { }

Las subclases anulan HookOperation para extender su comportamiento:

void DerivedClass::HookOperation () {
   //    
}

Implementación

Al implementar un método de plantilla de patrón, debe prestar atención a los siguientes aspectos:

  • C++. , , . , . , , . , -;
  • . , . , ;
  • convenio de denominación. Puede resaltar las operaciones que deben reemplazarse agregando un prefijo a sus nombres. Por ejemplo, en el marco MacApp para aplicaciones Macintosh [App89], los nombres de los métodos de plantilla comienzan con el prefijo Do: DoCreateDocument, DoRead, etc.

Ejemplo de código

El siguiente ejemplo de C ++ muestra cómo una clase padre puede imponer una invariante en sus subclases. Se toma un ejemplo de la biblioteca NeXT AppKit [Add94]. Considere la clase Vista, que admite el dibujo en la pantalla, una especie de invariante, que consiste en el hecho de que las subclases pueden cambiar la vista solo cuando está enfocada. Esto requiere que se establezca un contexto de dibujo específico (por ejemplo, colores y fuentes).

Puede usar el método de visualización de plantilla para establecer el estado. La clase View define dos operaciones específicas (SetFocus y ResetFocus), que establecen y restablecen respectivamente el contexto de dibujo. La operación de enlace Ver de la clase Ver realiza el dibujo en sí. Visualice las llamadas SetFocus antes de DoDisplay para preparar el contexto y ResetFocus después de DoDisplay para restablecerlo:

void View::Display () {
      SetFocus();
      DoDisplay();
      ResetFocus();
}

Para admitir lo invariante, los clientes de la clase View siempre llaman a Display, y las subclases View siempre reemplazan a DoDisplay.

En la clase View, la operación DoDisplay no hace nada:

void View::DoDisplay () { }

Las subclases lo anulan para agregar su comportamiento de dibujo específico:

void MyView::DoDisplay () {
      //   
}

Las aplicaciones conocidas Los

métodos de plantilla son tan fundamentales que se encuentran en casi todas las clases abstractas. Rebecca Wirfs-Brock et al. [WBWW90, WBJ90] discuten los métodos de plantilla en detalle.

Patrones relacionados

Los métodos de fábrica (135) a menudo se llaman desde métodos repetitivos. En el ejemplo de la sección Motivación, el método de plantilla OpenDocument se llama el método de fábrica DoCreateDocument.
Estrategia (362): los métodos de plantilla utilizan la herencia para modificar parte del algoritmo. Las estrategias utilizan la delegación para modificar el algoritmo en su conjunto.

»Se puede encontrar más información sobre el libro en el sitio web del editor
» Tabla de contenido
» Extracto de

Khabrozhiteley Cupón de 25% de descuento - OOP

Tras el pago de la versión en papel del libro, se envía un libro electrónico por correo electrónico.

All Articles