May 7 10:50~ 11:34
Inappropriate Intimacy(不當的親密關係)
Inappropriate是不當、不妥的意思,intimacy是親密的意思,兩個字合起來翻譯成「不當的親密關係」。中文版的《Refactoring》稱此為「狎暱關係」,用語比較典雅一些。
如果A、B兩個類別,彼此頻繁地讀取對方的資料,則這種關係可能就屬於Inappropriate Intimacy壞味道。Inappropriate Intimacy隱含著責任分派不妥當,所以兩個類別才需要頻繁地讀取對方的資料。要破除這種關係,可以套用Move Method和Move Field把函數和資料移到合適的類別身上,或是套用Change Bidirectional Association to Unidirectional,把雙向耦合變成單向耦合。如果有些函數或資料同時都會被A、B這兩個類別使用,移到任何一個人身上都不合適,則可以套用Extract Class,把這些共同的行為或資料抽離出來。如果Inappropriate Intimacy是因為繼承所造成的subclass與superclass之間的關係,則可以套用Replace Inheritance with Delegation來避免繼承。
最後,可以套用Hide Delegate(也就是增加Middle Man)來隔離兩個過於親近的類別。
***
如果兩個類別過於了解彼此的細節,則在閱讀程式的時候,需要同時看懂這兩者,增加理解的困難度。此外,則任一方的改變都可能造成另一方的連動變化。對測試而言,安排測試環境也會變得比較複雜。因此,Inappropriate Intimacy之所以會是一個bad smell的原因(force)可歸類為:understandability、modifiability與testability這三點。
***
友藏內心獨白:從繼承的角度來看這個壞味道比較容易理解。
沒有留言:
張貼留言