Скажите, не спрашивайте принцип здесь часто приклеивается ко мне, когда я использую геттеры или сеттеры, и люди говорят мне не использовать их, Сайт четко объясняет, что я должен делать, и что я не должен делать, но на самом деле это не объясняет, почему я должен сказать, а не спрашивать. Я нахожу использование геттеров и сеттеров гораздо более эффективным, и я могу сделать больше с ними.
Представьте себе класс 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
или hurt
, и сколько здоровья вам нужно для лечения или лечения?
Кроме того, я вижу, что сеттеры и геттеры используются некоторыми из лучших программистов в мире. Большинство API-интерфейсов используют его, и он все время используется в std lib:
for (i = 0; i < vector.size(); i++) {
my_func(i);
}
// vs.
vector.execForElements(my_func);
И если мне нужно решить, верить ли мы, что люди здесь связывают мне одну статью о том, чтобы говорить, не спрашивать, или верить 90% крупных компаний (яблоко, микрософт, андроид, большинство игр и т.д.) и т. которые успешно сделали много денег и рабочих программ, мне как-то трудно понять, почему бы сказать, не просите быть хорошим принципом.
Почему я должен использовать его (должен ли я?), когда все становится проще с помощью getters и seters?