특성 사용의 함정
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 대부분의 경우 사용할 수 있는 방법입니다.
그러나 특성은 유효한 언어 구조입니다. 해당되는 경우 사용하십시오. 의식적인 선택을 하고 그것에 만족하십시오.
소스를 검사하거나 반사를 사용하지 않는 한. ↩
예, 인터페이스를 의미합니다. ↩
Reference
이 문제에 관하여(특성 사용의 함정), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/dakujem/the-pitfalls-of-using-traits-5321텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)