私はOOPの「データ隠蔽」の概念を知っていますが、実際の開発では、仕様が変更されると常に問題が発生します。
例えば:
class role
{
std::string name;
int level;
public:
const std::string& get_name() { return name; }
void set_name(const std::string& value) { name = value; }
void set_level(int value) { level = value; }
int get_level() const { return level; }
}
もちろん、このコードには何の問題もありません。しかしname
、level
まったくカプセル化されていないと思いました。
私の意見は次のとおりです。
- ユーザーはセッター機能でデータを変更できます。
- setter / getterは、これらのデータメンバーのデータ型を公開します。これらのデータメンバーがタイプを変更する必要がある場合、setter/getter関数メンバーもインターフェイスを変更する必要があります。
- メンバーに別の操作が必要な場合は
level
、操作メンバー(eqなど)関数を追加するadd_level(int value)
のsub_level(int value)
が唯一の方法です。 - 1つだけ問題ありません。それらにいくつかの判断を追加する必要がある場合
get/set
、これらのインターフェイスはうまく機能する可能性があります。
では、どのような種類のデータメンバーをカプセル化する必要がありますか?これらのデータメンバーでは、規模と使用量をまったく予測できません。それらを直接公開すると、それらの操作は完全に単純で、明確で、意味のあるものになります。それらをカプセル化すると、多くの操作メンバーが作成され、いつかそれらのタイプが仕様(int-> class、class-> int)によって変更された場合、操作メンバーはインターフェイスを変更するか、すべてを直接強制終了する必要があります(それらをパブリックゾーンに送信します。