Code Smell 142 - 생성자의 쿼리

도메인 개체의 데이터베이스에 액세스하는 것은 코드 냄새입니다. 생성자에서하는 것은 이중 냄새입니다

TL;DR: Constructors should construct (and probably initialize) objects.



문제


  • 부작용

  • 솔루션


  • 우발적인 지속성에서 필수 비즈니스 논리 분리
  • 지속성 클래스에서 생성자/소멸자 이외의 함수에서 쿼리를 실행합니다
  • .

    문맥



    레거시 코드에서 데이터베이스는 비즈니스 개체와 올바르게 분리되지 않습니다.

    생성자는 부작용이 없어야 합니다.

    단일 책임 원칙에 따라 유효한 객체만 빌드해야 합니다.

    샘플 코드



    잘못된




    public class Person {
      int childrenCount; 
    
      public Person(int id) {
        childrenCount = database.sqlCall("SELECT COUNT(CHILDREN) FROM PERSON WHERE ID = " . id); 
      }
    }
    

    오른쪽



    public class Person {
      int childrenCount; 
    
      // Create a class constructor for the Main class
      public Person(int id, int childrenCount) {
        childrenCount = childrenCount; 
        // We can assign the number in the constructor
        // Accidental Database is decoupled
        // We can test the object
      }
    }
    

    발각



    [X] 반자동

    린턴은 생성자에서 SQL 패턴을 찾아 경고할 수 있습니다.

    태그


  • 커플링

  • 결론



    우려 사항의 분리가 핵심이며 강력한 소프트웨어를 설계할 때 결합이 주요 적입니다.

    더 많은 정보



  • 학점



    사진 제공: Callum Hill on Unsplash

    My belief is still, if you get the data structures and their invariants right, most of the code will kind of write itself.



    피터 도이치






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


    좋은 웹페이지 즐겨찾기