2011-06-09 111 views
1

我很新的面向對象編程(在PHP和Posix shell編程中有腳本知識),我正在研究一個啤酒配方應用程序。我已經開始了這個項目,但是我認爲從MVC的角度來看這個設計並不好。我希望你能幫我設計正確。這裏有一些關於應用程序的知識。需要關於應用程序設計(MVC,類等)的幫助

該應用程序需要是基於文檔的應用程序(在Beer XML中打開/保存食譜)。主窗口有幾個文本框來設置信息,例如:名稱,beertype,音量等。然後有幾個與數組的表格匹配:麥芽,啤酒花和香料,每個都有自己的表格來添加值。

我該如何製作課程?喜歡這個?

  • NSDocument類(與打開/保存XML代碼)
  • (3×)NSWindowController(每片:麥芽,啤酒花,香料)
  • (3×)NSArrayController的(對於每個的tableview:麥芽,啤酒花,香料)

應該由NSArrayController對象管理的數組是否是單獨的類(在MVC透視圖中(如Model)),還是應該將它們合併到它們的NSArrayController類中?

+0

從開始的名稱中刪除「NS」前綴。 – 2011-06-09 21:07:17

+0

數組已經有了類,爲什麼你要創建更多的類? – 2011-06-09 21:09:59

+0

我的意思是你應該有一個類,比如叫做hopBill。有哪些方法可以從hopBill中添加/刪除hopAdditions。讓數組控制器管理類中的數組? – Joran 2011-06-10 06:36:31

回答

0

我會開始梳理一些Apple提供的文檔:Object-Oriented Programming with Objective-CCocoa Fundamentals Guide

我也會看看使用核心數據。以相對較少的執行你有一個非常強大的數據結構(M在MVC),很容易與您的觀點和看法控制器(在V & C)來實現: Core Data Programming Guide

我強烈建議你閱讀這些。他們並不是不好的讀物,你會獲得豐富的知識。蘋果文檔真的是最好的。

祝你好運。

+0

是的,我已經做了很多的閱讀(並且仍在閱讀)。但我只是想知道我是否在正確的軌道上。 – Joran 2011-06-10 08:52:53

0

假設這些都是您的要求,

使用XML(beerxml)
  • 編輯器應用程序,因爲它的數據源。
  • 查看器顯示的可用數據(以表格的形式或作爲片材)
  • 用戶可以在每個XML
  • 添加/刪除/編輯條目存在着個XML(數據源)之間的關係(不確定... )

在應用任何設計模式之前,您應該開始應用基本的OOP概念來識別和創建類(狀態和行爲)並定義類之間的關係。例如,receipes.xml用於表示用於製造產品的配方。爲此設計一個類通過xml。您可以識別以下數據類別(對象即類的實例代表現實世界的實體,而類是對象更像一個模板/藍圖):

  • 配方(主類)
  • 發酵
  • 酵母
  • 風格
  • 設備
  • MashStep 等。

確定了構成數據模型(信息存儲庫)的類後,確定每個類的屬性和行爲。例如,Yeast類將包含屬性NameVersion等。不要擔心屬性的類型(字符串,整數等)。

要識別控制器,請從用戶的角度查看應用程序。什麼是用例(用戶如何處理應用程序?編輯?添加?等)。這些用例會無意中要求處理特定流程(序列)中的信息。這些信息在您的模型類中可用。控制器將調用對模型類的操作並確定它們之間的交互。

例如,假設有一個用例需要向系統添加新的酵母。然後,控制器將創建一個Yeast類的新實例,並用用戶提供的值填充它(在執行某種驗證之後)。然後將創建的酵母添加到ListOfAvailableYeasts並提供給其他類。

該視圖(正如其名稱所示)是您的數據的用戶界面。在MVC中,視圖通常由觀察者更新,觀察者監視模型的變化並相應地更新UI(MVC模式有幾種變化)。

要點這裏應該首先關注物體方向設計,而不是直接跳入設計模式。

如果您需要關於如何從xml創建類的一些指導,請參閱xsd.exe工具。您可以從xml生成xsd(xml schema),然後使用此xsd爲xml生成類層次結構(我建議您先從recipes.xml開始)。您可以將生成的類修改爲您的要求。

生成的類會是這個樣子,

/// <remarks/> 
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.3038")] 
[System.SerializableAttribute()] 
[System.Diagnostics.DebuggerStepThroughAttribute()] 
[System.ComponentModel.DesignerCategoryAttribute("code")] 
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)] 
public partial class RECIPESRECIPE { 

    private string nAMEField; 

    private string vERSIONField; 

    private string tYPEField; 

    private string bREWERField; 

    private string aSST_BREWERField; 

    private string bATCH_SIZEField; 
... 
} 


希望這是足以讓你開始。