这个代码味道有一个共同的名字吗?

时间:2012-10-09 10:10:06

标签: oop dependencies anti-patterns

我称之为“送货员”。我已经看到了它的几个变体,但问题是一个类具有依赖性,其唯一目的是将其传递给协作者并且从不使用依赖本身。

(我正在使用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();
    }
}

我在代码中看到的远比我想要的多,这并不会让我很开心!我只是想知道是否有这个名字,以便我可以将人们与阅读材料联系起来,说明为什么这是一个坏主意。就目前而言,我不知道该搜索什么!

2 个答案:

答案 0 :(得分:1)

我不知道任何名字,但我有点像送货员......虽然我想有些人可能会认为这个名字是冒犯性的。

通常使用依赖注入或服务定位器来解决此问题,尽管有太多人使用Singleton(不恰当)。

我不熟悉PHP,知道PHP是否提供真正的DI解决方案(而不是穷人的DI),但我认为如果没有,服务定位器是可以接受的(即使服务定位器经常是代码味道本身。)

答案 1 :(得分:0)

与第二个片段中的继承相关的问题看起来像我" Broken Hierarchy"。当基类及其派生类不共享IS-A关系时,会出现这种气味。通常只是为了方便(重用)而找到使用继承的代码,而不是因为有一个层次结构,其中参与的类是相关的(通过IS-A关系)。

(我从书"Refactoring for software design smells")中借用了气味术语(即破碎的层次结构)