Definition: Ein Objekt sollte am wenigsten über andere Objekte wissen
Das Kernkonzept des Gesetzes von Dimitri ist die Entkopplung zwischen Klassen und schwacher Kopplung. Erst nach einer schwachen Kopplung kann die Wiederverwendbarkeit von Klassen verbessert werden.
Eine lebendigere Metapher ähnelt: Gefangene im Gefängnis sollten keine Menschen draußen kontaktieren. Natürlich kann es zu Verwandten kommen. Das Gefängnis hier ist die Klasse, die Gefangenen im Inneren sind die Informationen innerhalb der Klasse, und die Gefängniswärter im Gefängnis entsprechen dem Vollstrecker des Dimit -Gesetzes.
Dimits Gesetzesansprüche:
(1) In Bezug auf die Klassenabteilung sollten Klassen mit schwacher Kopplung erstellt werden;
(2) im Strukturdesign der Klasse sollte jede Klasse die Zugriffsrechte der Mitglieder minimieren.
(3) nach Möglichkeit sollte eine Klasse als unveränderte Klasse entworfen werden.
(4) In Bezug auf Verweise auf andere Klassen sollten die Verweise eines Objekts auf andere Objekte minimiert werden.
(5) versuchen, Zugriffsrechte für die Klasse zu minimieren;
(6) Serialisierungsfunktion mit Vorsicht verwenden;
(7) Die Klassenmitglieder nicht aufdecken, sondern den entsprechenden Accessor (Eigenschaften) angeben.
Um ein Beispiel zu geben: Es gibt eine Gruppenfirma, und die untergeordneten Einheiten haben Filialen und direkte Abteilungen. Jetzt ist erforderlich, um die Mitarbeiter -IDs aller untergeordneten Einheiten auszudrucken. Schauen wir uns zunächst das Design an, das gegen die Dimit -Regel verstößt.
// Leiter der Angestellten der Hauptsitzklasse {private String -ID; public void setId (String id) {this.id = id; } public String getId () {return id; }} // Branch Employee Class Subbefriede {private String -ID; public void setId (String id) {this.id = id; } public String getId () {return id; }} class subcompanyManager {public list <subEMPLEM> getAllaPlepleDee () {list <subEMPLEM> list = new ArrayList <SubEMPLECEE> (); für (int i = 0; i <100; i ++) {subEMPLEDEE emp = new subEmPlectee (); // Zweigpersonal eine ID zuweisen, um Emp.setID ("Zweig"+i); list.add (emp); } Rückgabeliste; }} Klasse CompanyManager {public list <Wephecte> getAllEPerToPoMeS () {list <Wephecte> list = new ArrayList <Wephectee> (); für (int i = 0; i <30; i ++) {Employee emp = new Employee (); // dem Zentralpersonal eine ID zuweisen, um Emp.setID ("Head Company"+i); list.add (emp); } Rückgabeliste; } public void printAllEmPlepleTee (subcompanyManager sub) {list <subEMPLEDEE> list1 = sub.getAllePoperee (); für (subaPhaPaee e: list1) {System.out.println (e.getId ()); } List <Wephecte> list2 = this.getAllePoperee (); für (Mitarbeiter e: list2) {System.out.println (e.getId ()); }}} public class Client {public static void main (String [] args) {CompanyManager e = new CompanyManager (); e.printallOPPLEMEDE (neuer subcompanyManager ()); }} Das Hauptproblem dieses Designs ist jetzt in CompanyManager. Nach Dimits Gesetz tritt nur die Kommunikation mit direkten Freunden auf, und die Unterbeschäftigungsklasse ist kein direkter Freund der FirmaManager -Klasse (die als lokale Variablen erscheinende Kopplung gehört nicht direkter Freunde). Logischerweise muss die Zentrale nur mit seiner Filiale verbunden sein und hat keine Verbindung zu den Zweigbearbeitern. Dieses Design fügt offensichtlich unnötige Kopplung hinzu. Nach Dimits Gesetz sollte eine solche indirekte Freundschaftsbeziehung in der Klasse vermieden werden. Der geänderte Code lautet wie folgt:
Klasse subCompanyManager {publiclist <subEmPlectee> getAllEmPlectoPlyee () {list <subEMPLET> list = new ArrayList <SubEmPlopel> (); für (int i = 0; i <100; i ++) {subEMPLEDEE emp = new subEmPlectee (); // Zweigpersonal eine ID zuweisen, um Emp.setID ("Zweig"+i); list.add (emp); } Rückgabeliste; } public void printEmPleToPoPoPoPoPoPoPoToPoMe () {list <subEMPLEDEE> list = this.getAllePlOPOPEM (); für (subaPhaPaee e: list) {System.out.println (e.getId ()); }}} class CompanyManager {public list <Wephectee> getAllEPerPoPoMeTee () {list <Wepende> list = new ArrayList <We Employee> (); für (int i = 0; i <30; i ++) {Employee emp = new Employee (); // dem Zentralpersonal eine ID zuweisen, um Emp.setID ("Head Company"+i); list.add (emp); } Rückgabeliste; } public void printAllEmPlepleDee (subcompanyManager sub) {sub.printOlepleToMeTee (); List <Wepodee> list2 = this.getAllEmPlective (); für (Mitarbeiter e: list2) {System.out.println (e.getId ()); }}} Nach der Änderung wurde die Druckenmethode der Personal -ID in die Filiale hinzugefügt, und die Zentrale rief sie direkt zum Drucken auf, wodurch die Kopplung mit den Zweigmitarbeitern vermieden wurde.
Die ursprüngliche Absicht des Dimitter -Gesetzes besteht darin, die Kopplung zwischen Klassen zu verringern. Da jede Klasse unnötige Abhängigkeiten reduziert, ist es in der Tat möglich, die Kopplungsbeziehungen zu reduzieren. Aber alles hat seine eigenen Standards. Obwohl es die Kommunikation mit indirekten Typen vermeiden kann, um zu kommunizieren, kontaktieren Sie den Zweig zwangsläufig über einen "Vermittler". In diesem Fall kontaktiert die Zentrale beispielsweise die Zweigbearbeiter über die Filiale als "Vermittler". Die übermäßige Verwendung des Dimit -Prinzips führt zu einer großen Anzahl solcher Vermittler- und Übertragungsklassen, was zu einer größeren Systemkomplexität führt. Bei der Verabschiedung des Dimitr-Gesetzes müssen wir daher die Kompromisse wiederholt abwägen, die nicht nur eine klare Struktur sicherstellen, sondern auch einen hohen Zusammenhalt und eine niedrige Kopplung erfordert.