2009-01-22 19 views
5

我們正在爲GIS應用程序開發一個擴展(在C#.NET環境中),該應用程序將具有用於建模現實世界對象的預定義類型 ,從GenericObject開始,以及去更具體的類型,如管道道路與他們的詳細屬性和方法像BottomOfPipe,Diameter等。對象模型設計中的重要規則

當然,會有一個對象模型接口 S,繼承和大量的其他的TypeLibrary主要部分,而現在我們固定其中的一些。但是你可能知道,設計一個對象模型是一個非常模糊的工作,並且(盡我所知)可以用許多不同的方式完成,並且有許多不同的結果和弱點。

是否有任何不同的規則設計O.M.:在層次,定義接口 S,摘要coclasse小號枚舉 S的方法是什麼?

任何建議,參考或實踐?

+0

我建議你閱讀以下系列博客文章Brad Adams, FrameWork Design Guidelines 2009-01-22 13:37:23

回答

3

幾個好的的:

SOLID

小號英格爾責任原則
Ø筆/關閉原則
大號 iskoff替換原則
覆蓋整個院落隔離原則
d ependency倒置原則

更多信息和更多的原則在這裏: http://mmiika.wordpress.com/oo-design-principles/

+0

非常好的建議。鮑勃馬丁的任何內容都會有幫助。 – duffymo 2009-01-22 13:42:13

0

「BottomOfPipe」?那是說道路下方的管道深度的另一種方式嗎?

任何一種設計都很困難,可以通過不同的方式完成。無法保證您的設計在創建時可以正常工作。

設計滾珠軸承等人的優點是有更多年的經驗和數據來確定什麼可行,什麼不可行。軟件沒有太多時間或硬數據。

下面是一些建議:

  1. 繼承意味着IS-A。如果這不成立,則不要使用繼承。
  2. 深層次結構可能是麻煩的跡象。
  3. Scott Meyers:使非葉類接口或抽象。
  4. 更喜歡繼承的組合。
1

他們說的,再加上它看起來像你模擬真實世界的實體,所以:

  • 限制你的對象模型,以精確地匹配真實世界的實體。

您可以使用繼承和組件來減少代碼/模型,但只能以對底層域有意義的方式使用。

例如,具有Diameter屬性的Pipe類將有意義,而具有GeometryType.Pipe的GeometryType屬性的DiameterizedObject類(具有Diameter屬性)則不會。這兩種模式都可以起作用,但前者顯然與問題領域相對應,後者則實現了人造(非現實世界)的視角。

還有一條線索:當你發現自己發現了你從一開始就沒有計劃的代碼中的新功能時,你就知道你的模型是正確的 - 它們只是「自然」脫離了模型。例如,您的模型可能具有管道和接頭類(作爲連接適配器)足以解決(比方說)將不同直徑的管道彼此連接並計算流量,最大壓力和結構完整性的直接問題。您後來認識到,由於您準確模擬了管道和連接點的結構和連接屬性(在域的要求範圍內),您還可以從連接的管道創建一個JungleGym對象,並正確計算它將承受多少結構載荷。

這是一個極端的例子,但它應該得到重點:正確的對象模型支持擴展,並且經常會顯示有益的意外屬性和功能(而不是bug)。

1

Liskov Substitution Principle,通常用「is-a」表示。 OOP的許多例子會更好利用的「有-A」(在C++中私有繼承或明確的成分),而不是公有繼承(「是一個」)

獲得繼承權是。這樣做的接口(純虛擬類)往往比基類/子類更容易