Maison  >  Article  >  Java  >  Explication détaillée de la loi de Déméter en Java

Explication détaillée de la loi de Déméter en Java

黄舟
黄舟original
2017-08-07 10:30:251210parcourir

Cet article présente principalement la loi de Déméter. La loi de Déméter est une règle qui doit être suivie lors de la création de méthodes et d'attributs dans une classe. Ceux qui sont intéressés peuvent en apprendre davantage

Définition : 1 <.> Un objet doit garder une connaissance minimale des autres objets.

Origine du problème : Plus la relation entre les classes est étroite, plus le degré de couplage est grand. Lorsqu'une classe change, plus l'impact sur l'autre classe est grand.

Solution : Essayez de réduire le couplage entre les classes.

Depuis que nous avons été exposés à la programmation, nous connaissons les principes généraux de la programmation logicielle : faible couplage et forte cohésion. Qu'il s'agisse de programmation orientée processus ou de programmation orientée objet, ce n'est qu'en gardant le couplage entre les modules aussi bas que possible que le taux de réutilisation du code peut être amélioré. Les avantages d’un faible couplage sont évidents, mais comment pouvons-nous obtenir un faible couplage grâce à la programmation ? C’est exactement ce que la loi de Déméter est censée accomplir.


La loi de Demit, également connue comme le principe le moins connu, a été proposée pour la première fois en 1987 par Ian Holland de la Northeastern University aux États-Unis. En termes simples, moins une classe en sait sur les classes dont elle dépend, mieux c'est. En d'autres termes, pour la classe dépendante, quelle que soit la complexité de la logique, la logique doit être encapsulée autant que possible à l'intérieur de la classe, et aucune information ne sera divulguée vers l'extérieur, à l'exception des méthodes publiques fournies. La loi de Déméter a une définition plus simple : communiquer uniquement avec des amis directs. Tout d’abord, expliquons ce qu’est un ami direct : chaque objet aura une relation de couplage avec d’autres objets. Tant qu’il existe une relation de couplage entre deux objets, on dit que les deux objets sont amis. Il existe de nombreuses méthodes de couplage, telles que la dépendance, l'association, la combinaison, l'agrégation, etc. Parmi eux, nous appelons les classes qui apparaissent dans les variables membres, les paramètres de méthode et les valeurs de retour de méthode des amis directs, tandis que les classes qui apparaissent dans les variables locales ne sont pas des amis directs. En d’autres termes, il est préférable que des classes inconnues n’apparaissent pas à l’intérieur de la classe en tant que variables locales.


Donnez-moi un exemple : il existe une société du groupe dont les unités subordonnées ont des succursales et des départements directs. Il est désormais nécessaire d'imprimer les identifiants des employés de toutes les unités subordonnées. Examinons d’abord les conceptions qui violent la loi de Déméter.



 //总公司员工
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());
 }
}
Le principal problème de cette conception réside désormais dans le CompanyManager. Selon la loi de Dimit, la communication ne se produit qu'avec des amis directs, contrairement à la classe SubEmployee. non Ce ne sont pas des amis directs de la classe CompanyManager (les couplages qui apparaissent comme des variables locales ne sont pas des amis directs). En toute logique, le siège social n'a besoin d'être couplé qu'avec ses succursales et n'a aucun lien avec les employés des succursales. augmente évidemment les couplages inutiles. Selon la loi de Déméter, de tels couplages avec des relations amicales indirectes en classe doivent être évités. Le code modifié est le suivant :


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());
 }
 }
}
Après la modification, une méthode d'impression des identifiants du personnel est ajoutée à l'agence, et le siège social l'appelle directement pour imprimer , évitant ainsi d'avoir à interagir avec la succursale. Les salariés de l'entreprise sont couplés.


L'intention initiale de la loi de Dimit est de réduire le couplage entre les classes. Puisque chaque classe réduit les dépendances inutiles, elle peut en effet réduire la relation de couplage. Mais tout a ses limites : même si la communication indirecte peut être évitée, la communication doit se faire par un « intermédiaire ». Par exemple, dans cet exemple, le siège social communique avec l'agence par l'intermédiaire de « l'intermédiaire » des salariés de l'agence. Une utilisation excessive du principe Demeter produira un grand nombre de ces classes intermédiaires et de transfert, ce qui entraînera une complexité accrue du système. Par conséquent, lorsque vous adoptez la loi de Dimit, vous devez peser les compromis à plusieurs reprises pour obtenir à la fois une structure claire, une cohésion élevée et un faible couplage.


Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn