2012-12-23 71 views
1

我在读有关对象健美操和规则之一是wrapping primitive types and strings包装原始类型的优点?

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

我得到什么好处这种技术?在我看来,我认为这只是复杂的东西,并增加了更多的代码行。

回答

5

在这种情况下,这是事实,这是一个有点过大,但也有其他的例子,它是有意义

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的常见。

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

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

1

想象一下,一个新的开发人员(或你自己也许一年后,您上次触及该项目),阅读代码的第一个例子:

$component->repaint(false); 

没有跳跃的repaint()定义或以其他方式阅读你的文档的方法,你绝对没有办法知道这个方法的行为方式。我的意思是,它的字面意思是“重新绘制假”,所以...重新绘制,但...实际上不重绘? 意图不清楚,这是一件坏事。

这个非常简单的例子用来演示如何通过包装原语来大大提高代码可读性。如果您想要在简单验证中添加一点烘焙等行为,并将其自身与另一个实例进行比较,则优势更大。

您应该完全不关心新的这种小小物体的性能影响。至于“更多的代码行”,为什么那么糟糕? SRP几乎总是导致“更多的代码”,但它是干净的,可读的和可维护的代码。