[JAVA] Haben Sie jemals über die Definition von "schlechtem Design" nachgedacht?

DDD serialisierter Artikel

Einführung

Ich denke, dass es jeden Tag verschiedene Diskussionen über das Gute und das Schlechte von Design gibt, aber gibt es eine klare Definition von "gutem Design" und "schlechtem Design"? Obwohl es in den Gedanken jeder Person vage oder fragmentarisch ist, scheint es im Team nicht viele Definitionen von gut oder schlecht zu geben.

Ich denke, es lohnt sich, in jedem Projekt zu diskutieren, aber ich denke, es ist einfacher zu diskutieren, ob es einen Standard gibt. Schauen wir uns also eine der Definitionen von "schlechtem Design" an, die von Robert Cecil Martin, alias Onkel Bob, vorgeschlagen wurden, der das Prinzip der Objektorientierung befürwortete.

Über Onkel Bob

Vorher möchte ich Onkel Bob vorstellen.

Robert Cecil Martin(wikipedia)

Der Autor des berühmten "sauberen Codes" ist leicht zu verstehen. Darüber hinaus ist er Verfechter des SOLID-Prinzips, eines objektorientierten Entwurfsprinzips, und Mitautor der Erklärung zur agilen Softwareentwicklung. Die Auswirkungen auf die Softwareindustrie sind unermesslich.

(Nebenbei habe ich es in [Was ist die einfachste Architektur, um mit der Implementierung mit domänengesteuertem Design zu beginnen] eingeführt (http://little-hands.hatenablog.com/entry/2017/10/04/231743) Dies ist auch der Befürworter der Anwendungsarchitektur "Clean Architecture". Die Site, die betrieben wird, wird auch als Clean Coder bezeichnet, und wir sind besonders über den Namen clean informiert. Es scheint, dass es das gibt. Es scheint, dass es von hier war, als ich mich fragte, woher das "Sauber" der sauberen Architektur kam.)

Original

Der Originaltext, auf den dieses Mal verwiesen wird, befindet sich weiter auf der Seite The Principles of OOD der Old UncleBob Site. , Artikel des Abhängigkeitsinversionsprinzips. Dies ist ein Zitat und eine Zusammenfassung des Inhalts.

Was ist "schlechtes Design"?

Ein Design mit den folgenden drei Eigenschaften, auf die sich alle Ingenieure einigen können, wird als "schlechtes Design" bezeichnet.

  1. Rigidity :
    It is hard to change because every change affects too many other parts of the system.
  1. Fragility:
    When you make a change, unexpected parts of the system break.
  2. Immobility:
    It is hard to reuse in another application because it cannot be disentangled from the current application.

Übersetzen Sie es ins Japanische und schreiben Sie dann eine Teilübersetzung und eine Zusammenfassung der danach beschriebenen Details.

1. Starrheit:

Es ist schwierig zu ändern, da jede Änderung viele andere Teile des Systems betrifft.

Die Ursache ist, dass Sie für eine Änderung eine Änderungskette an den abhängigen Modulen vornehmen müssen.
Wenn der Designer nicht vorhersagen kann, inwieweit Änderungen vorgenommen werden müssen, sind die Auswirkungen und Kosten unvorhersehbar. Die Behörden lehnen es dann ab, Änderungen zu genehmigen, was einen starren Druck auf sie ausübt.

Gegenmaßnahmen Möglicherweise haben Sie gesagt: "Reduzieren Sie die Anzahl der abhängigen Module" und "Machen Sie die abhängigen Module logisch ableitbar".

Eine kontrastierende Eigenschaft ist Flexibilität.

2. Zerbrechlichkeit:

Durch Änderungen werden unerwartete Teile des Systems beschädigt.

Oft können Änderungen neue Probleme in Bereichen verursachen, die konzeptionell nicht relevant sind. Dies führt dazu, dass das Wartungsteam weniger zuverlässig ist. Je weiter Sie sich weiterentwickeln, desto mehr Probleme treten an Stellen auf, die irrelevant erscheinen, und jedes Mal, wenn Sie eine Korrektur vornehmen, treten weitere Probleme auf ... und der Arbeitsaufwand für die Wartung nimmt weiter zu.

Sie können sich die Gegenmaßnahmen so vorstellen, dass sie "nur von den konzeptionell verwandten Modulen abhängen" und "innerhalb des Bereichs, in dem die abhängigen Module logisch abgeleitet werden können", wie in 1.

Eine kontrastierende Eigenschaft ist Robustheit.

3. Unbeweglichkeit:

Stark mit der aktuellen Anwendung gekoppelt und in einer anderen Anwendung schwer wiederzuverwenden.

Wenn ein Teil einer Implementierung stark von etwas Geschäftsspezifischem abhängt, ist die Wiederverwendbarkeit dieser Implementierung gering. Wenn Designer die Wiederverwendung von Implementierungen untersuchen, stellen sie fest, dass zum Trennen und Wiederverwenden von Modulen viel Arbeit erforderlich ist, und geben in vielen Fällen die Wiederverwendung auf.

Erhöht die Gegenmaßnahme "den Kohäsionsgrad des Moduls"?

Eine kontrastierende Eigenschaft ist die Wiederverwendbarkeit.

Zusammenfassung

Was denken Sie. Es kann leichter vorstellbar sein, "von innen nach außen aus der Definition von schlechtem Design" zu denken, als "Definition von gutem Design".

Es kann auch als Grundlage verwendet werden, um Ihre eigenen Ideen und Teamrichtlinien auf dieser Grundlage zu überdenken.

Recommended Posts

Haben Sie jemals über die Definition von "schlechtem Design" nachgedacht?
Über den Umgang mit Null
Informationen zur Beschreibung von Docker-compose.yml
[Java] Ich habe über die Vorzüge und Verwendungen von "Schnittstelle" nachgedacht.
Über das Verhalten von Ruby Hash # ==
Über die Grundlagen der Android-Entwicklung
Informationen zur Rolle der Initialisierungsmethode
Denken Sie an die 7 Regeln von Optional
Informationen zur Protokollebene von java.util.logging.Logger
Haben Sie aufgehört, über die Verwendung von Getter / Setter im DTO-Entwurfsmuster nachzudenken?
Was ist ein Test? ・ Über die Wichtigkeit eines Tests
Haben Sie aufgehört, über die Verwendung von BeanUtils.copyProperties nachzudenken?
Informationen zur Funktionsweise von next () und nextLine ()
Informationen zur ersten Anzeige von Spring Framework
Über die Behandlung von BigDecimal (mit Reflexion)
Über die Anzahl der Threads von Completable Future
Seien Sie beim Upgrade vorsichtig, wenn Sie | usw. in der Tomcat-URL verwenden