msty開発メモ

技術ネタを綴ります

【C++発展途上者向け】ゲッターとセッターは実装すべき?

ゲッターとセッターをどうやって実装するかという面白い問題を見つけたので個人的な考え方でも書いておきます

ゲッターはほとんど実装しない

私はほとんどゲッターを実装しません。
といっても面倒くさい時はカプセル化も何もしないんですけどね(笑)

ただガッツリ書くときは、そもそも直の値を取り出す必要のないプログラムを書きます。
ただ私の技量ではチョー難しく満足いくほどスムーズに実装できないのが現実ですね。

ちょっとした例を書いてみます。
ここに以下のようなクラスがありました

class Status {
private:
	int hp;
public:
	Status(int hp) {
		this->hp = hp;
	}

	int GetHpNow() {
		return this->hp;
	}

	int SetHpNow(int hp) {
		this->hp = hp;
	}
};

このクラスを使って、hpが0になったら"死んだ"と表示するプログラムを書く事になりました。
何も考えずにゲッター・セッターを使うと素敵な糞プログラムが出来上がります。

int main() {

	Status status(50);
	int nowhp;
	//体力を100減らす
	nowhp = status.GetHpNow();
	status.SetHpNow(nowhp - 100);
	//死んだか調べる
	if (status.GetHpNow() <= 0) {
		printf("死んだ\n");
	}
	else {
		printf("生きてる\n");
	}
}

オブジェクト指向もくそもないですね。
じゃあもう少し賢く書いてみます。

ゲッター・セッターとバイバイする

今回の条件ならゲッターもセッターも
必要ありません。
これらではなく、明示的にhpを減らすメソッドと、生きてるかどうかを判定するメソッドを実装します。

実装するとこうなります。

class Status {
private:
	int hp;
public:

	Status(int hp) {
		this->hp = hp;
	}

	//HPを減らす
	void Damage(int damage) {
		this->hp -= damage;
	}

	//生きてたらtrueを返す
	bool Living() {
		return (this->hp > 0);
	}

};

こうすればセッター・もゲッター・もいらないです。
これを実際に使って先ほどの糞プログラムを書き換えてみます。

int main() {

	Status status(50);
	//体力を100減らす
	status.Damage(100);
	//死んだか調べる
	if (status.Living()==true) {
		printf("生きてる\n");
	}
	else {
		printf("死んだ\n");
	}
}

ドチャクソシンプルになりました。
むやみにゲッター・セッターを実装する前に、クラス内で完結させれるようなソースを実装できるようになるとシンプルになります。
できないものは実装するしかありませんが、ほとんどのことは工夫次第で実装せずに済むはずです。