Tell, don't ask Principle hereは、私が getter や setter を使用するときによく貼り付けられますが、人々はそれらを使用しないように言っています。このサイトは、私がすべきこととすべきでないことを明確に説明していますが、質問する代わりに、なぜ私が言うべきかを実際には説明していません. ゲッターとセッターを使用すると、はるかに効率的であり、より多くのことができるようになりました。
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);
}
明らかに 2 番目の方が優れているように見えますが、これの本当のメリットはわかりません。同じ量のメソッド ( increase
/decrease
対set
/ get
) が依然として必要であり、尋ねる必要があるかどうかを尋ねる利点が失われます。たとえば、戦士の体力を 100 に設定するにはどうすればよいでしょうか? と のどちらを使うべきheal
かhurt
、また、癒すか傷つけるのにどれだけのヘルスが必要かをどのように判断しますか?
また、セッターとゲッターが世界最高のプログラマーによって使用されていることも知っています。ほとんどの API で使用されており、標準ライブラリで常に使用されています。
for (i = 0; i < vector.size(); i++) {
my_func(i);
}
// vs.
vector.execForElements(my_func);
そして、ここにいる人々が私にリンクしている 1 つの記事を信じて、質問せずに話すことを信じるか、大企業 (アップル、マイクロソフト、アンドロイド、ほとんどのゲームなど) の 90% を信じるかを決める必要がある場合は、多くのお金を稼ぎ、プログラムを実行しましたが、なぜ教えてくれるのか理解するのはちょっと難しいです。
ゲッターとセッターを使用するとすべてが簡単に見えるのに、なぜそれを使用する必要があるのですか?