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);
    }
}

可能我在野外看到的最常见的变体是为此目的滥用继承,在父类中拥有一个存在的属性,以便子类可以访问依赖项,即使父类从未实际使用依赖项本身。

class Dependency{}



class A {
    protected $dependency;

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

class B extends A {
    public function foo() {
        $this->dependency->bar();
    }
}

我在代码中看到的比我想要的要多得多,这让我很不高兴!我只是想知道是否有一个名称,以便我可以将人们链接到阅读材料,了解为什么这是一个坏主意。就目前而言,我不知道要搜索什么!

4

2 回答 2

1

我不知道任何名字,但我有点喜欢送货员......虽然我想有些人可能会认为这个名字边缘冒犯。

通常,这个问题可以通过依赖注入或服务定位器来解决,尽管太多人为此使用单例(不恰当地)。

我对 PHP 不够熟悉,不知道 PHP 是否提供了真正的 DI 解决方案(与穷人的 DI 相比),但我认为如果没有,服务定位器是可以接受的(即使服务定位器通常是代码气味在自身)。

于 2012-10-09T16:44:43.437 回答
0

第二个片段中与继承相关的问题在我看来就像“Broken Hierarchy”。当基类和它的派生类不共享 IS-A 关系时,就会出现这种气味。很常见的代码使用继承只是为了方便(为了重用),而不是因为参与的类相关(通过 IS-A 关系)的层次结构是有意义的。

(我从《重构软件设计气味》一书中借用了气味术语(即 Broken Hierarchy) )

于 2015-01-13T04:39:59.883 回答