回答
你大概的意思是「正確的階級」,而不是「合適的對象」。 :-)
有一些技巧,比如文本分析(又名下劃線的名詞)和Class Responsibility Collaborator (CRC)。
與「強調名詞」,你基本上從你想解決的問題的書面,自然語言(即簡單的英語)描述開始,並強調名詞。這給你一個候選班的名單。您需要執行多次傳遞才能將其細化爲要實現的類的列表。
對於CRC,check out the Wikipedia。
我建議The OPEN Toolbox of Techniques以供參考。
希望它有幫助。
我假設了解什麼是sctruct,類型,類,集合,狀態,字母,標量和矢量以及關係。
對象是名詞,方法是動詞。對象成員可以表示每個字段的標識,狀態或標量值。對象之間的關係通常用引用來表示,其中引用是對象的成員。在情況下,當關系複雜,多方向,聯盟大於2時,表示某種分組或遏制,則關係可以表示爲對象。
對於其他更廣泛的技術原因,對象很可能是用OOP語言表示任何形式的信息的唯一方法。
是的,但它給了你一個常見的例子..一個購物車,在那裏,也許你可能想添加add_items,check_out到客戶類,而不是創建一個shoppingCart類..那麼線是哪裏? .. – demian 2009-12-02 00:51:45
是的,客戶是上課的。問題:購物車是否是1-1(正好一個)?讓我們做生命週期測試。客戶的信息是否比他的購物訪問時間長。例如,在您的設計中,您會說「是的,我們堅持將它放在數據庫中,以便進行下次可能的購物訪問」。好吧,另一個生命週期測試。您的購物車是否只有一個客戶?例如,你回答「不,我們有匿名存根,當匿名訪問者不能識別他/她時,它不是真正的客戶」。然後它是一個單獨的課程。 – 2009-12-02 01:01:39
偉大的答案RocketSurgeon ..幫助我很多,謝謝! – demian 2009-12-02 02:31:02
剛寫的東西能夠完成任務,即使它的醜陋,然後連續重構:
但:
- 不要過度工程; keep it simple
- 不寫東西you ain't gonna need
這不是一個精確的配方,只是一些一般準則。保持練習。
P.S.
代碼對象是而不是與有形的現實生活中的物體有關;它們只是將相關信息放在一起的結構。
不要相信Java書籍/學校教授的對象;他們在撒謊。
+1好的答案,如果更短,會更好。 :)好的面向對象設計專注於擊中這5個重點(特別是關於內聚和耦合!)和(我會補充)提供人們可以輕鬆使用的簡單API。 *不*匹配類到名詞和動詞的方法。 – 2009-12-02 15:22:08
謝謝!我會盡量縮短一點。 提供甜美的APIs本身就是一個藝術領域。我的意思是,任何程序員都可以像DOM那樣想出一個API,但有多少人能夠像jQuery一樣提供API? – hasen 2009-12-02 15:32:59
您應該檢查出Domain-Driven Design,通過Eric Evans。它提供了非常有用的概念來思考模型中的對象,它們在域中的功能以及如何組織它們一起工作。這不是一本食譜,而且很可能不是一個初學者的書 - 但後來,我在我的職業生涯的不同階段閱讀,而且每次我發現有東西在裏面寶貴的時間...
alt text http://www.domaindrivendesign.org/sites/default/files/images/cover_small.jpg
我增加了第二個答案由於德棉的評論:
有時候類是那麼明顯 ,因爲它是有形的,但其他時候 對象的概念是抽象 如DB連接器。
的確如此。我的首選方法是對系統執行行爲分析(例如使用用例),然後派生系統操作。一旦你有一個穩定的系統操作列表(例如文字處理器的PrintDocument,SaveDocument,SpellCheck,MergeMail等),你需要將它們分配給一個類。如果您已經使用我之前提到的某些技術開發了候選班級列表,您將能夠分配一些操作。但有些將保持未分配狀態。這些將表明您需要更抽象或不直觀的課程,您需要使用您的良好判斷來彌補。
整個方法記錄在www.openmetis.com的白皮書中。
- 1. 面向對象的Ereg選擇選項
- 2. 面向對象的設計選擇
- 3. 選擇對象
- 4. 選擇對象
- 5. 能夠選擇對象UIpageControl
- 6. 對象選擇內部的Javascript對象
- 7. 選擇對象鍵
- 8. 選擇在對象
- 9. 選擇子對象
- 10. mel2pyStr選擇對象
- 11. JSTL對象:選擇
- 12. 任何時候都可能死於多個對象的對象
- 13. 在JSON對象中選擇#document對象
- 14. 從對象中選擇對象
- 15. Revit Python拾取對象/選擇對象
- 16. 當選擇新對象時,AS3取消選擇其他對象
- 17. 如何更新jQueryUI的選定對象可以用AngularJS選擇?
- 18. 如何選擇kinetic.js中的對象?
- 19. 如何選擇DataGridView的對象
- 20. PowerShell的:選擇對象
- 21. Unity中的對象選擇
- 22. 的JavaScript對象jQuery選擇
- 23. CreateCompatibleBitmap Vs的選擇對象
- 24. 的UI對象源選擇
- 25. Django的選擇對象in_bulk()
- 26. 隨機選擇的對象 -
- 27. jQuery選擇和對象選擇
- 28. 如何選擇單元格對象如何選擇
- 29. 選擇UITableView裏面的對象由UIPickerView選擇
- 30. Linq選擇新對象性能
你在說什麼語言? – yoda 2009-12-02 00:38:31
誰在乎?設計是語言不可知的。 :-) – CesarGon 2009-12-02 00:42:06
我沒有時間把這個擴展到一個完整的答案,但是「這很難,尤其是在陌生的問題領域,它需要經驗和品味。就我個人而言,我還沒有找到任何真正有幫助的方法。 : - \ – 2009-12-02 00:45:13