2015-04-22 34 views
7

我刚加入这个方法我的课:制定者和对象

/** 
* @param string|StreamableInterface $body 
* @return Message 
*/ 
public function setBody($body) { 
    $this->body = $body instanceof StreamableInterface ? $body : new StringStream($body, true); 
    return $this; 
} 

而现在它的语义是有点不同,这取决于你传递方法的字符串或对象上发生,我。

如果你给它一个字符串,它会构造一个新的对象,否则它只会创建一个对你提供的对象的引用,这意味着你可以在这个类的外部进一步修改该对象,但不能另一个。

这是不好的做法?我应该创建一个对象的完整克隆,如果你通过一个?我不确定预期的行为是什么。

+0

有趣的问题!尽管如此,我怀疑你的意思是你的最后一段中的“克隆”而不是“锥形”? – helmbert

+0

它不是一个坏习惯,实际上这是接受对象或字符串作为参数的推荐方式。作为一个方面说明,如果来自构造函数的第一个参数实际上是一个字符串,并且如果不是,则可能会引发异常,您可能需要检查'StringStream'。 (_someone可能会传递一个不同的数据类型到'setBody'和暗示'StringStream'_) –

+0

对我来说看起来很好。功能的目的是“设置一个身体”,它在两种情况下都能做到 - 不管它是一个引用还是一个新对象(对我来说)都没有关系。 –

回答

1

在我看来,流不应该被克隆,你应该保持你的代码的方式。我甚至会考虑你所做的最佳做法。如果有人想让对象拥有自己的独立流,那么他们应该给对象自己的流 - 我会将该决定留给调用者。

你的方法是我见过的几乎所有类似场景中常用的方法。