当我使用 getter 或 setter 时,这里的原则经常粘贴到我这里,但人们告诉我不要使用它们。该网站清楚地解释了我应该做什么和不应该做什么,但它并没有真正解释为什么我应该告诉而不是询问。我发现使用 getter 和 setter 效率更高,而且我可以用它们做更多事情。
想象一个Warrior
具有属性health
和的类armor
:
class Warrior {
unsigned int m_health;
unsigned int m_armor;
};
现在有人用特殊攻击攻击我的战士,降低他的护甲 5 秒。使用 setter 会是这样的:
void Attacker::attack(Warrior *target)
{
target->setHealth(target->getHealth() - m_damage);
target->setArmor(target->getArmor() - 20);
// wait 5 seconds
target->setArmor(target->getArmor() + 20);
}
并且告诉,不要问原则它看起来像这样(如果我错了,请纠正我):
void Attacker::attack(Warrior *target)
{
target->hurt(m_damage);
target->reduceArmor(20);
// wait 5 seconds
target->increaseArmor(20);
}
现在第二个显然看起来更好,但我找不到它的真正好处。您仍然需要相同数量的方法(increase
/ decrease
vs set
/ get
),并且您失去了询问是否需要询问的好处。例如,如何将战士的生命值设置为 100?您如何确定是否应该使用heal
or hurt
,以及需要多少健康才能治愈或伤害?
此外,我看到一些世界上最好的程序员正在使用 setter 和 getter。大多数 API 都使用它,并且它一直在 std lib 中使用:
for (i = 0; i < vector.size(); i++) {
my_func(i);
}
// vs.
vector.execForElements(my_func);
如果我必须决定是相信这里的人链接我一篇关于告诉而不是询问的文章,还是相信 90% 成功的大公司(苹果、微软、安卓、大多数游戏等)赚了很多钱和工作程序,我有点难以理解为什么会告诉,不要问是一个好原则。
当 getter 和 setter 似乎一切都变得更容易时,我为什么要使用它(我应该吗?)?