統一存取原則
2011 年 4 月 20 日
模組提供的服務應透過統一表示法提供,不會洩漏服務是透過儲存或運算實作。
-- Bertrand Meyer
Bertrand Meyer 在其極具影響力的著作 物件導向軟體建構 中提出此原則。[1]
此原則的重點在於,如果您有一個 person 物件,並要求它提供年齡,您應使用相同的表示法,無論年齡是物件的儲存欄位或運算值。這實際上表示 person 的客戶端不應知道或關心年齡是儲存或運算而來。

這讓 person 物件能夠輕鬆地在兩者之間切換,並消除客戶端通常不必要的疑慮。這是封裝的重要部分,或至少是封裝的資料隱藏面向。
儘管這是物件導向程式設計的基本功能,但很少有 OO 語言真正遵循此原則。(Eiffel 自然是個例外。)大多數語言透過慣例模擬此原則,因此 Java 和 C++ 程式中習慣使用存取器,例如 getAge
。
無論語言如何,重要的是程式設計師不要違反此原則。您經常會看到破壞統一存取的慣例。一個例子可能是說資料存取器命名為 getAge
,而運算存取器命名為 calcAge
。我堅持在兩種情況下都使用相同的方式命名存取器。
反對統一存取的一個論點是,資料存取很快,而運算可能很慢,而且讓客戶端程式設計師知道方法回應速度很慢會很有用。我比較喜歡將此視為特殊情況,除非運算特別慢(而且應該是已測量過很慢,而不仅仅是預期很慢),否則請遵循統一存取原則。在這種情況下,還有其他選項,例如快取存取器,您也可以探索。
統一存取適用於 getter 和 setter,儘管運算存取器通常是唯讀的。屬性是唯讀的與它是儲存或運算而來是不同的問題。
備註
1: 這個原則的表述來自第二版。在第一版中,他稱之為統一參考原則 (§2.1.4)。他在第二版中將其改為統一存取原則,並提供了引用的定義。