코드 냄새 01 - 빈혈 모델

개체에는 동작이 없습니다.

TL;DR: Don't use objects as data structures



프로토콜이 비어 있습니다(세터/게터 포함).

도메인 전문가에게 엔터티를 설명하도록 요청하면 '속성 묶음'이라고 거의 말할 수 없습니다.

문제


  • 캡슐화 없음.
  • 실제 엔티티는 아닙니다.
  • 중복 코드
  • 작가/독자 불일치.

  • 솔루션



    1) 책임을 찾으십시오.

    2) 속성을 보호하십시오.

    3) 구현을 숨깁니다.

    4) 대표


  • DTO

  • 샘플 코드



    잘못된




    <?
    
    class Window {
        public $height;
        public $width;
    
        function getHeight() {
            return $this->height;
        }
    
        function setHeight($height) {
            $this->height = $height;
        }
    
        function getWidth() {
            return $this->width;
        }
    
        function setWidth($width) {
            $this->width = $width;
        }
    
    }
    

    오른쪽



    <?
    
    final Class Window{ 
    
      function area(){
        //...
      }
    
      function open(){
        //..
      }
    
      function isOpen(){
        //..
      }
    
    }
    

    발각



    정교한 linter는 탐지를 자동화할 수 있습니다.
    세터와 게터를 무시하고 실제 동작 메서드를 계산해야 합니다.

    또한 ~으로 알려진


  • 데이터 클래스

  • 태그


  • 빈혈
  • 데이터로서의 OOP
  • 캡슐화
  • 세터/게터
  • 가변성

  • 결론



    빈혈 모델을 피하십시오. 데이터 대신 항상 프로토콜에 집중하십시오.
    중요하지만 데이터는 우발적입니다.

    처지











    더 많은 정보


  • Wikipedia
  • Refactoring Guru





  • Object-oriented programming increases the value of these metrics by managing this complexity. The most effective tool available for dealing with complexity is abstraction. Many types of abstraction can be used, but encapsulation is the main form of abstraction by which complexity is managed in object-oriented programming.



    레베카 워프스-브록




    학점



    Unsplash에 있는 Stacey Vandergriff의 사진


    이 기사는 CodeSmell 시리즈의 일부입니다.




    최종 업데이트: 2021/05/30

    좋은 웹페이지 즐겨찾기