> 백엔드 개발 > PHP 튜토리얼 > PHP 마스터 | Demeter의 법률 소개

PHP 마스터 | Demeter의 법률 소개

Christopher Nolan
풀어 주다: 2025-02-25 23:26:10
원래의
137명이 탐색했습니다.

PHP Master | Introduction to the Law of Demeter

코어 포인트

최소 지식의 원칙으로도 알려진 Dimit의 법칙은 다른 물체에 대한 대상의 이해를 최소화하고, 옹호자들은 직접 이웃과 상호 작용하여 모듈성과 유지 가능성을 향상시킵니다.

Dimitt 법칙을 준수하면 느슨하게 결합 된 소프트웨어 모듈의 설계를 크게 향상시켜 코드를보다 쉽게 ​​유지 관리, 테스트 및 수정할 수 있습니다.
    Dimitter 법률의 일반적인 위반은 객체 나 방법이 다른 객체의 구조와 요소에 대해 너무 많이 알면 관리하고 진화하기 어려운 코드를 밀접하게 연결할 때 발생합니다.
  • PHP의 실제 사례는 다른 개체의 내부 세부 사항을 노출시키는 서비스 로케이터를 사용하는 것과 같은 일반적인 관행에 위반이 어떻게 영리하게 포함될 수 있는지 보여줍니다.
  • Dimitian 법칙을 준수하기 위해 코드를 리팩토링하려면 아키텍처를 복잡하게하고 종속성을 증가시키는 불필요한 중간체를 피하기 위해 필요한 구성 요소와 직접적인 상호 작용이 필요합니다.
  • Dimitter Law는 종속성을 줄이고 높은 응집력을 촉진하여 코드 품질을 향상 시키지만, 복잡성과 성능의 특정 상황과 잠재적 인 상충 관계를 고려하여 실용적으로 적용해야합니다.
  • 소프트웨어 프로그래밍은 예술의 균형 잡힌 조합 (때로는 즉흥 연주를위한 완곡 성)이며 많은 문제를 해결하고 적절한 방식으로 해결하기 위해 입증 된 많은 휴리스틱입니다. 예술적 측면이 가장 어렵다는 점에 동의하지 않을 것입니다. 반면, 휴리스틱의 배후의 힘은 좋은 디자인을 기반으로 소프트웨어를 개발할 수있는 데 필수적입니다. 많은 휴리스틱이 소프트웨어 시스템이 특정 방법을 고수 해야하는 방법과 이유를 설명하는 많은 휴리스틱으로 인해 PHP 세계에서 더 널리 구현되지 않는 것은 매우 실망 스럽습니다. 예를 들어, Dimitian 법률은 언어 분야에서 가장 과소 평가 된 법률 중 하나 일 수 있습니다. 실제로,“친한 친구와 만 이야기하는 것”이라는 규칙의 모토는 PHP의 다소 미숙 한 상태 인 것으로 보이며, 이로 인해 여러 객체 지향 코드베이스의 전반적인 품질이 감소했습니다. 일부 인기있는 프레임 워크는 법의 교훈을 더 고수하기 위해 적극적으로 발전하고 있습니다. 그러한 파괴를 완화하는 가장 좋은 방법은 단순히 실용적인 태도를 취하고 실제로 법 아래에있는 것을 이해하여 대상 지향 코드를 작성할 때 의식적으로 적용되도록하는 것이기 때문에 Dimitese 법칙을 위반 한 것에 대해 서로를 비난하는 것은 의미가 없습니다. . 정의의 원인에 합류하고 실질적인 관점에서 법을 더 깊이 연구하기 위해, 다음 몇 줄에서 나는 법의 원칙을 관찰하는 것만 큼 단순한 것이 느슨하게 결합 된 소프트웨어 모듈로 설계된 이유를 보여줄 것입니다. 시간은 실제로 효율성을 향상시킬 수 있습니다.
  • 너무 아는 것은 좋은 일이 아닙니다
  • 는 종종 최소 지식의 원칙이라고 불리며, Dimitese 법이 옹호하는 규칙은 이해하기 쉽습니다. 간단히 말해서, 주어진 방법을 구현하는 잘 설계된 클래스가 있다고 가정하면, 메소드는 다음 객체에 속하는 다른 메소드를 호출하는 것으로 제한되어야합니다.
      원래 클래스의
    1. 메소드 인스턴스.
    2. 대상 메소드의 매개 변수 개체.
    3. 대상 방법에 의해 생성 된 객체.
    4. 메소드의 원래 클래스의 종속성 객체.
    5. 원래 클래스가 대상 방법 (OH!)에서 액세스 할 수있는 글로벌 개체
    6. 목록은 공식적인 부분과는 거리가 멀지 만 (보다 공식적인 목록의 경우 Wikipedia를 확인하십시오) 이러한 주요 포인트는 이해하기 쉽습니다. 전통적인 디자인에서는 다른 객체에 대해 너무 많이 아는 것이 잘못된 것으로 간주됩니다 (세 번째 객체에 액세스하는 방법을 암시 적으로 포함하는 것은 암시 적으로 포함됩니다). 어떤 경우에는 객체가 실질적인 의존성을 찾기 위해 서투른 중간체를 통해 불필요하게 상단에서 하단으로 이동해야하기 때문입니다. 예상대로 작동해야합니다. 이것은 명백한 이유로 심각한 디자인 결함입니다. 발신자는 여러 게터를 통해 액세스하더라도 중간체의 내부 구조에 대해 상당히 광범위하고 자세한 이해를 가지고 있습니다. 또한, 중간 물체를 사용하여 발신자가 요구하는 객체를 얻는 것은 그 자체로 문제를 보여줍니다. 결국, 종속성을 직접 주입하여 동일한 결과를 달성 할 수 있다면, 왜 그러한 복잡한 경로를 사용하여 종속성을 얻거나 그 방법 중 하나를 호출합니까? 이 과정은 전혀 의미가 없습니다.
    7. 내부적으로 다형성 인코더를 사용하여 데이터를 끌어 내고 주어진 대상 파일에 저장하는 파일 스토리지 모듈을 작성해야한다고 가정 해 봅시다. 의도적으로 모듈을 주입 가능한 서비스 로케이터에 고의적으로 연결하면 구현이 다음과 같습니다.
    8. filestorage 클래스의 생성자와 write () 및 read () 메소드에 중점을 둔 일부 관련없는 구현 세부 사항을 생략하십시오. 이 클래스는 정의되지 않은 서비스 로케이터 인스턴스를 주입하고 나중에 대상 파일에 데이터를 가져오고 저장하기 위해 의존성 (위에서 언급 한 인코더)을 가져 오는 데 사용됩니다. 이것은 일반적으로 클래스가 로케이터를 먼저 가로지고 인코더에 도달한다는 점을 고려하여 Dimitter 법률을 위반하는 것입니다. 발신자 Filestorage는 로케이터의 내부 구조에 대해 너무 많이 알고 있으며, 인코더에 액세스하는 방법을 포함하여 칭찬하고 싶은 기능이 아닙니다. 그것은 서비스 로케이터의 특성 (일부 사람들이 그것을 방지 방지로 생각하는 이유) 또는 다른 유형의 정적 또는 동적 레지스트리의 특성에 본질적으로 뿌리를 둔 인공물입니다. 이 문제에 대한보다 포괄적 인 이해를 얻으려면 로케이터의 구현을 확인해 봅시다. (로케이터와 인코더의 코드는 이전 출력과 일치하기 때문에 여기서 생략됩니다. 복제를 피하기 위해 여기에서 반복하지 않을 것입니다.)
    9. . 인코더를 사용하여 모든 샘플 클래스부터 함께 시작하겠습니다. (사용 샘플 코드는 이전 출력과 일치하기 때문에 여기서 생략됩니다. 복제를 피하기 위해 여기에서 반복하지 않을 것입니다.)이 법의 위반은이 경우 다소 은밀한 문제이며 로케이터의 뮤지터 사용을 제외하고는 표면에서 추적하기가 어렵습니다. 그리고 사용. 어쨌든, 우리가 위반이 외부 세계 외부에 숨겨져 있다는 것을 알고 있다는 사실은 로케이터 구조에 대한 정보가 너무 많을뿐만 아니라 불필요하게 Filestorage 클래스를 로케이터 자체에 연결합니다. 이 규칙의 규칙을 따르고 로케이터를 제거하면 커플 링을 제거하면서 사업을 수행하는 데 필요한 실제 공동 작업자와 Filestorage를 제공 ​​할 수 있습니다. 길을 따라 더 이상 서투른 노출 된 중간체가 없습니다! 다행히도이 모든 말도 안되는 것은 약간의 노력으로 작업 코드로 쉽게 변환 될 수 있습니다. Filestorage 클래스의 강화 된 Dimitri Law Compliant 버전을 여기에서보십시오. (리팩토링 된 filestorage 코드는 이전 출력과 일치하기 때문에 여기서 생략됩니다. 복제를 피하기 위해 여기서 반복하지 않을 것입니다.) 이것은 실제로 리팩터를 쉽게 리팩터링하기 쉽습니다. 이제 클래스는 인코더 린터 페이스 인터페이스의 모든 구현자를 직접 사용하여 불필요한 중간체의 내부 구조를 가로 지르지 않습니다. 그 예는 의심 할 여지없이 사소한 것이지만, 타당성의 지점을 보여주고 디미트리 법의 법칙을 따르는 것이 왜 수업의 디자인을 향상시키기 위해 할 수있는 최고의 일 중 하나인지 보여줍니다. 그러나이 규칙의 특별한 경우는 Robert Martin의 저서 "The Way of Code : Agile Software Development Manual"에서 깊이 탐구되며 특별한 분석이 필요합니다. 순간적으로 생각해보십시오. Filestorage가 데이터 전송 객체 (DTO)를 통해 협업자를 얻는 것으로 정의되면 어떻게됩니까?

      (DTO를 사용하는 코드 예제는 이전 출력과 일치하기 때문에 여기서 생략되며, 복제를 피하기 위해 여기서 반복하지 않을 것입니다.)

      . 이것은 파일 스토리지 클래스를 구현하는 흥미로운 방법입니다. 이제 주입 가능한 DTO를 사용하여 인코더를 내부적으로 전송하고 사용하기 때문입니다. 대답해야 할 질문은이 방법이 실제로 법을 위반하는지 여부입니다. 순수한 관점에서 볼 때, DTO는 의심 할 여지없이 전체 구조를 발신자에게 노출시키는 중간체이기 때문에 위반됩니다. 그러나 DTO는 초기 서비스 로케이터와 달리 정상적인 데이터 구조 일뿐입니다. 전혀 작동하지 않습니다. 그리고 데이터 구조의 목적은 ... 예, 데이터를 공개하는 것입니다. 이는 중간체가 행동을 구현하지 않는 한 (이는 정규 계급의 동작과 정확히 반대되는 한, 행동을 노출시키기 때문에 데이터를 숨 깁니다) Dimitter 법률은 그대로 유지됩니다. 다음 코드 스 니펫은 문제가있는 DTO를 사용하여 filestorage를 사용하는 방법을 보여줍니다. (DTO를 사용하는 코드 예제는 이전 출력과 일치하기 때문에 여기서 생략되며, 복제를 피하기 위해 여기서 반복하지 않을 것입니다.)

      . 이 접근법은 인코더를 파일 스토리지 클래스로 직접 전달하는 것보다 훨씬 더 번거 롭지 만, 예는 법을 맹목적으로 위반 한 것으로 언뜻보기에 나타날 수있는 까다로운 구현이 일반적으로 상당히 무해하다는 것을 보여줍니다. 그들은 추가적인 동작없이 데이터 구조를 사용합니다.

      결론

      다양한 복잡하고 때로는 밀교 휴리스틱이 OOP에서 인기가 있기 때문에 층 구성 요소의 설계에 명백한 긍정적 인 영향을 미치지 않는 또 다른 원칙을 추가하는 것은 의미가 없습니다. 그러나 Dimitter Law는 결코 실제 세계에서 거의 적용되지 않는 원칙이 아닙니다. 화려한 이름에도 불구하고 Dimitt Law는 불필요한 중간체를 제거하여 고도로 분리 된 응용 프로그램 구성 요소의 구현을 촉진하는 주요 목표를 가진 강력한 패러다임입니다. 교훈을 따르고 물론 맹목적으로 교리 적이되지 않으면 코드 품질이 향상 될 것입니다. 보장하다.

      (FAQ 부품은 이전 출력과 일치하기 때문에 여기서 생략됩니다. 복제를 피하기 위해 여기서 반복하지 않을 것입니다.)

위 내용은 PHP 마스터 | Demeter의 법률 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿