2015-06-27

[Clean Code] 閱讀筆記 - Ch. 6

第六章的標題是物件及資料結構(Objects and Data Structures)。這個章節可以歸納為兩個重點:物件(object)與資料(data)的差異;德摩特爾法則(The Law of Demeter)。

使用單純的資料結構時,只定義成員(member)而不提供方法(method),就像是C語言的struct [link],資料內的成員可以直接被使用,所有的邏輯運算都在資料結構的外部操作。以Python實作的話如下:
使用物件時,同時定義成員與方法,但是成員變數被封裝在物件內,所有的操作只能透過物件提供的方法。Python實作如下:
物件與資料結構間存在著反對稱性(anti-symmetry)。從外部來看,資料結構提供可操作的成員,但是無法使用方法(因為根本沒有);物件提供可操作的方法,但是隱藏其內部成員的細節(Python無法封裝其成員不被外部使用,但是可以透過命名慣例來區隔避免誤用:self._fooself.__bar)。

這樣的反對稱性,會影響新功能的擴充。假設未來想要增加一個計算周長的方法,在資料結構的實作中,只需要變更class Geometry就好,在其內部增加def perimeter即可;但是對於物件的實作來說,卻需要變更class Shape, class Square, class Rectangle, class Circle,變動非常大。相反地,假設要增加一個新的形狀class Triangle,在物件的實作中,就只需要新增class Triangle(Shape);在資料結構的實作中,除了新增class Triangle外,還必須修改class Geometry內所有的操作方法。

使用物件好還是使用資料結構好?需要看未來可能的需求而定。如果類別可能增加但是類別的方法不會再改變,比較適合使用物件;如果類別變動的機會少,但是有可能一直增加新的方法,比較適合使用資料結構。

這一章的另一個主題為The Law of Demeter,這個法則是針對物件的實作的定。
More precisely, the Law of Demeter says that a method f of a class C should only call the methods of these:
* C
* An object created by f
* An object passed as an argument to f
* An object held in an instance variable of C
Python的實作: The Law of Demeter提供物件封裝其成員變數的法則,避免外部直接取得物件的成員而操作,所有對物件成員的操作必須封裝在物件的方法之內。物件本身必然瞭解其內部成員如何使用與操作,因此將運算邏輯實作於物件的方法內是合理的,也讓整體的程式架構更好維護。這樣做的好處是,當該物件必須變更其內部成員時,外部的使用者不需要修改其操作,如此一來可將所有的變更侷限於該物件本身,程式的維護性更好。
Post a Comment