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

时间:2011-07-13 06:13:50

标签: 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;
}

而不是:

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

public function getSomeProperty(){
    return $this->_someProperty;
}

除了减少给定类的方法计数之外,这样做是否有任何价值()?我总是认识到方法(一般的函数)应该更能描述一个动作。其他经验丰富的开发人员在看到这个时会畏缩一下吗?

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

7 个答案:

答案 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)

为了争论,

组合方法确实提供了一些好处:

  1. 在模仿公共财产时避免__get__set魔法。 (无论如何,我都不建议使用 magic
  2. 使用thing()比使用getThing() setThing()更简洁。
  3. 即使方法会做得更多,但仍然可以将它们视为&#34;做一个thing()&#34;,即处理thing()。属性也不止一件事。它们允许您设置和获取值。
  4. 它认为thing()没有动词。但是,我们可以假设没有动词的thing()意味着我们像属性一样使用它(我们获取设置它)。对于接口,我们可以说没有参数的thing() readonly 而带有参数的thing($arg)读/写。为什么我们不愿意采用这个?在某些时候,我们采用了添加 getters setters 的想法吗?
  5. 如果您使用的是基于Web的语言(如PHP),那么您可能也在使用jQuery。 JQuery已经在做这种thing()并且效果很好。
  6. 如上所述,使用func_num_args()有助于完美实现此方法。
  7. 就个人而言,此刻我已经在当前的应用程序中承担了很大一部分风险,所以我可能会选择那些久经考验的getter和setter(see the section "Finding the Balance" of Jimmy Bogard's post in regards to getters/setters for data operations) 。我想我们已经接受过培训,可以查找这些 get / set 前缀(以及我们的IDE)以查看我们可以在类中使用哪些属性。这是一个我将在某个时候回归的讨论。