2009-12-02 26 views
2

我很擔心我應該使用什麼技術來選擇OOP中的正確對象面向對象 - 如何選擇可能的對象候選人?

有沒有關於如何選擇對象的OOP的必讀書?

最佳,

+0

你在說什麼語言? – yoda 2009-12-02 00:38:31

+2

誰在乎?設計是語言不可知的。 :-) – CesarGon 2009-12-02 00:42:06

+3

我沒有時間把這個擴展到一個完整的答案,但是「這很難,尤其是在陌生的問題領域,它需要經驗和品味。就我個人而言,我還沒有找到任何真正有幫助的方法。 : - \ – 2009-12-02 00:45:13

回答

2

你大概的意思是「正確的階級」,而不是「合適的對象」。 :-)

有一些技巧,比如文本分析(又名下劃線的名詞)和Class Responsibility Collaborator (CRC)

與「強調名詞」,你基本上從你想解決的問題的書面,自然語言(即簡單的英語)描述開始,並強調名詞。這給你一個候選班的名單。您需要執行多次傳遞才能將其細化爲要實現的類的列表。

對於CRC,check out the Wikipedia

我建議The OPEN Toolbox of Techniques以供參考。

希望它有幫助。

+0

是的,我的意思是正確的類 – demian 2009-12-02 00:46:11

+0

當然。 :-)看一下這些技術,如果可以的話,那本書。 – CesarGon 2009-12-02 00:47:17

0

我假設了解什麼是sctruct,類型,類,集合,狀態,字母,標量和矢量以及關係。

對象是名詞,方法是動詞。對象成員可以表示每個字段的標識,狀態或標量值。對象之間的關係通常用引用來表示,其中引用是對象的成員。在情況下,當關系複雜,多方向,聯盟大於2時,表示某種分組或遏制,則關係可以表示爲對象。

對於其他更廣泛的技術原因,對象很可能是用OOP語言表示任何形式的信息的唯一方法。

+0

是的,但它給了你一個常見的例子..一個購物車,在那裏,也許你可能想添加add_items,check_out到客戶類,而不是創建一個shoppingCart類..那麼線是哪裏? .. – demian 2009-12-02 00:51:45

+2

是的,客戶是上課的。問題:購物車是否是1-1(正好一個)?讓我們做生命週期測試。客戶的信息是否比他的購物訪問時間長。例如,在您的設計中,您會說「是的,我們堅持將它放在數據庫中,以便進行下次可能的購物訪問」。好吧,另一個生命週期測試。您的購物車是否只有一個客戶?例如,你回答「不,我們有匿名存根,當匿名訪問者不能識別他/她時,它不是真正的客戶」。然後它是一個單獨的課程。 – 2009-12-02 01:01:39

+0

偉大的答案RocketSurgeon ..幫助我很多,謝謝! – demian 2009-12-02 02:31:02

4

剛寫的東西能夠完成任務,即使它的醜陋,然後連續重構:

但:

這不是一個精確的配方,只是一些一般準則。保持練習。

P.S.

代碼對象是而不是與有形的現實生活中的物體有關;它們只是將相關信息放在一起的結構。

不要相信Java書籍/學校教授的對象;他們在撒謊。

+1

+1好的答案,如果更短,會更好。 :)好的面向對象設計專注於擊中這5個重點(特別是關於內聚和耦合!)和(我會補充)提供人們可以輕鬆使用的簡單API。 *不*匹配類到名詞和動詞的方法。 – 2009-12-02 15:22:08

+0

謝謝!我會盡量縮短一點。 提供甜美的APIs本身就是一個藝術領域。我的意思是,任何程序員都可以像DOM那樣想出一個API,但有多少人能夠像jQuery一樣提供API? – hasen 2009-12-02 15:32:59

0

我增加了第二個答案由於德棉的評論:

有時候類是那麼明顯 ,因爲它是有形的,但其他時候 對象的概念是抽象 如DB連接器。

的確如此。我的首選方法是對系統執行行爲分析(例如使用用例),然後派生系統操作。一旦你有一個穩定的系統操作列表(例如文字處理器的PrintDocument,SaveDocument,SpellCheck,MergeMail等),你需要將它們分配給一個類。如果您已經使用我之前提到的某些技術開發了候選班級列表,您將能夠分配一些操作。但有些將保持未分配狀態。這些將表明您需要更抽象或不直觀的課程,您需要使用您的良好判斷來彌補。

整個方法記錄在www.openmetis.com的白皮書中。