2011-06-09 83 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; 
... 
} 


希望这是足以让你开始。