独立的获取器/setter方法,还是组合方法?

在处理项目时,我一直在进行一些更改,并浏览现有的框架API文档以获取见解。

在仔细阅读Kohana文档时,我注意到任何给定类的getters/setters通常是组合的:

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


答案 1

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

此外,当一个方法只被称为用户名时,它的作用并不明显,例如没有动词,如get或set。在您的示例中,情况变得更糟,因为返回值要么是对象本身,要么是属性值,因此它不一致。

此外,getters(和setters)应该谨慎使用,因为它们会快速卷曲你的API。您拥有的获取者和设置者越多,该对象的协作者对该对象的了解就越多。如果你发现你的对象询问其他对象关于它们的内部,那么你很可能把责任放错了地方。


答案 2

jQuery与Kohana的方式相同。但是,我认为最好为设置和获取创建单独的方法。该方法的作用更为明显,我认为它在您的ide中的代码完成中更实用。例如,键入并获取可以设置的所有属性的列表。set

另一个缺点是:如果你想把一个值真的设置为?这不起作用,因为这是值中返回的标识符,您在设置特定值时受到限制...nullnull

所以这很好,因为你必须写得更少,但是嘿,在你的方法前面有三个字母(/)是什么?setget


推荐