003-重新組織數(shù)據(jù)

重新組織數(shù)據(jù)

1. Self Encapsulate Field(自封裝字段)

Q:你直接訪問一個字段鹰祸,但與字段之間的耦合關(guān)系逐漸變得笨拙

A:為這個字段建立取值/設(shè)值函數(shù),并且只以這些函數(shù)來訪問字段

間接訪問變量的好處是蕴坪,子類可以通過覆寫一個函數(shù)而改變獲取數(shù)據(jù)的途徑背传;支持延遲初始化等台夺。

2. Replace Data Value with Object(以對象取代數(shù)據(jù)值)

Q:你有一個數(shù)據(jù)項,需要與其他數(shù)據(jù)和行為一起使用才有意義梳星。

A:將數(shù)據(jù)項變?yōu)閷ο?/strong>

業(yè)務(wù)一開始可能僅僅需要一個數(shù)據(jù)值,后續(xù)慢慢加入針對數(shù)據(jù)值的各種行為和關(guān)聯(lián)數(shù)據(jù)前域,此時 Duplicate Code 和 Feature Envy 的壞味道就會逐漸暴露。

3. Change Value to Reference(將值對象改為引用對象)

Q:你從一個類衍生出許多彼此相等的實例匿垄,希望將它們替換為同一個對象椿疗。

A:將這個值對象變成引用對象届榄。

之所以需要將值對象改為引用對象倔喂,通常的考慮是一些重復(fù)的對象需要同步改動,更直接的例子就是單例對象攻晒。

引用對象應(yīng)該由靜態(tài)字典或者注冊表對象來管理班挖,應(yīng)該考慮預(yù)先創(chuàng)建好還是動態(tài)創(chuàng)建萧芙,通常需要考慮使用工廠模式進行創(chuàng)建假丧。

4. Change Reference to Value(將引用對象改為值對象)

Q:你有一個引用對象包帚,很小且不可變,而且不易管理疯趟。

A:將它變成一個值對象谋梭。

引用對象必須被以某種方式控制瓮床,你必須向其控制者請求適當?shù)膶ο蟛洹K鼈兛赡茉斐蓛?nèi)存區(qū)域之間錯綜復(fù)雜的關(guān)聯(lián)癣亚。而值對象获印,特別是不可變的值對象蓬豁,使你無需考慮同步問題。

可變的引用對象是不應(yīng)該變?yōu)橹祵ο蟮娜∧迹驗槟菍⒁馕吨阈枰紤]各個值對象之間數(shù)據(jù)同步的問題玩敏。

5. Replace Array with Object(以對象取代數(shù)組)

Q:你有一個數(shù)組质礼,其中的元素各自代表不同的東西。

A:以對象替換數(shù)組砰粹。對于數(shù)組中的每一個元素造挽,以一個字段來表示饭入。

假如一個數(shù)組的元素根據(jù)其下標具備不同的含義和行為以及數(shù)據(jù)解釋方式,則對象更適合表示這些數(shù)據(jù)爽航。

6. Duplicate Observed Data(復(fù)制“被監(jiān)視數(shù)據(jù)”)

Q:你有一些領(lǐng)域數(shù)據(jù)置身于 GUI 控件中乾忱,而領(lǐng)域函數(shù)需要訪問這些數(shù)據(jù)。

A:將該數(shù)據(jù)復(fù)制到一個領(lǐng)域?qū)ο笾写觯⒁粋€ Observer 模式寞肖,用以同步領(lǐng)域?qū)ο蠛?GUI 對象內(nèi)的重復(fù)數(shù)據(jù)。

簡單來說觅赊,“讓數(shù)據(jù)歸數(shù)據(jù)吮螺,讓顯示歸顯示”;而實現(xiàn)這一特性離不開觀察者模式萝风。

7. Change Unidirectional Association to Bidirectional(將單向關(guān)聯(lián)改為雙向關(guān)聯(lián))

Q:兩個類都需要使用對方的特性规惰,但其間只有一條單向連接

A:添加一個反向指針歇万,并使修改函數(shù)能夠同時更新兩條連接勋陪。

如何確定由誰控制雙向關(guān)聯(lián)關(guān)系:

  • 如果兩者都是引用對象,且關(guān)聯(lián)關(guān)系是“一對多”的關(guān)系寒锚,那么就由“擁有單一引用”的那一方承擔“控制者”角色
  • 如果某個對象是組成另一個對象的部件壕曼,那么由后者負責控制關(guān)聯(lián)關(guān)系
  • 如果兩者是“多對多”的關(guān)系,由誰控制關(guān)聯(lián)關(guān)系都無所謂

8. Change Bidirectional Association to Unidirectional

Q:兩個類之間有雙向關(guān)聯(lián)摹蘑,但其中一個類如今不再需要另一個類的特性衅鹿。

A:去除不必要的關(guān)聯(lián)大渤。

維護雙向連接增加了復(fù)雜度,且容易造成內(nèi)存泄漏耕捞,增加模塊間耦合。

9. Replace Magic Number with Symbolic Constant(以字面常量取代魔法數(shù))

Q:你有一個字面數(shù)值敞映,帶有特別含義磷斧。

A:創(chuàng)造一個常量弛饭,根據(jù)其意義為它命名,并將上述的字面數(shù)值替換為這個常量档桃。

10. Encapsulate Field(封裝字段)

Q:你的類中存在一個 public 字段

A:將它聲明為 private胳蛮,并提供相應(yīng)的訪問函數(shù)仅炊。

11. Encapsulate Collection(封裝集合)

Q:有個函數(shù)返回一個集合抚垄。

A:讓這個函數(shù)返回該集合的一個只讀副本谋逻,并在這個類中提供添加/移除集合元素的函數(shù)毁兆。

取值函數(shù)不應(yīng)該返回集合自身气堕,因為這樣用戶修改集合內(nèi)容時集合擁有者將一無所知。

12. Replace Record with Data Class(以數(shù)據(jù)類取代記錄)

Q:你需要面對傳統(tǒng)編程環(huán)境中的記錄結(jié)構(gòu)揖膜。

A:為該記錄創(chuàng)建一個“啞”數(shù)據(jù)對象。

不要以代碼之外的規(guī)則約束代碼邏輯壹粟,例如以數(shù)組的不同下標來表示不同含義趁仙。

13. Replace Type Code with Class(以類取代類型碼)

Q:類之中有一個數(shù)值類型碼幸撕,但它并不影響類的行為。

A:以一個新的類替換該數(shù)值類型碼坐儿。

類型碼本質(zhì)上仍然是數(shù)值律胀,而非對象,因而編譯器無法做有效的類型檢查貌矿。

14. Replace Type Code with Subclasses(以子類取代類型碼)

Q:你有一個不可變的類型碼炭菌。

A:以子類取代這個類型碼。

在面向?qū)ο笮g(shù)語中逛漫,聽上去最高貴的詞非“多態(tài)”莫屬黑低。

將類型碼用子類封裝后,與類型碼相關(guān)的行為和特性也就可以封裝到子類中酌毡。

15. Replace Type Code with State/Strategy(以 State/Strategy 取代類型碼)

Q:你有一個類型碼克握,它會影響類的行為,但你無法通過繼承手法消除它枷踏。

A:以狀態(tài)對象取代類型碼菩暗。

16. Replace Subclass with Field(以字段取代子類)

Q:你的各個子類的唯一差別只在“返回常量數(shù)據(jù)”的函數(shù)身上。

A:修改這些函數(shù)停团,使它們返回超類中的某個(新增)字段旗芬,然后銷毀子類辆琅。

沒有行為只有數(shù)據(jù)的類應(yīng)當被移除暇屋。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌季眷,老刑警劉巖挺峡,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件病线,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進店門丧鸯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來剿干,“玉大人,你說我怎么就攤上這事榜轿∩韬郑” “怎么了?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵雪隧,是天一觀的道長马僻。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么我抠? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任俺夕,我火速辦了婚禮梦湘,結(jié)果婚禮上引有,老公的妹妹穿的比我還像新娘宫补。我一直安慰自己您单,他們只是感情好,可當我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布棍辕。 她就那樣靜靜地躺著楚昭,像睡著了一般抚太。 火紅的嫁衣襯著肌膚如雪踏揣。 梳的紋絲不亂的頭發(fā)上捞稿,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天剩愧,我揣著相機與錄音犬第,去河邊找鬼橙垢。 笑死惭等,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的辞做。 我是一名探鬼主播,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼寡具,長吁一口氣:“原來是場噩夢啊……” “哼秤茅!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起童叠,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤框喳,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后厦坛,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體五垮,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年杜秸,在試婚紗的時候發(fā)現(xiàn)自己被綠了放仗。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡撬碟,死狀恐怖诞挨,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情呢蛤,我是刑警寧澤惶傻,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站其障,受9級特大地震影響银室,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜励翼,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一蜈敢、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧抚笔,春花似錦扶认、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽狱从。三九已至,卻和暖如春叠纹,著一層夾襖步出監(jiān)牢的瞬間季研,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工誉察, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留与涡,地道東北人。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓持偏,卻偏偏與公主長得像驼卖,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子鸿秆,可洞房花燭夜當晚...
    茶點故事閱讀 44,914評論 2 355

推薦閱讀更多精彩內(nèi)容