保護されたデータ

2003年5月14日

protected アクセス修飾子を使用してクラスにデータを持たせることは、オブジェクト指向設計の面で良いと考えられますか。

オブジェクト指向設計者たちは、すべてのデータをプライベートにするべきか、それともいくつかをパブリックにすることができるのかという点について意見が分かれています

(この混乱した話題に飛び込む前に、protected アクセス修飾子の意味は言語によって微妙かつ重要な違いがあることに注意する必要があります).

このような話題が難しくなる理由は、チーム内またはチーム間の開発のどちらの角度から見ているかによって異なる視点が支配的になるためだと思います。

一方面、私がサブシステムを作成し、階層構造を通じて何らかの振る舞いを実装することを決めた場合、サブクラスがスーパーサブクラスに深くアクセスできるようにすることに何の問題もありません。結局のところ、それらはすべて私のコードであり、私はモジュール性を提供するためではなく、多態的な振る舞いを提供するためにサブクラスを使用しています。

一方、私がフレームワークを構築し、オーバーライドされることを期待するフッククラスを提供する場合、将来変更を加えても人々のサブクラスを壊さずに済むように、データを保護したいと思うかもしれません。実際、注意しないとサブクラスが簡単にスーパーサブクラスを破壊してしまう可能性があるため、これはこの場合よりもさらに insidious です。これは脆弱な基底クラス問題と呼ばれます。

したがって、データを保護することは常に良いことでも悪いことでもないと思います。制御範囲外のクライアントが特定のクラスをオーバーライドすることを意図している場合は、保護された機能を公開インターフェイスの一部として扱い、その結果、より注意を払う必要があります。フィールドを公開することは悪い考えなので、その場合は行いません。

しかし、それがあなたの意図ではなく、あなた自身が書くサブクラスのデータにアクセスするのに役立つのであれば、それは私には理にかなっていると思います。ただし、最初はフィールドをプライベートにし、保護に変更することはほとんどないと認めなければなりません。

関連する質問として、自己カプセル化を使用する必要があるかどうかがあります。