我称之为“送货员”。我已经看到了它的几个变体,但问题是一个类具有依赖性,其唯一目的是将其传递给协作者并且从不使用依赖本身。
(我正在使用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();
}
}
我在代码中看到的远比我想要的多,这并不会让我很开心!我只是想知道是否有这个名字,以便我可以将人们与阅读材料联系起来,说明为什么这是一个坏主意。就目前而言,我不知道该搜索什么!
答案 0 :(得分:1)
我不知道任何名字,但我有点像送货员......虽然我想有些人可能会认为这个名字是冒犯性的。
通常使用依赖注入或服务定位器来解决此问题,尽管有太多人使用Singleton(不恰当)。
我不熟悉PHP,知道PHP是否提供真正的DI解决方案(而不是穷人的DI),但我认为如果没有,服务定位器是可以接受的(即使服务定位器经常是代码味道本身。)
答案 1 :(得分:0)
与第二个片段中的继承相关的问题看起来像我" Broken Hierarchy"。当基类及其派生类不共享IS-A关系时,会出现这种气味。通常只是为了方便(重用)而找到使用继承的代码,而不是因为有一个层次结构,其中参与的类是相关的(通过IS-A关系)。
(我从书"Refactoring for software design smells")中借用了气味术语(即破碎的层次结构)