Скажите, не спрашивайте принцип here часто приклеивается ко мне, когда я использую геттеры или сеттеры, и люди говорят мне не использовать их. Сайт четко объясняет, что я должен делать, и что я не должен делать, но на самом деле это не объясняет, ПОЧЕМУ я должен сказать, а не спрашивать. Я использую геттеры и сеттеры гораздо эффективнее, и я могу сделать больше с ними.Использование getter/setter против «tell, not ask»?
Представьте класс Warrior
с атрибутами health
и armor
:
class Warrior {
unsigned int m_health;
unsigned int m_armor;
};
Теперь кто-то нападает на мой воин с особой атакой, что уменьшает его броню на 5 секунд. Использование сеттер-х было бы так:
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, использовать его, и он используется в станд Lib все время:
for (i = 0; i < vector.size(); i++) {
my_func(i);
}
// vs.
vector.execForElements(my_func);
И если я должен решить, стоит ли верить людям здесь ссылки мне одну статью о рассказывающие, не спрашивая, или считают, что 90% крупных компаний (apple, microsoft, android, большинство игр и т. д. и т. д.), которые успешно сделали много денег и работают над программами, мне очень трудно понять, почему расскажите, t ask быть хорошим принципом.
Почему я должен использовать его (должен ли я?), Когда все становится проще с помощью геттеров и сеттеров?
Вместо того, чтобы использовать одиночную броню или одиночную броню, вы можете использовать список hp_reduction и armor_reduction, чтобы, когда несколько противников попали в одну и ту же жертву, они не повреждают здоровье и броню из-за того, что несколько потоков получают доступ к одной и той же переменной для здоровья и брони , Ожидание 5 секунд в потоке не так ли? Как вы можете быть уверены, что он ждет ровно 5 секунд? Вам также могут понадобиться планировщики задач. –
@huseyintugrulbuyukisik Спасибо, но я не пытаюсь написать здесь рабочую игру ._. это был просто простой пример –
Тогда вы можете пойти с простейшими заданиями присваивания. Warrior.HP- = 5; –