独立的getter/setter方法,还是组合?

Dan*_*ugg 18 php oop naming-conventions kohana getter-setter

在处理项目时,我一直在进行一些更改,并浏览现有的框架API文档以获得洞察力.

在仔细阅读Kohana文档时,我注意到任何给定类的getter/setter通常组合在一起:

public function someProperty($value = null){
    if(is_null($value){
        return $this->_someProperty;
    }
    $this->_someProperty = $value;
    return $this;
}
Run Code Online (Sandbox Code Playgroud)

而不是:

public function setSomeProperty($value){
    $this->_someProperty = $value;
    return $this;
}

public function getSomeProperty(){
    return $this->_someProperty;
}
Run Code Online (Sandbox Code Playgroud)

这样做(前者)是否有任何价值,除了减少给定类的方法数量?我总是在理解方法(一般的功能)应该更能描述一个动作.当他们看到这个时,其他有经验的开发人员是否会畏缩,甚至一点点?

我很惊讶地看到一个流行的框架使用这样的约定(我当然没有使用过Kohana)

Gor*_*don 9

我认为这是一种不好的做法,因为它违反了CommandQuerySeparation.设置值正在改变状态(命令).获取值是要求状态(查询).一种方法不应该同时做两件事,而应该只做一件事.

而且,当它被称为用户名时,方法的作用并不明显,例如,没有动词,如get或set.在您的示例中,这会变得更糟,因为返回值是对象本身或属性值,因此它不一致.

此外,应该谨慎使用吸气剂(和固定剂),因为它们会迅速使您的API回旋.您拥有的getter和setter越多,该对象的协作者就需要对对象的了解越多.如果你发现你的对象向其他对象询问他们的内部结构,那么你很可能错失了责任.

  • 关于回报价值的公平点.虽然PHP提供了返回任何东西的可能性(int,float,bool,string,object,null等),但每个方法**应该只返回一种类型的值.在某些情况下,`null`可以是一个例外,即方法可能返回"int或null"或"object object or null". (2认同)
  • 品味问题.如维基中所述,"应该谨慎使用此模式,因为它可能会使错误/错误显示为正常的程序执行." 它也可能使设计复杂化.无论如何,在两种情况下(NULL和NullObject),方法/函数的返回值必须一致. (2认同)
  • @Travitron当我说你应该谨慎使用getter和setter时,我并不是说你应该拥有公共属性.我的意思(以及在链接文章中也有解释)是你应该使用[Tell Dont Ask](http://pragprog.com/articles/tell-dont-ask). (2认同)