統一アクセス原則
2011年4月20日
モジュールによって提供されるすべてのサービスは、その実装がストレージまたはコンピューテーションのいずれによるものであるかを明示しない、統一された表記を通じて利用できる必要があります。
-- Bertrand Meyer
Bertrand Meyerは非常に影響力のある著書オブジェクト指向ソフトウェアの構築でこの原則を作成しました。[1]
この原則の重要なポイントは、personオブジェクトがあり、その年齢を尋ねた場合、その年齢がオブジェクトの格納フィールドであるか計算された値であるかに関係なく、同じ表記を使用する必要があるということです。これは実際には、personのクライアントが年齢が格納されているか計算されているかを認識したり、気にしたりする必要がないことを意味します。

これにより、personオブジェクトには2つの間を簡単に切り替える柔軟性が与えられるだけでなく、通常はクライアントから不要な懸念事項が取り除かれます。それはカプセル化の重要な部分、つまり少なくともカプセル化のデータ非公開の側面です。
それはオブジェクト指向プログラミングの基本機能ですが、それに従う完全なOO言語は驚くほどわずかです。(当然ながらEiffelは例外です。)ほとんどの言語では慣例によってシミュレートされており、したがってJavaおよびC++プログラムでgetAge
などのアクセサーを使用する習慣があります。
言語が何を実行するかに関係なく、プログラマーはその原則に違反しないことが重要です。多くの場合、統一アクセスを無効にする規約が見られます。この例としては、データアクセサーはgetAge
という名前だが、計算アクセサーはcalcAge
という名前であるという場合があります。私はどちらの場合でもアクセサーに同じ名前を付けることに重点を置いています。
統一アクセスの反論の1つは、データへのアクセスが非常に高速であるのに対し、計算は低速になる場合があるということです。クライアントプログラマーにメソッドが応答するまで時間がかかる場合があることを示すのは役立ちます。私はこれを特別なケースとして扱いたいと考えています。非常に低速な計算がない限り(その低速さは測定済みである必要があり、単に低速になると想定されるものであってはなりません)、統一アクセス原則に従います。そのような場合は、キャッシングアクセサーなど、他の選択肢もあります。
統一アクセスはgetterとsetterの両方に適用されますが、計算アクセサーは多くの場合読み取り専用です。プロパティが読み取り専用であるかどうかにかかわらず、格納されるか計算されるかは別個の問題です。
メモ
1: この原則の定式化は第2版からのものです。第1版では、彼はそれを統一参照原則(§2.1.4)と呼びました。第2版ではそれを統一アクセス原則に変更し、引用された定義を与えました。