在处理项目时,我一直在进行一些更改,并浏览现有的框架API文档以获取洞察力。
在仔细阅读Kohana文档时,我注意到任何给定类的getter / setter通常是组合在一起的:
public function someProperty($value = null){
if(is_null($value){
return $this->_someProperty;
}
$this->_someProperty = $value;
return $this;
}
而不是:
public function setSomeProperty($value){
$this->_someProperty = $value;
return $this;
}
public function getSomeProperty(){
return $this->_someProperty;
}
除了减少给定类的方法计数之外,这样做是否有任何价值(前)?我总是认识到方法(一般的函数)应该更能描述一个动作。其他经验丰富的开发人员在看到这个时会畏缩一下吗?
我很惊讶地看到一个流行的框架使用这样的约定(我当然没有使用过Kohana )
答案 0 :(得分:9)
我认为这是一种不好的做法,因为它违反了CommandQuerySeparation。设置值正在改变状态(命令)。获取值是要求状态(查询)。一种方法不应该同时做到这一点,只有一件事。
此外,当一个方法被称为用户名时,它的作用并不明显,例如没有动词,比如获取或设置。在您的示例中,这会变得更糟,因为返回值是对象本身或属性值,因此它不一致。
此外,getters (and setters) should be used sparingly因为他们会快速回复您的API。您拥有的getter和setter越多,该对象的协作者就需要对对象的了解越多。如果你发现你的对象询问有关其内部的其他对象,你可能会错放责任。
答案 1 :(得分:3)
jQuery和Kohana一样。但是我认为最好创建单独的设置和获取方法。这个方法的作用更明显,我认为它在你的ide中的代码完成中更实际。例如,您键入set
,您将获得可以设置的所有属性的列表。
另一个缺点是:如果要将值设置为null
,该怎么办?这不起作用,因为null
是值中返回的标识符,您在设置特定值时受到限制......
所以这很好,因为你必须少写,但嘿,你方法前面的三个字母(set
/ get
)是什么?
答案 2 :(得分:2)
尽管Kohana使用这种不寻常的OOP技术,我认为你应该首先遵循编码惯例。但是,当然最好为类中的每个属性使用单独的getter和setter。所以,如果可以使用它们而不是违反约定 - 只要这样做就不会错了;)。如果您对使用某些OOP技术有疑问,也可以在这里阅读PHP OOP中的良好习惯 - http://www.ibm.com/developerworks/opensource/library/os-php-7oohabits/。希望它会有所帮助:)
答案 3 :(得分:1)
我宁愿相信他们有这样做的合理解释。例如,为了更容易实现ArrayAccess。唯一可以确定的方法就是直接问他们。
要回答你的问题,是的,当我看到第一种方法时,我会感到畏缩。违背OOP原则。
答案 4 :(得分:1)
为什么不这样做?
public function someProperty($value = null)
{
if (func_num_args() === 1) {
$this->someProperty = $value;
return $this;
} else {
return $this->someProperty;
}
}
这将是实现组合getter / setter
的唯一正确方法答案 5 :(得分:0)
如果你在任何地方都这样做,这是一个好方法,但它确实需要一切,也许这个框架的程序员习惯了,(它有点jquery一样)< / p>
然而,这会让我感到困惑
设置和获取我总是使用setters and getters:
public function __set($key, $value) {
// assign value $value to $this->key
}
public function __get($key) {
// return value of this->key
}
答案 6 :(得分:0)
为了争论,
组合方法确实提供了一些好处:
__get
和__set
魔法。 (无论如何,我都不建议使用 magic )thing()
比使用getThing() setThing()
更简洁。thing()
&#34;,即处理thing()
。属性也不止一件事。它们允许您设置和获取值。thing()
没有动词。但是,我们可以假设没有动词的thing()
意味着我们像属性一样使用它(我们获取和设置它)。对于接口,我们可以说没有参数的thing()
是 readonly 而带有参数的thing($arg)
是读/写。为什么我们不愿意采用这个?在某些时候,我们采用了添加 getters 和 setters 的想法吗?thing()
并且效果很好。func_num_args()
有助于完美实现此方法。就个人而言,此刻我已经在当前的应用程序中承担了很大一部分风险,所以我可能会选择那些久经考验的getter和setter(see the section "Finding the Balance" of Jimmy Bogard's post in regards to getters/setters for data operations) 。我想我们已经接受过培训,可以查找这些 get / set 前缀(以及我们的IDE)以查看我们可以在类中使用哪些属性。这是一个我将在某个时候回归的讨论。