Le livre "Modèles de conception orientée objet"

imageBonjour, habrozhiteli! Plus de 25 ans se sont écoulés depuis le premier tirage de Design Patterns. Pendant ce temps, le livre du populaire s'est transformé en culte. Partout dans le monde, il est recommandé de le lire à quiconque souhaite connecter la vie aux technologies de l'information et à la programmation. La langue "russe" utilisée par les informaticiens a changé, de nombreux termes anglais sont devenus familiers, des modèles sont entrés dans nos vies.

Voici une édition anniversaire avec une traduction mise à jour du livre, qui est devenue une lecture incontournable pour chaque programmeur. «Patterns of Object-Oriented Design» a remplacé les «Techniques of Object-Oriented Design».

Quatre développeurs de premier ordre - un groupe de quatre - portent à votre attention l'expérience de la POO sous la forme de vingt-trois modèles. Des modèles sont apparus parce que les développeurs cherchaient des moyens d'augmenter la flexibilité et le degré de réutilisation de leurs programmes. Les auteurs fournissent non seulement des principes pour l'utilisation des modèles de conception, mais systématisent également les informations. Vous apprendrez le rôle des patterns dans l'architecture de systèmes complexes et serez capable de créer rapidement et efficacement vos propres applications, en tenant compte de toutes les restrictions qui surviennent lors du développement de grands projets. Tous les modèles sont tirés de systèmes réels et basés sur des pratiques réelles. Le code C ++ ou Smalltalk est affiché pour chaque modèle, démontrant ses capacités.

Préface


Le livre décrit des solutions simples et élégantes aux problèmes typiques qui se posent dans la conception orientée objet.

Des modèles sont apparus parce que de nombreux développeurs cherchaient des moyens d'augmenter la flexibilité et le degré de réutilisation de leurs programmes. Les solutions trouvées se présentent sous une forme concise et facilement réalisable. The Gang of Four explique chaque modèle avec un exemple simple dans un langage clair et compréhensible. L'utilisation de modèles dans le développement de systèmes logiciels permet au concepteur d'accéder à un niveau supérieur de développement de projet. L'architecte et le programmeur peuvent désormais fonctionner avec des noms figuratifs de motifs et communiquer dans une seule langue.

Ainsi, le livre résout deux problèmes.

Premièrement, il présente le rôle des modèles dans la création de l'architecture de systèmes complexes.

Deuxièmement, il permet aux concepteurs de développer facilement leurs propres applications en utilisant les modèles contenus dans le manuel.

Qu'est-ce qui a changé dans l'édition 2020?

  • La terminologie a été mise à jour (par exemple, le terme "refactoring" a déjà pris racine pour la "réorganisation" du code, pour le partage - "partage" au lieu de "séparation", et pour mixin - "mélange");
  • style mis à jour;
  • les mots inutilement volumineux ont été éliminés (par exemple, «spécification» ou «instanciation». Le premier peut être assez adéquatement remplacé par «définition», le second par «créer une instance»);
  • le livre est enfin appelé «Modèles de conception orientés objet».

PROCÉDÉ DE MODÈLE DE MODÈLE (PROCÉDÉ DE MODÈLE)


Le nom et la classification du modèle La

méthode du modèle est le modèle du comportement de classe.

Objectif La

méthode du modèle définit la base de l'algorithme et permet aux sous-classes de redéfinir certaines étapes de l'algorithme sans changer sa structure dans son ensemble.

Motivation

Considérons le cadre d'application, qui comprend les classes Application et Document. La classe Application est responsable de l'ouverture des documents existants stockés dans un format externe (par exemple, dans un fichier). Un objet de la classe Document représente les informations du document après l'avoir lu dans un fichier.

Les applications construites sur la base de ce cadre peuvent générer des sous-classes des classes Application et Document qui répondent à des besoins spécifiques.

Par exemple, un éditeur graphique définit des sous-classes de DrawApplication et DrawDocument, et une feuille de calcul définit des sous-classes de SpreadsheetApplication et SpreadsheetDocument.

image

La classe abstraite Application définit un algorithme pour ouvrir et lire un document dans l'opération 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();
      }
}

L'opération OpenDocument définit toutes les étapes d'ouverture d'un document. Il vérifie s'il est possible d'ouvrir le document, crée un objet de la classe Document, l'ajoute à l'ensemble de documents et lit le document à partir du fichier.

Une opération du formulaire OpenDocument sera appelée méthode modèle qui décrit l'algorithme dans les catégories d'opérations abstraites qui sont remplacées dans des sous-classes pour obtenir le comportement souhaité. Les sous-classes de la classe Application vérifient qu'elles peuvent s'ouvrir (CanOpenDocument) et créer un document (DoCreateDocument). Les sous-classes de la classe Document lisent le document (DoRead). La méthode du modèle définit également une opération qui permet aux sous-classes d'application d'obtenir des informations sur l'ouverture d'un document (AboutToOpenDocument).

Définissant certaines étapes de l'algorithme à l'aide d'opérations abstraites, la méthode du modèle capture leur séquence, mais permet leur implémentation dans des sous-classes des classes Application et Document.

Applicabilité

Conditions de base pour appliquer la méthode du modèle de modèle:

  • une utilisation unique des parties invariantes de l'algorithme, tandis que la mise en œuvre du changement de comportement reste à la discrétion des sous-classes;
  • la nécessité d'isoler et de localiser dans une classe le comportement commun à toutes les sous-classes afin d'éviter la duplication de code. Ceci est un bon exemple de la technique du «bracketing pour généraliser» décrite par William Opdyke et Ralph Johnson [OJ93]. Tout d'abord, des différences dans le code existant sont révélées, qui sont ensuite transférées à des opérations distinctes. En fin de compte, les différents fragments de code sont remplacés par une méthode de modèle à partir de laquelle de nouvelles opérations sont appelées;
  • gestion des extensions de sous-classe. La méthode du modèle peut être définie de manière à déclencher des hooks - voir la section Résultats - à des points spécifiques, permettant ainsi l'expansion uniquement à ces points.

Structure

image

Participants

AbstractClass (Application) - classe abstraite:

  • définit des opérations primitives abstraites qui sont remplacées dans des sous-classes spécifiques pour implémenter les étapes de l'algorithme;
  • implémente une méthode de modèle qui définit le squelette d'un algorithme. La méthode modèle appelle des opérations primitives, ainsi que des opérations définies dans la classe AbstractClass ou dans d'autres objets;

ConcreteClass (MyApplication) - classe spécifique:

  • implémente des opérations primitives qui exécutent les étapes de l'algorithme d'une manière qui dépend de la sous-classe.

La relation

ConcreteClass suppose que les étapes invariantes de l'algorithme seront exécutées dans AbstractClass.

Résultats

Les méthodes de modèle sont l'une des techniques fondamentales de réutilisation du code. Ils jouent un rôle particulièrement important dans les bibliothèques de classes, car ils permettent de mettre en évidence un comportement commun dans les classes de bibliothèque.

Les méthodes de modèle conduisent à une structure de code inversée, qui est parfois appelée le principe Hollywood, impliquant la phrase «Ne nous appelez pas, nous vous appellerons» souvent utilisée dans cet empire du film [Swe85]. Dans ce cas, cela signifie que la classe parente appelle des opérations de sous-classe, et non l'inverse.

Les méthodes de modèle appellent des opérations des types suivants:

  • opérations spécifiques (soit de la classe ConcreteClass, soit des classes client);
  • des opérations spécifiques de la classe AbstractClass (c'est-à-dire des opérations utiles à toutes les sous-classes);
  • opérations primitives (c'est-à-dire opérations abstraites);
  • méthodes d'usine (voir modèle de méthode d'usine (135));
  • opérations de hook qui implémentent un comportement par défaut qui peut être étendu dans des sous-classes. Souvent, une telle opération par défaut ne fait rien.

Il est important que les opérations de modèle distinguent clairement les opérations de hook (qui peuvent être remplacées) et les opérations abstraites (qui doivent être remplacées). Pour réutiliser une classe abstraite avec une efficacité maximale, les auteurs de sous-classes doivent comprendre quelles opérations doivent être remplacées.

Une sous-classe peut étendre le comportement d'une opération en la remplaçant et en invoquant explicitement l'opération à partir de la classe parente:

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

Malheureusement, il est très facile d'oublier la nécessité d'invoquer une opération héritée. Une telle opération peut être transformée en une méthode standard pour donner au parent le contrôle sur la façon dont les sous-classes l'étendent. L'idée est d'appeler une opération de hook à partir d'une méthode de modèle dans la classe parente. Les sous-classes pourront alors redéfinir exactement cette opération:

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

Dans la classe parent ParentClass, l'opération HookOperation ne fait rien:

void ParentClass::HookOperation () { }

Les sous-classes remplacent HookOperation pour étendre leur comportement:

void DerivedClass::HookOperation () {
   //    
}

Implémentation

Lors de l'implémentation d'une méthode de modèle de modèle, vous devez prêter attention aux aspects suivants:

  • C++. , , . , . , , . , -;
  • . , . , ;
  • convention de dénomination. Vous pouvez mettre en évidence les opérations à remplacer en ajoutant un préfixe à leurs noms. Par exemple, dans le cadre MacApp pour les applications Macintosh [App89], les noms de méthode de modèle commencent par le préfixe Do: DoCreateDocument, DoRead, etc.

Exemple de code

L' exemple C ++ suivant montre comment une classe parente peut imposer un invariant à ses sous-classes. Un exemple est tiré de la bibliothèque NeXT AppKit [Add94]. Considérez la classe View, qui prend en charge le dessin à l'écran, une sorte d'invariant, qui consiste en ce que les sous-classes ne peuvent changer la vue que lorsqu'elle est mise au point. Cela nécessite qu'un contexte de dessin spécifique soit défini (par exemple, les couleurs et les polices).

Vous pouvez utiliser la méthode Display du modèle pour définir l'état. La classe View définit deux opérations spécifiques (SetFocus et ResetFocus), qui définissent et réinitialisent respectivement le contexte du dessin. L'opération de point de vue de la classe View effectue le dessin lui-même. Display appelle SetFocus avant DoDisplay pour préparer le contexte, et ResetFocus après DoDisplay pour le réinitialiser:

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

Afin de prendre en charge l'invariant, les clients de classe View appellent toujours Display et les sous-classes View remplacent toujours DoDisplay.

Dans la classe View, l'opération DoDisplay ne fait rien:

void View::DoDisplay () { }

Les sous-classes le remplacent pour ajouter leur comportement de dessin spécifique:

void MyView::DoDisplay () {
      //   
}

Les

méthodes de modèle d' applications connues sont si fondamentales qu'elles se retrouvent dans presque toutes les classes abstraites. Rebecca Wirfs-Brock et al. [WBWW90, WBJ90] discutent en détail des méthodes de modèle.

Modèles associés Les

méthodes d'usine (135) sont souvent appelées à partir de méthodes passe-partout. Dans l'exemple de la section Motivation, la méthode du modèle OpenDocument appelée la méthode DoCreateDocument d'usine.
Stratégie (362): les méthodes de modèle utilisent l'héritage pour modifier une partie de l'algorithme. Les stratégies utilisent la délégation pour modifier l'algorithme dans son ensemble.

»Vous trouverez plus d'informations sur le livre sur le site Web de l'éditeur
» Table des matières
» Extrait

pour Khabrozhiteley 25% de réduction sur le coupon - POO

Lors du paiement de la version papier du livre, un livre électronique est envoyé par e-mail.

All Articles