1

我正在阅读有关 Object Calisthenics 的内容,其中一条规则是包装原始类型和字符串

class UIComponent {

    public function repaint($animate = true)
    {
     // 
    }

}

$component->animate(false);

变成:

class UIComponent {

    public function repaint(Animate $animate)
    {
     //
    }
}

class Animate {

    private $animate;

    public function __construct($animate = true) 
    {
        $this->animate = $animate;
    }
}

$component->animate(new Animate(false));

我用这种技术有什么好处?在我看来,我认为它只是使事情复杂化并添加了更多代码行。

4

2 回答 2

4

在这种情况下,它确实有点过大,但还有其他例子,它可以有意义

class Identifier {
  protected $id;
  public function __construct ($id) { 
    if (!preg_match('~^{a-z0-9]$~i', $id)) throw new Exception("Invalid id '$id'");
    $this->id = $id;
  }
  public function getId () { return $this->getId(); }
}

所以这个是不可变的,它确保了特定的格式。当你在另一个类中对这个类进行类型提示时,你不需要测试标识符是否有效

class MyClass {
  protected $id;
  public function __construct (Identifier $id) { $this->id = $id; }
}

这只是一个简单的例子,实际上它在 php 中并不常见。

[..] 并添加了更多代码行。

我认为“更多的代码行”本身并不坏。如果它需要更多的行(甚至类)来编写可读和干净的代码,它比紧凑但不可读的东西要好得多。

于 2012-12-23T13:06:38.187 回答
1

想象一个新的开发人员(或者你自己可能在你上次接触项目一年后)阅读第一个示例中的代码:

$component->repaint(false);

如果不跳转到该方法的定义repaint()或以其他方式阅读您的文档,您绝对无法知道false该方法的行为方式意味着什么。我的意思是,它的字面意思是“重绘错误”,所以......重绘但是......实际上并没有重绘?意图不明确,这是一件坏事。

这个极其简单的示例用于演示如何通过包装原语来大大提高代码的可读性。当您想开始添加一点点行为(例如在简单验证中烘焙并将自身与另一个实例进行比较)时,好处会更大。

对于新建这么小的对象对性能的影响,您完全不必担心。至于“更多代码行”为什么那么糟糕?SRP 几乎总是会产生“更多代码”,但它是干净、可读和可维护的代码。

于 2015-10-16T16:32:40.437 回答