PHP 雜談《重構-改善既有代碼的設計》之三 重新組織數據

思維導圖

介紹

這章主要針對數據的重構。
1、爭論的聲音——直接訪問Field還是通過函數(Accessor)訪問Field

2.修改Array爲Object:當你看到一個Array很像一個數據結構,你可以使用Replace Array with Object,把Array變成一個對象。——數據結構更清晰。

專業術語

accessor:訪問者,存儲器——在本文翻譯爲“函數”

dumb:啞

domain class:用以處理業務邏輯

presentation class:用以處理”數據表現形式“

business logic:業務邏輯

unidirectional:單向的

bidirectional:雙向的

collection:羣集

Self Encapsulate Field

狀況:如果Client直接訪問值域,會造成Client與值域之間的耦合關係逐漸變得笨拙,那麼爲這個值域建立取值/設置函數,並且只以這些函數來訪問。

動機:

  “間接訪問變量”:支持更靈活的數據獲取方式,如lazy Initialization(意思是隻有用到值時,纔對它進行初始化。)

  “直接訪問變量”:代碼比較容易閱讀,不需要停下來說:“啊,這只是個取值函數”。

選擇:1、代碼規範,按照團隊中大多數人的做法去做。

   2、個人比較喜歡“直接訪問變量”,直到這種方式帶來麻煩爲止。

martin(作者)的例子:你想獲取superclass中的field,卻又想在subclass中將該field改爲計算後的值,這就最該使用Self Encapsulate Field。

我自己的例子:我一般會把field設置成private,如果外部變量,需要用到此field的時候,我就會用Self Encapsulate Field。或者field的值有變化的時候,用Self Encapsulate Field。


Replace Data Value with Object

狀況:如果你的某個基本類型的field,需要額外的數據和行爲,那麼將此field變成對象。

動機:

開發初期,我們也許會使用基本數據類型表示簡單的行爲。例如:你可能會用一個字符串表示電話號碼,但是隨後可能會出現電話號碼的“格式化“,”驗證“,”抽取區號“之類的特殊行爲。——這時候我們就需要一個新類。

Replace Array with Object

狀況:你有一個數組,數組中的元素各自代表不同的東西,那麼以對象替換數組,對於數組中的每個元素,以一個值域表示之。

動機:

數組常用於一組相似對象。如果數組中的元素不同,很難明白數組中的第一個元素是人名這樣的約定。對象就不同了,可以通過值域名稱和函數名稱傳達這樣的信息。——這樣無須死記,無須註釋。

Encapsulate Field

狀況:如果你的class中有一個public值域,那麼將它聲明爲pirvate,並提供相應的訪問函數。

動機:

面向對象的原則之一就是封裝(Encapsulate)或者稱爲”數據隱藏“。按照此原測,你絕不應該把數據聲明爲public。
  ——public 數據被看成是一種不好的做法。
  ——如果封裝了,代碼的修改就會比較簡單,因爲都集中在一個地方。
一個函數除了訪問函數(getting/setting)外,不提供其他行爲,它終究只是一個dumb class(啞類)。這類class不能獲得對象技術的優勢。——解決啞類的方法是Move Method輕快的將它們移到新對象去。


發佈了61 篇原創文章 · 獲贊 12 · 訪問量 44萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章