2013年10月9日 星期三

[OOP] Are getter and setter methods evil?

[OOP] Are getter and setter methods evil?

Question: 如果 class O 含有屬性 foo,該如何提供存取的方式?

class O {
    private int foo;
}

Answer: 以下提供各種從具體(concrete)到抽象(abstract)的做法與觀點

 * A1 直接將屬性的可見度提昇到 public
class O {
    public int foo;
}

破壞物件導向的基本原則:封裝
物件的狀態失去控制(如果需要檢查foo的值則要在所有客戶端檢查)
最高的耦合度(一旦class O的實作改變會影響到所有客戶端)


*A2 提供存取子(accessors) getter 與 setter 來存取屬性
class O {
    private int foo;
    public void setFoo(int foo) { this.foo = foo; }
    public int getFoo() { return foo; }
}

很好的維持資料抽象的原則(封裝資料的細節不需要客戶端操心)
物件的狀態會受到客戶端的影響
高耦合度(客戶端依賴物件的狀態)
所有的屬性都要提供存取子造成介面失控(存取子並非物件的責任)


*A3-1 只提供 getter 來詢問物件的狀態
class O {
    private int foo;
    private void setFoo(int foo) { this.foo = foo; }
    public int getFoo() { return foo; }
}

將處理屬性的細節封裝在物件之中
低耦合度(客戶端可能依賴物件的狀態)

*A3-2 某些屬性不提供存取子

class O {
    private int foo;
    private void setFoo(int foo) { this.foo = foo; }
    private int getFoo() { return foo; }
}

將處理屬性的細節封裝在物件之中,客戶端無須關心物件的狀態

A3的重點在於檢查每個屬性是否需要存取子,避免存取子的過度使用


*A4 不提供存取子
class O {
    private int foo;
}

請擁有該屬性的物件完成工作,而不是取得所有所需的狀態來完成工作。
(Don't ask for the information you need to do the work; ask the object that has the information to do the work for you.)
如果有碰到無法使用這個規則的情況,請仔細思考物件的責任到底是什麼。
(from procedural programming to object-oriented programming)

結論

以物件導向的觀點,是否需要存取子?
存取子並非絕對邪惡的存在,但是濫用存取子存取物件的狀態很容易影響程式的彈性與易維護性。
因此最好的方式是盡可能的避免使用存取子。(仍然有例外情況:與使用者介面互動或與資料庫互動的物件)

使用的關鍵是決定於設計的抽象程度,如果想要以完成任務為優先的話是可以省略抽象化的過程(隨性的使用存取子)。
至於因為耦合度增加而造成的痛苦的維護工作就交給後人去煩惱囉:)

延伸閱讀
Tell, don't ask
http://robots.thoughtbot.com/post/27572137956/tell-dont-ask
http://pragprog.com/articles/tell-dont-ask

programming to an interface
http://www.fatagnus.com/program-to-an-interface-not-an-implementation/

Reference:

http://www.javaworld.com/javaworld/jw-09-2003/jw-0905-toolbox.html

http://stackoverflow.com/questions/996179/allen-holub-wrote-you-should-never-use-get-set-functions-is-he-correct
http://stackoverflow.com/questions/9212861/proper-way-of-getting-variable-from-another-class
張貼留言

熱門文章