정의 : 한 개체는 다른 개체에 대해 가장 적게 알아야합니다.
Dimitri의 법칙의 핵심 개념은 계급과 약한 커플 링 사이에서 분리하는 것입니다. 약한 커플 링 후에 만 클래스의 재사용 성이 향상 될 수 있습니다.
더 생생한 은유는 다음과 비슷합니다. 감옥에있는 죄수들은 외부 사람들에게 연락해서는 안되며, 물론 친척이있을 수 있습니다. 여기의 교도소는 계급이며, 내부의 죄수들은 계급 내부의 정보이며, 감옥의 교도소는 Dimit Law의 집행자와 동일합니다.
Dimit의 법률 주장 :
(1) 클래스 부서 측면에서 커플 링이 약한 클래스를 만들어야합니다.
(2) 클래스의 구조 설계에서 각 클래스는 회원의 접근 권을 최소화해야한다.
(3) 클래스의 디자인에서 가능하면 클래스는 변하지 않은 클래스로 설계되어야합니다.
(4) 다른 클래스에 대한 참조와 관련하여, 다른 개체에 대한 대상의 참조는 최소화되어야한다.
(5) 클래스에 대한 접근 권한을 최소화하려고 노력한다.
(6)주의해서 직렬화 기능을 사용하십시오.
(7) 클래스 멤버를 노출시키지 말고 해당 액세서 (속성)를 제공하지 마십시오.
예를 들어, 그룹 회사가 있으며 하위 단위에는 지점과 직접 부서가 있습니다. 이제 모든 하위 단위의 직원 ID를 인쇄해야합니다. 먼저 Dimit 규칙을 위반하는 디자인을 살펴 보겠습니다.
// 본사 클래스 직원 {private String ID; public void setid (String Id) {this.id = id; } public String getId () {return id; }} // Branch Employee 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 (); // emp.setId ( "branch"+i)를 주문하기 위해 분기 직원에게 ID를 할당합니다. list.add (emp); } 반환 목록; }} Class CompanyManager {public list <Eccipeee> getAllemployee () {list <Employee> list = new ArrayList <Employee> (); for (int i = 0; i <30; i ++) {Employee emp = new Employee (); // emp.setId ( "Head Company"+i)를 주문하기 위해 본사 직원에게 ID를 할당합니다. list.add (emp); } 반환 목록; } public void printallemployee (subcompanyManager sub) {list <subemployee> list1 = sub.getallemployee (); for (subemployee e : list1) {system.out.println (e.getid ()); } list <ployee> 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 ()); }} 이 디자인의 주요 문제는 이제 CompanyManager에 있습니다. Dimit의 법칙에 따르면, 직접 친구와의 의사 소통 만 발생하며, 하위 직원 수업은 회사 관리자 클래스의 직접적인 친구가 아닙니다 (지역 변수로 나타나는 커플 링은 직접 친구에 속하지 않습니다). 논리적으로 말하면, 본사는 지점과 결합되면 지점 직원과 관련이 없습니다. 이 디자인은 분명히 불필요한 커플 링을 추가합니다. Dimit의 법칙에 따르면, 그러한 간접 친구 관계 커플 링은 수업에서 피해야합니다. 수정 된 코드는 다음과 같습니다.
클래스 SubCompanyManager {public list <subemployee> getAlemployee () {list <subemployee> list = new ArrayList <subemployee> (); for (int i = 0; i <100; i ++) {subemployee emp = new subemployee (); // emp.setId ( "branch"+i)를 주문하기 위해 분기 직원에게 ID를 할당합니다. list.add (emp); } 반환 목록; } public void printemployee () {list <subemployee> list = this.getallemployee (); for (subemployee e : list) {system.out.println (e.getid ()); }}} 클래스 CompanyManager {public list <ployee> getAllemployee () {list <Employee> list = new ArrayList <Employee> (); for (int i = 0; i <30; i ++) {Employee emp = new Employee (); // emp.setId ( "Head Company"+i)를 주문하기 위해 본사 직원에게 ID를 할당합니다. list.add (emp); } 반환 목록; } public void printallemployee (subcompanyManager sub) {sub.printemployee (); List <ployee> list2 = this.getallemployee (); for (Employee e : list2) {system.out.println (e.getid ()); }}} 수정 후 인사 ID를 인쇄하는 방법이 지점에 추가되었고 본사는 직접 인쇄하도록 전화하여 지점 직원과의 결합을 피했습니다.
Dimitter Law의 원래 의도는 클래스 간의 커플 링을 줄이는 것입니다. 각 클래스는 불필요한 종속성을 줄이기 때문에 실제로 커플 링 관계를 줄일 수 있습니다. 그러나 모든 것이 고유 한 표준을 가지고 있습니다. 간접 유형과의 의사 소통을 피할 수는 있지만 의사 소통을하려면 "중개자"를 통해 지점에 연락 할 수 있습니다. 예를 들어,이 경우 본사는 지점을 통해 지점 직원에게 "중개자"로 연락합니다. Dimit 원리의 과도한 사용은 많은 수의 중개 및 전송 클래스를 초래하여 시스템 복잡성이 향상됩니다. 따라서 Dimitr Law를 채택 할 때는 상충 관계를 반복적으로 평가해야하며, 이는 명확한 구조를 보장 할뿐만 아니라 높은 응집력과 낮은 결합이 필요합니다.