我已经看到很多关于是否使用getter / setter的问题和答案(例如this popular one),但我也看到了两种不同风格的getter / setter以及很少的信息模式是优选的,为什么。第一种是每个类使用1个getter和1个setter,可以通过命名方法或使用魔术方法(我的例子使用PHP,因为我每天都使用它,但我的问题适用于任何面向对象的语言)。
var total = countElementsMatching('some string', document.querySelectorAll('*'));
第二种是每个属性使用1个方法
<?php
class Foo {
private $bar;
private $baz;
public function get($property)
{
if (property_exists($this, $property))
return $this->$property;
}
public function set($property, $value)
{
if (property_exists($this, $property))
$this->$property = $value;
}
}
对于我的生活,我想不出任何理由为每个房产都有单独的方法。即使您需要单独验证,也可以在一个方法中使用开关,例如:
<?php
class Foo {
private $bar;
private $baz;
public function getBar()
{
return $this->bar;
}
public function setBar($value)
{
$this->bar = $value;
}
public function getBaz()
{
return $this->baz;
}
public function setBaz($value)
{
$this->baz = $value;
}
}
我错过了什么,或者每个属性是否需要一种方法?每个班级使用一个getter / setter是不错的做法?
另一个提出的选项是使用getsetters,每个属性使用一个函数来交替获取/设置值。我一直认为这违反了SOLID的单一责任原则,但正如下面给出的答案我认为我会更新问题以包含它。
答案 0 :(得分:1)
我建议为每个属性使用单独的getter和setter,因为你可以输入提示setter,以及每个getter的docblock注释返回值,使代码更容易理解,并且在使用IDE时更容易编辑(自动完成,申报等)。
答案 1 :(得分:1)
我赞成第二种口头方式,但我认为这更属于品味。
每个属性使用getter / setter的优点是:
另外,请记住,如果您总是使用getter / setter,那么您也可以公开这些属性。
否则,使用getters / setters提供有限访问权限(仅提供getter)或其他行为,即setBar($value)
将执行$this->value = $value ; updateOtherData();
答案 2 :(得分:0)
它还增强了对对象的理解,因为您可以轻松查看对象可用的属性。它还清楚哪些属性是只读的(即,它有一个getter但没有setter)。
答案 3 :(得分:0)
建议你使用每个属性的setter / getter函数用适当的函数封装类的每个字段,我们可以在类的构造函数中使用一个setter方法。
答案 4 :(得分:0)
你的第二个例子是一种常见的方式。例如,Symfony2实际上为ORM实体创建了这样的getter / setter。
另一个有趣的解决方案,可以产生更精简的代码: Getsetters
所以你这样编码(几乎像jQuery)
// Setting
$myobject->name('foo')
->age(26);
// Getting
echo $myobject->age();
class Foo {
private $name;
private $age;
public function name($name = null) {
if( ! is_null($name)) {
$this->name = $name;
return $this;
} else {
return $this->name;
}
}
public function age($age = null) {
if( ! is_null($age)) {
$this->age= $age;
return $this;
} else {
return $this->age;
}
}
}