2012-10-09 2 views
1

나는 그것을 "배달 소년"이라고 부른다. 몇 가지 변종을 보았습니다. 그러나 문제는 클래스가 공동 작업자에게 전달하고 종속성 자체를 사용하지 않는 유일한 목적에 종속된다는 것입니다.이 코드의 냄새에 대한 공통 이름이 있습니까?

(그것이 내가 대부분 알고 있어요 무엇 때문에 PHP를 사용하고 있지만, 이것은 무신론자 언어)

class Dependency{} 

class B { 
    public function setDependency(Dependency $dependency) { 
     //... 
    } 
} 

class A { 
    private $b; 
    private $dependency; 

    public function __construct(Dependency $dependency, B $b) { 
     $this->dependency = $dependency; 
     $this->b = $b; 
    } 

    public function foo() { 
     $this->b->setDependency($this->dependency); 
    } 
} 

아마 내가,이 목적을 위해 상속을 남용 데 야생에서 볼 수있는 가장 일반적인 변종 부모 클래스가 실제로 의존성 자체를 사용하지 않아도 하위 클래스가 종속성에 액세스 할 수 있도록 존재하는 부모 클래스의 속성.

나는 코드에서 이것이 내가 원하는 것보다 훨씬 더 많이 본다. 그리고 그것은 나를 매우 행복하게하지 않는다! 나는 사람들에게 왜 독서 자료를 링크 시켜서 나쁜 생각인지에 대해 설명 할 수있는 이름이 있는지 궁금해했습니다. 그것이 그대로 서 무엇을 검색해야할지 모르겠습니다!

답변

1

나는 어떤 이름도 알지 못한다. 그러나 나는 배달 소년과 같다. 이름이 경계심을 가지고 공격 할 수도 있다고 생각하지만.

일반적으로이 문제는 Dependency Injection이나 Service Locator로 해결되지만 너무 많은 사람들이이를 위해 (부적절하게) Singleton을 사용합니다.

저는 PHP가 실제 DI 솔루션 (가난한 사람의 DI와 반대)을 제공하는지 알기에는 PHP에 익숙하지 않지만, 서비스 로케이터가없는 경우에도 서비스 로케이터를 사용할 수 있다고 생각합니다. 종종 코드 자체에서 냄새가납니다.)

+0

당신은'ServiceLocator'은이다 쓰고있는"더 나은'Singleton' (나는 책 "Refactoring for software design smells에서 냄새 용어 (예 : 브로큰 계층 구조)를 빌려) " * object가 아닌 * .OP의 사용은 실제 객체에 대한 스트레스만큼이나, ServiceLocator가 대신 사용될 수있는 방법을 보지 못합니다. –

+0

@MiserableVariable - 대부분의 경우, 특정 예를 들어, 의존성 삽입 프레임 워크에는 일반적으로 기존 서비스를 사용할지 아니면 새 서비스를 사용할지 풀링 된 서비스를 사용할지 등 서비스 로케이터가 확실히 동일하게 수행 할 수있는 방법이 있습니다. 여전히 DI와 SL만이 유일한 해결책은 아닙니다 이 문제에, 그러나 그들은 꽤 일반적입니다. –

+0

우리는 아마 두 differe에 대해 이야기하고 있습니다. 특정 인스턴스가 필요하지 않은 많은 경우를 생각한다면 문제가 될 수 있습니다. 나에게 여기에 의존하는 것은 객체 레벨이 아니라 유형 레벨에있다. –

0

두 번째 스 니펫에서 상속과 관련된 문제는 "Broken Hierarchy"와 같습니다. 이 냄새는 기본 클래스와 파생 클래스가 IS-A 관계를 공유하지 않을 때 발생합니다. 편의상 (재사용을 위해) 상속을 사용하는 코드를 찾는 것은 매우 일반적이며 참여 클래스가 관련되는 계층 구조 (IS-A 관계로)가 있어야하기 때문에가 아닙니다. 의 *`type`의 *에 너무 많은 스트레스,

는 "

관련 문제