Heim >Java >javaLernprogramm >Ausführliche Erklärung des Demeter-Gesetzes in Java

Ausführliche Erklärung des Demeter-Gesetzes in Java

黄舟
黄舟Original
2017-08-07 10:30:251229Durchsuche

In diesem Artikel wird hauptsächlich das Demeter-Gesetz vorgestellt. Es handelt sich um eine Regel, die beim Erstellen von Methoden und Attributen in einer Klasse befolgt werden muss.

Definition: 1 Ein Objekt sollte nur minimale Kenntnisse über andere Objekte behalten.

Ursprung des Problems: Je enger die Beziehung zwischen den Klassen ist, desto größer ist der Grad der Kopplung. Wenn sich eine Klasse ändert, sind die Auswirkungen auf die andere Klasse umso größer.

Lösung: Versuchen Sie, die Kopplung zwischen Klassen zu reduzieren.

Seitdem wir mit der Programmierung vertraut sind, kennen wir die allgemeinen Prinzipien der Softwareprogrammierung: geringe Kopplung und hohe Kohäsion. Unabhängig davon, ob es sich um prozessorientierte Programmierung oder objektorientierte Programmierung handelt, kann die Code-Wiederverwendungsrate nur verbessert werden, wenn die Kopplung zwischen Modulen so gering wie möglich gehalten wird. Die Vorteile einer geringen Kopplung liegen auf der Hand, aber wie können wir durch Programmierung eine geringe Kopplung erreichen? Genau das soll mit dem Demeterschen Gesetz erreicht werden.

Demits Gesetz, auch als das am wenigsten bekannte Prinzip bekannt, wurde erstmals 1987 von Ian Holland von der Northeastern University in den Vereinigten Staaten vorgeschlagen. Laienhaft ausgedrückt: Je weniger eine Klasse über die Klassen weiß, von denen sie abhängt, desto besser. Mit anderen Worten, für die abhängige Klasse sollte die Logik, egal wie komplex die Logik ist, so weit wie möglich in der Klasse gekapselt werden, und außer den bereitgestellten öffentlichen Methoden werden keine Informationen nach außen gelangen. Demeters Gesetz hat eine einfachere Definition: Kommunizieren Sie nur mit direkten Freunden. Lassen Sie uns zunächst erklären, was ein direkter Freund ist: Jedes Objekt hat eine Kopplungsbeziehung mit anderen Objekten. Solange zwischen zwei Objekten eine Kopplungsbeziehung besteht, sagen wir, dass die beiden Objekte Freunde sind. Es gibt viele Arten der Kopplung, z. B. Abhängigkeit, Assoziation, Kombination, Aggregation usw. Unter diesen nennen wir Klassen, die in Mitgliedsvariablen, Methodenparametern und Methodenrückgabewerten erscheinen, direkte Freunde, während Klassen, die in lokalen Variablen erscheinen, keine direkten Freunde sind. Mit anderen Worten: Es ist am besten, wenn unbekannte Klassen nicht als lokale Variablen innerhalb der Klasse erscheinen.

Geben Sie mir ein Beispiel: Es gibt ein Konzernunternehmen, dessen untergeordnete Einheiten Niederlassungen und direkte Abteilungen haben. Jetzt müssen die Mitarbeiter-IDs aller untergeordneten Einheiten ausgedruckt werden. Schauen wir uns zunächst Designs an, die gegen das Demeter-Gesetz verstoßen.


 //总公司员工
class Employee{
 private String id;
 public void setId(String id){
 this.id = id;
 }
 public String getId(){
 return id;
 }
}

//分公司员工
class SubEmployee{
 private String id;
 public void setId(String id){
 this.id = id;
 }
 public String getId(){
 return id;
 }
}

class SubCompanyManager{
 public List<SubEmployee> getAllEmployee(){
 List<SubEmployee> list = new ArrayList<SubEmployee>();
 for(int i=0; i<100; i++){
  SubEmployee emp = new SubEmployee();
  //为分公司人员按顺序分配一个ID
  emp.setId("分公司"+i);
  list.add(emp);
 }
 return list;
 }
}

class CompanyManager{

 public List<Employee> getAllEmployee(){
 List<Employee> list = new ArrayList<Employee>();
 for(int i=0; i<30; i++){
  Employee emp = new Employee();
  //为总公司人员按顺序分配一个ID
  emp.setId("总公司"+i);
  list.add(emp);
 }
 return list;
 }
 
 public void printAllEmployee(SubCompanyManager sub){
 List<SubEmployee> list1 = sub.getAllEmployee();
 for(SubEmployee e:list1){
  System.out.println(e.getId());
 }

 List<Employee> list2 = this.getAllEmployee();
 for(Employee e:list2){
  System.out.println(e.getId());
 }
 }
}

public class Client{
 public static void main(String[] args){
 CompanyManager e = new CompanyManager();
 e.printAllEmployee(new SubCompanyManager());
 }
}

Das Hauptproblem bei diesem Design liegt nun darin, dass die CompanyManager-Klasse laut Dimits Gesetz nur mit direkten Freunden kommuniziert, während dies bei der SubEmployee-Klasse der Fall ist nicht Sie sind keine direkten Freunde der CompanyManager-Klasse (Kopplungen, die als lokale Variablen erscheinen, sind keine direkten Freunde, die Zentrale muss nur mit ihren Niederlassungen gekoppelt werden und hat keine Verbindung mit den Mitarbeitern der Niederlassungen). erhöht offensichtlich unnötige Kopplung. Nach dem Demeterschen Gesetz sollten solche Kopplungen mit indirekten Freundschaftsbeziehungen im Unterricht vermieden werden. Der geänderte Code lautet wie folgt:


class SubCompanyManager{
 public List<SubEmployee> getAllEmployee(){
 List<SubEmployee> list = new ArrayList<SubEmployee>();
 for(int i=0; i<100; i++){
  SubEmployee emp = new SubEmployee();
  //为分公司人员按顺序分配一个ID
  emp.setId("分公司"+i);
  list.add(emp);
 }
 return list;
 }
 public void printEmployee(){
 List<SubEmployee> list = this.getAllEmployee();
 for(SubEmployee e:list){
  System.out.println(e.getId());
 }
 }
}

class CompanyManager{
 public List<Employee> getAllEmployee(){
 List<Employee> list = new ArrayList<Employee>();
 for(int i=0; i<30; i++){
  Employee emp = new Employee();
  //为总公司人员按顺序分配一个ID
  emp.setId("总公司"+i);
  list.add(emp);
 }
 return list;
 }
 
 public void printAllEmployee(SubCompanyManager sub){
 sub.printEmployee();
 List<Employee> list2 = this.getAllEmployee();
 for(Employee e:list2){
  System.out.println(e.getId());
 }
 }
}

Nach der Änderung wird der Filiale eine Methode zum Drucken von Personal-IDs hinzugefügt, die von der Zentrale direkt zum Drucken aufgerufen wird , wodurch die Notwendigkeit einer Interaktion mit der Filiale vermieden wird. Die Mitarbeiter des Unternehmens sind gekoppelt.

Die ursprüngliche Absicht von Dimits Gesetz besteht darin, die Kopplung zwischen Klassen zu reduzieren. Da jede Klasse unnötige Abhängigkeiten reduziert, kann es tatsächlich die Kopplungsbeziehung reduzieren. Aber alles hat seine Grenzen, obwohl die Kommunikation über einen „Vermittler“ erfolgen kann. In diesem Beispiel kommuniziert die Zentrale mit der Filiale über den „Vermittler“, der die Mitarbeiter kontaktiert. Eine übermäßige Verwendung des Demeter-Prinzips führt zu einer großen Anzahl solcher Zwischen- und Übertragungsklassen, was zu einer erhöhten Systemkomplexität führt. Daher müssen Sie bei der Übernahme des Dimit-Gesetzes wiederholt die Kompromisse abwägen, um sowohl eine klare Struktur als auch eine hohe Kohäsion und eine geringe Kopplung zu erreichen.

Das obige ist der detaillierte Inhalt vonAusführliche Erklärung des Demeter-Gesetzes in Java. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn