특성 사용의 함정

3994 단어 beginnersphp
트레잇이 PHP에 등장했을 때 많은 사람들(나 자신 포함)이 트레잇이 코드 재사용을 위한 실행 가능한 솔루션이라고 생각했을 것입니다. 그들은 코드의 장황함을 줄이는 방법을 제공했습니다. 파악하기 쉬웠습니다. 갑자기 관련 없는 클래스 간에 코드를 복제할 필요가 없었습니다. 🤩 하지만 (나를 포함하여) 많은 사람들이 힘든 수업을 듣고 술이 깼습니다...

PHP의 특성은 무엇입니까



간단히 말해서 특성은 이를 사용하는 클래스에 복사하여 붙여넣는 코드 조각입니다.
특성에 익숙하지 않은 경우 PHP Manual에서 특성에 대해 설명하는 내용을 읽을 수 있습니다.

특성이 내 요청에 왔습니다



a Logger , a Connection 및 a Serializer 인스턴스와 같은 모든 클래스가 필요했습니다. 생성자가 부풀어 올랐고 생성자를 통해 이러한 서비스를 개인 소품에 할당하기 위해 ~ 50 줄의 코드가있었습니다. 이러한 모든 클래스에서 동일한 주석, 동일한 모든 것 ...

모든 쿼리에서 $this->connection->table('foo')->select(...)를 입력한 다음 $this->serializer->serialize($result)를 입력하고 로깅이 필요할 때마다 $this->logger->log(stuff)를 입력해야 합니다.

베이스 클래스 도입을 생각하고 계시죠? 그러나 내 목표 클래스가 모두 관련이 있는 것은 아니었고, 문제를 해결하지 못했을 것이며, 더 나쁜 것은 기본 클래스가 악취를 풍기는 것이었습니다.

그래서 "번들"을 실험했습니다... 생성자에 단일 클래스를 주입했지만 이런 종류의 코드$this->bundle->logger->log(stuff)를 입력해야 했습니다 🤦‍♂️.

대신 $this->log(stuff) , $this->select(...) 또는 $this->serialize($result) 만 입력할 수 있는 특성을 발견했습니다.

다음과 같은 방법으로 특성을 작성하는 것은 쉬웠습니다.

protected function select(...$args) {
    return $this->connection
        ->use($this->database)
        ->table($this->table)
        ->select(...$args);
}

public function injectConnection(Connection $c){
    $this->connection = $c;
}


시작할 때 setter를 자동으로 호출하는 마법이 있었습니다.

이러한 여러 특성을 결합하여 여러 서비스에 대한 바로 가기를 만들 수도 있습니다.

완벽한 솔루션입니다.
제외하고...

제외하고...



그래서... 특성을 어떻게 테스트합니까? 글쎄, 당신은하지 않습니다! 인스턴스화할 수 없으며 특성을 사용하는 클래스를 테스트합니다.
테스트할 수 있도록 클래스가 특성을 사용하고 있는지 어떻게 알 수 있습니까? 글쎄, 당신은 1 !
문제가 보이십니까?

제외하고...



종속성은 어떻습니까? 6개의 특성과 주입해야 하는 서비스만큼 멋진 클래스를 만들면 어떻게든 상용구 코드가 생성됩니다.
더 나쁜 것은 숨겨진 종속성을 생성한다는 것입니다. 그리고 특성을 수퍼 특성으로 결합하기 시작하는 순간을 기다리십시오.

테이크아웃



특성을 생성 및/또는 사용하기 전에 두 번 생각하십시오. 감히 말씀드리지만 대부분의 경우 특성이 필요하면 클래스 디자인에서 냄새가 나야 합니다.

트레이트를 사용하는 것은 적절한 클래스에 위치할 수 있는 코드를 복사하여 붙여넣는 것일 뿐이라는 점을 기억하십시오.

특성 대신 클래스 구성을 사용합니다. 자동 연결 기능이 있는 DI 컨테이너를 사용하여 상용구를 줄입니다. 얽힌 종속성과 특성 충돌을 처리하는 것보다 몇 개의 문자를 추가로 입력하는 것이 더 저렴하다는 것을 이해하십시오.
사실 앞서 언급한 "번들"이 올바르게 실행된다면2 대부분의 경우 사용할 수 있는 방법입니다.

그러나 특성은 유효한 언어 구조입니다. 해당되는 경우 사용하십시오. 의식적인 선택을 하고 그것에 만족하십시오.



소스를 검사하거나 반사를 사용하지 않는 한.

예, 인터페이스를 의미합니다.

좋은 웹페이지 즐겨찾기