l

2014年4月14日 星期一

談談壞味道(4):Shotgun Surgery & Feature Envy

Mar. 24 12:20~13:00

image

 

Shotgun Surgery(霰彈式修改)

Shotgun surgery的意思是「某種修改會跨越多個類別」,與上一集介紹的divergent change剛好相反。為什麼「某種修改會橫跨多個類別」?這種現象很明顯是某種責任分散在多個類別身上,例如每個類別都需要將自己存到到資料庫中,因此都存了一份資料庫連線資料的connection string變數。如果資料庫連線改變,則需要到每一個類別中去修改這個connection string變數。

另外,萬惡的「duplicated code」也會造成shotgun surgery,因為相同的程式碼重複出現在不同的地方,一但這些程式碼需要異動,就必須找出所有的duplicated code加以修改。

一但程式出現了shotgun surgery這種「牽一髮而動全身」的症狀,每次修改所影響的範圍很大,因此也增加了測試的困難度。最後,分散在不同類別的相同或相似責任,也會增加理解系統的困難度。

以上總結shotgun surgery之所以會是一個bad smell的原因(force)可歸類為:modifiability、testability、understandability這三點。

***

移除shotgun surgery壞味道的方法,在《Refactoring》書中提到可以套用Move Method、Move Field、Inline Class。

***

Feature Envy(特性依戀)

Feature envy是指函數對於其他類別的興趣高於自己所處的類別,也就是說這個函數一天到晚跟「隔壁老王」或「小三」在那裏「line來line去」,對於「家務事」卻興趣缺缺。遇到這種情況,最好的方法就是「放生」,就讓依戀的雙方「吳鳳接鬼」吧挑眉質疑

在某些特定情況,feature envy是一種「讓變化只發生在一處(localize modification)」的特殊設計,像是GoF Design Patterns裡面的Visitor、Strategy,visitor、strategy這些類別總是存取context裡面的資料。此為「特意為之」的feature envy,請安心服用。

Feature envy顯然是「內聚力」不夠的一種現象,feature envy之所以會是一個bad smell的原因(force)可歸類為:understandability、usability、testability、modifiability這四點。

***

移除feature envy壞味道的方法,在《Refactoring》書中提到可以套用Move Method、Extract Method。

***

友藏內心獨白:沒好沒壞,端看造化而定。

沒有留言:

張貼留言