[RUBY] Lire le «Guide pratique de conception orientée objet»

Déclaration de détermination

Je veux le lire petit à petit pendant un mois ou deux. Ceci est mon propre mémo.

Le point

Vue d'ensemble et introduction de la programmation orientée objet

1. Conception orientée objet

1.1 Éloge du design

1.2 Outils de conception

1.3 Acte de conception

1.4 Introduction facile de la programmation orientée objet

Focus sur la classe

2. Concevoir une classe de responsabilité unique

2.1 Décidez de ce qui appartient à la classe

2.2 Créer une classe avec une seule responsabilité

2.3 Écrire un code qui accueille les changements

3. Gérer les dépendances

--Types de comportement d'objet

  1. Comportement que la classe elle-même devrait implémenter indépendamment
  2. Héritage du comportement
  3. Le comportement est implémenté dans d'autres objets

3-1. Comprendre les dépendances

  1. Noms d'autres classes
  2. Le nom du message envoyé à d'autres objets que «self»
  3. Arguments requis par le message
  4. Ordre de ces arguments

3-2. Ecrire du code faiblement couplé

  1. Lorsqu'il y a des noms d'autres classes --Injection d'objets dépendants
  1. Lorsqu'un message autre que «soi» est envoyé
  1. Lorsqu'il y a des arguments demandés par le message --Recevoir le hachage de l'option --Toutes les dépendances sur l'ordre des arguments sont supprimées.
  1. Lorsque l'ordre des arguments est fixe (lorsque la méthode qui doit dépendre est externe, etc.) --Appuyez sur une méthode pour boucler l'interface externe. --Créez un module Wrapper (=" usine "). --Un objet dont le but est de créer d'autres objets

3-3. Gestion de la direction des dépendances

  1. Certaines classes ont des exigences plus variables que d'autres --Cadre avec développement actif, etc.
  2. Les classes concrètes sont plus susceptibles de changer que les classes abstraites --Injection d'objets dépendants, etc.
  1. Le changement de classes dépendantes depuis de nombreux endroits a un impact considérable

«La clé de la maintenance est de contrôler le sens de la dépendance et de s'appuyer sur une classe qui change moins que vous.

De la conception centrée sur l'objet à la conception centrée sur le message

4. Créez une interface flexible

4-1. Comprendre l'interface

4-2. Définir l'interface

--Caractéristiques de l'interface publique

  1. Clarifier les principales responsabilités de la classe
  2. Devrait être exécuté de l'extérieur
  3. Pas changé sur un coup de tête
  4. Sûr pour que les autres en dépendent
  5. Entièrement documenté dans le test

--Caractéristiques de l'interface privée

  1. Impliquez-vous dans les détails de mise en œuvre
  2. Ne devrait pas provenir d'autres objets
  3. Peut être changé pour n'importe quelle raison
  4. Il est dangereux pour les autres d'en dépendre
  5. Ne peut pas être mentionné dans le test

4-3. Trouver une interface publique

--Utiliser un diagramme de séquence ―― Révélez l'échange de messages (interface publique) entre les classes et demandez: "Ce destinataire devrait-il être responsable de répondre à ce message?" --Classes et qui et ce qu'ils savent => Décidez d'un message et où l'envoyer

--Découvrir le besoin de nouveaux objets

4-4. Écrivez le code qui expose le meilleur côté (interface)

―― L'interface définit l'application et détermine l'avenir.

  1. Identifier explicitement comme interface publique
  2. «Quoi» est plus que «comment»
  3. Le nom est immuable pour autant que l'on puisse penser
  4. Prenez un hachage comme argument facultatif

--Ruby public, protected, private mots-clés ―― En utilisant ces mots-clés, vous pouvez transmettre les deux choses suivantes. «Je crois que j'ai maintenant de meilleures informations que les informations dont disposent les" futurs "programmeurs. «Je crois que nous devons empêcher les futurs programmeurs d'utiliser par inadvertance des méthodes que nous considérons instables. ―― Un certain nombre de programmeurs Ruby très talentueux osent omettre les mots-clés.

4-5. Loi de Déméter

5. Réduisez les coûts avec la saisie de canard

―― Qu'est-ce que le "typage canard"?

5-1. Comprendre la saisie du canard

Polymorphisme

--Une grande variété d'objets se réfèrent également à la capacité de répondre aux messages.

5-2. Écrivez un code qui fait confiance à Duck

  1. Une instruction de cas qui se branche dans une classe
  2. kind_of? Et is_a? 3. responds_to?

5-3. Surmontez la peur de taper du canard

--Comparaison du typage dynamique et statique

6. Acquérir un comportement par héritage

6-1. Comprendre l'héritage de classe

6-2. Identifier où l'héritage doit être utilisé

6-3. Application incorrecte de l'héritage

6-4. Trouvez le résumé

  1. L'objet modélisé a une "relation de généralisation-spécialisation"
  2. Utilisez la bonne technique de codage -Faire une superclasse abstraite

6-5. Gérer le degré de connectivité entre les superclasses et les sous-classes

--Utilisez les messages hook pour coupler de manière lâche des sous-classes.

7. Partager le comportement des rôles dans les modules

7-1. Comprendre les rôles

--Lorsque des objets non liés à l'origine jouent un rôle commun, les objets deviennent liés les uns aux autres. Le type de canard est un rouleau.

--Lors de l'inclusion de plusieurs modules dans une classe, la méthode du dernier module inclus arrive au début du chemin de recherche de méthode.

7-2. Ecrire du code héritable

--Anti-motif

  1. Un modèle dans lequel un objet utilise des noms de variables tels que «type» et «catégorie» pour déterminer le message à envoyer à lui-même.
  1. Un modèle dans lequel l'objet décide quel message envoyer après avoir vérifié la classe de l'objet qui reçoit le message.

--Il ne doit y avoir aucune sous-classe dans la superclasse abstraite qui n'utilise pas de code. ――Si vous ne pouvez pas restreindre l'abstrait à un correctement, ou s'il n'y a pas de code commun pouvant être abstrait, l'héritage ne peut pas résoudre le problème de conception.

Principe de remplacement de Riskov

--Utilisez le modèle de méthode de modèle

8. Combinez des objets dans la composition

8-1. Composez le vélo à partir des pièces

--Having the relation "Bicycle has-a Parts" = Composition --Créez une classe Parts abstraite.

8-2. Objet Compose Parts

8-3. Fabrication de pièces

-"Usine" --Un objet qui crée d'autres objets.

8-4. Bicyclette composée

--Les pièces jouent le rôle de pièces --OpenStruct prend le rôle de Part, qui implémente le nom, la description, les besoins_spare.

Agrégation - une composition spéciale

――Qu'est-ce que la composition? --Deux objets ont une relation "has-a" --Choses que l'objet contenu ne peut pas exister indépendamment de l'objet contenu ――Exemple: un plat a un apéritif, mais une fois que le plat est mangé, l'apéritif disparaît également. ―― Qu'est-ce que l'agrégation?

8-5. Choix de composition et d'héritage

—— Les compositions ont beaucoup moins de dépendances que les héritages, donc hiérarchisez les compositions.

--Avantages de l'héritage --VRAI. --Open / Closed (Ouvert pour les extensions, fermé pour les correctifs)

--Avantages de la composition

--is-a Utiliser l'héritage pour les relations

--Behaves-like-a Utiliser le type de canard pour les relations

--has-a Utiliser la composition pour les relations -Lorsque de nombreux objets contiennent plusieurs parties et que la somme de ces objets dépasse la somme de ces parties.

Conception des tests

9. Concevoir des tests rentables

――Trois compétences sont indispensables pour pratiquer le code modifiable.

  1. Compréhension de la conception orientée objet.
  2. Bonne refactorisation de code. ――La refactorisation désigne le travail d'amélioration de la structure interne tout en conservant le comportement externe du logiciel.
  3. Capacité à rédiger des tests de grande valeur.

9-1. Test intentionnel

9-2. Tester les messages entrants

9-3. Tester les méthodes privées

9-4. Tester les messages sortants

9-5. Testez le type de canard

9-6. Tester le code hérité

Recommended Posts

Lire le «Guide pratique de conception orientée objet»
J'ai lu le "Guide pratique orienté objet", donc un mémorandum