比方說,我有一個對象Car,並且它有不同的方法集合?也許變得像Blob一樣? (如在反模式中,「blob」)這些方法運行在足夠明確的集合中,並且在功能上並不真正交叉。新方法去哪裏?
Car
# methods related to suburban driving
->foo1
->foo2
# methods related city driving
->bar3
->bar4
現在讓我們假設我想添加「越野駕駛」爲我的車對象可以支持的案例之一。如果我向Car對象添加方法,是不是讓它更像blob?
Car (augmented)
# methods related to suburban driving
->foo1
->foo2
# methods related city driving
->bar3
->bar4
# methods related off road driving
->blah5
->blah6
我應該:
答:子類汽車。我可以做一個OffRoadCar擴展Car對象。但是如果Car和OffRoadCar共享相同的數據/狀態,並且只有方法不同,該怎麼辦? OffRoadCar只是比汽車更具體的「行爲」,但沒有更具體的描述,也沒有獨特的領域。因此實例化OffRoadCar是毫無意義的。
OffRoadCar extends Car
# methods related off road driving
->blah5
->blah6
B:汽車消費用靜態方法。喜歡OffRoadAdventure->出發(汽車)。因此,OffRoadAdventure類需要一個Car對象,並且有它的方式。
在C#中這將被稱爲擴展方法。
我想換一種方式是Blob反模式的解決方案是什麼?它是繼承嗎?它是擴展方法嗎?
另外,我想孤立這些方法的另一個原因是如果它們的實現會產生一些成本,比如包含其他類/包?我不希望核心課程的用戶經常爲他們永遠不會使用的東西付費。我認爲,爲少數人制定明確的成本是值得大多數人節省的。它使依賴圖更加精確(而不是像blob一樣)。
PS - 實現語言是Perl。
車必須是班嗎? Car可以成爲ICar(接口)嗎?我會建議一個繼承的組合路線。 – OnResolve 2012-02-14 22:28:09
汽車已經是一個真正使用的類。 (它實際上是一個ORM神器) – 2012-02-14 22:30:14