Определение: один объект должен знать меньше всего о других объектах
Основной концепцией закона Дмитрия является развязка между классами и слабой связью. Только после слабой связи может улучшить возможности повторного использования классов.
Более яркая метафора похожа на: заключенные в тюрьме не должны связываться с людьми на улице, конечно, могут быть посещающими родственниками. Тюрьма здесь - это класс, заключенные внутри - информация внутри класса, а тюремные охранники в тюрьме эквивалентны исполнителю закона Димита.
Закон Димита утверждает:
(1) с точки зрения подразделения класса, должны быть созданы классы со слабым связью;
(2) В конструкции структуры класса каждый класс должен минимизировать права доступа членов;
(3) при разработке класса, если возможно, класс должен быть разработан как неизменный класс;
(4) С точки зрения ссылок на другие классы, ссылки объекта на другие объекты должны быть сведены к минимуму;
(5) попытаться минимизировать права доступа к классу;
(6) использовать функцию сериализации с осторожностью;
(7) Не выставляйте членов класса, но предоставляйте соответствующий аксессу (свойства).
Чтобы привести пример: есть группа групп, а подчиненные подразделения имеют филиалы и прямые отделы. Теперь необходимо распечатать идентификаторы сотрудников всех подчиненных единиц. Давайте сначала посмотрим на дизайн, который нарушает правило Dimit.
// Глава сотрудника класса Head Office {Private String ID; public void setId (String id) {this.id = id; } public String getId () {return id; }} // Franch Colportee Class Submployee {Private String Id; public void setId (String id) {this.id = id; } public String getId () {return id; }} класс SubCompanyManager {public List <ubemployee> getallemployee () {list <submuthookee> list = new Arraylist <ubemployeee> (); for (int i = 0; i <100; i ++) {subemployee emp = new Submployee (); // назначить идентификатор филиалам в порядке emp.setid ("branch"+i); list.add (emp); } return List; }} класс CompanyManager {public List <mempieee> getallemployee () {list <memplieee> list = new ArrayList <mempieeee> (); for (int i = 0; i <30; i ++) {employee emp = new Employee (); // назначить идентификатор головному офису в порядке в порядке emp.setid («Главная компания»+i); list.add (emp); } return List; } public void printAllEmployee (subCompanyManager sub) {list <subemployee> list1 = sub.getAllemployee (); для (submployee e: list1) {System.out.println (e.getId ()); } List <Сотрудник> list2 = this.getAllEmployee (); для (сотрудник e: list2) {System.out.println (e.getId ()); }}} public Class Client {public static void main (string [] args) {companyManager e = new CompanyManager (); E.printallemployee (New SubCompanyManager ()); }} Основная проблема этого дизайна сейчас в компании CompanyManager. Согласно закону Димита, происходит только общение с прямыми друзьями, и класс подбородающих не является прямым другом класса компании Manager (связь, которая появляется в качестве локальных переменных, не принадлежит прямым друзьям). Говоря по логике, головной офис должен только сочетаться с его филиалом и не связан с сотрудниками филиала. Этот дизайн, очевидно, добавляет ненужную связь. Согласно закону Димита, в классе следует избегать такого косвенного связующего взаимоотношения. Модифицированный код заключается в следующем:
Class SubCompanyManager {public List <Boomployee> getAllEmployee () {list <subemployee> list = new ArrayList <subemployee> (); for (int i = 0; i <100; i ++) {subemployee emp = new Submployee (); // назначить идентификатор филиалам в порядке emp.setid ("branch"+i); list.add (emp); } return List; } public void printEmployee () {list <submpoorweee> list = this.getallemployee (); для (submployee e: list) {System.out.println (e.getId ()); }}} Class CompanyManager {public List <mempieee> getallemployee () {list <employee> list = new ArrayList <mempieeee> (); for (int i = 0; i <30; i ++) {employee emp = new Employee (); // назначить идентификатор головному офису в порядке в порядке emp.setid («Главная компания»+i); list.add (emp); } return List; } public void printAllEmployee (subcompanymanager sub) {sub.printemployee (); Список <Сотрудник> list2 = this.getAllEmployee (); для (сотрудник e: list2) {System.out.println (e.getId ()); }}} После модификации метод печати идентификатора персонала был добавлен в филиал, и головный офис напрямую вызвал его для печати, что позволяет избежать связи с сотрудниками филиала.
Первоначальное намерение закона Dimter - уменьшить связь между классами. Поскольку каждый класс снижает ненужные зависимости, действительно возможно уменьшить отношения связи. Но у всего есть свои стандарты. Хотя он может избежать связи с косвенными типами, для общения вы неизбежно свяжете ветвь через «посредник». Например, в этом случае головной офис связывается с сотрудниками филиала через филиал как «посредник». Чрезмерное использование принципа DIMIT приведет к большому количеству таких посредников и классов передачи, что приведет к большей сложности системы. Следовательно, при принятии закона о димитре мы должны многократно взвесить компромиссы, что не только обеспечивает четкую структуру, но также требует высокой сплоченности и низкой связи.