当我使用getter或setter时,经常会有人告诉我不要使用它们,并向我贴上“告诉,不要询问原则”的标签。这个网站清楚地解释了我应该做什么,以及我不应该做什么,但它并没有真正解释为什么我应该“告诉”而不是“询问”。我发现使用getter和setter更高效,而且我可以做更多的事情。
想象一个具有属性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
与set
/get
),并且你失去了询问时的好处。
例如,如何将战士的血量设置为100?
你怎么知道是否应该使用heal
还是hurt
,以及需要治疗或伤害多少生命值?
此外,我看到一些世界上最好的程序员正在使用setter和getter。 大多数API都在使用它,并且它一直在std lib中使用:
for (i = 0; i < vector.size(); i++) {
my_func(i);
}
// vs.
vector.execForElements(my_func);
如果我必须决定是否相信这里的人链接给我的一篇关于“告诉,不是询问”的文章,或者相信90%的大公司(苹果、微软、安卓、大多数游戏等等)已经成功地赚了很多钱并拥有工作程序,那么我很难理解为什么“告诉,不是询问”会是一个好原则。
当一切似乎都可以通过使用getter和setter更轻松时,我为什么应该使用它呢?