【问题标题】:Need help with application design (MVC, classes etc.)在应用程序设计(MVC、类等)方面需要帮助
【发布时间】:2011-06-09 20:02:53
【问题描述】:

我是面向对象编程的新手(确实有 PHP 和 Posix shell 编程方面的脚本知识),我正在开发啤酒配方应用程序。我已经开始了这个项目,但我想从 MVC 的角度来看,这个设计并不是那么好。我希望你能帮助我正确设计。以下是有关该应用程序的一些信息。

应用程序必须是基于文档的应用程序(在Beer XML 中打开/保存食谱)。主窗口有几个文本字段来设置信息,例如:名称、啤酒类型、体积等。然后有几个带有数组的表格视图:麦芽、啤酒花和香料,每个都有自己的表用于添加值。

我应该如何上课?像这样?

  • NSDocument 类(带有打开/保存 XML 代码)
  • (3x) NSWindowController(每张纸:麦芽、啤酒花、香料)
  • (3x) NSArrayController(对于每个 tableview:麦芽、啤酒花、香料)

由 NSArrayController 对象管理的数组应该是单独的类(在 MVC 角度(作为模型))还是应该合并到它们的 NSArrayController 类中?

【问题讨论】:

  • 从名称中删除“NS”前缀作为开始。
  • 数组已经有了类,为什么还要创建更多的类?
  • 我的意思是你应该有一个类,例如叫 hopBill。其中有从 hopBill 添加/删除 hopAdditions 的方法。并让数组控制器管理类中的数组?

标签: objective-c model-view-controller class object


【解决方案1】:

我会先复习一些 Apple 提供的文档:Object-Oriented Programming with Objective-CCocoa Fundamentals Guide

我也会考虑使用 Core Data。通过相对较少的实现,您就拥有了一个非常强大的数据结构(MVC 中的 M),它很容易用您的视图和视图控制器(V 和 C)来实现: Core Data Programming Guide

我强烈推荐阅读这些。它们的阅读效果不错,您可以获得大量知识。 Apple 文档确实是最好的。

祝你好运。

【讨论】:

  • 是的,我已经读了很多书(现在还在读)。但我只是想知道我是否走在正确的轨道上。
【解决方案2】:

假设这些是您的要求,

  • 使用 xml (beerxml) 作为数据源的编辑器应用程序。
  • 显示可用数据的查看器(以表格格式或表格形式)
  • 用户可以在每个 xml 中添加/删除/编辑条目
  • xml(数据源)之间存在关系(不确定...)

在应用任何设计模式之前,您应该开始应用基本的 OOP 概念来识别和创建类(状态和行为)并定义类之间的关系。

例如,receipes.xml 用于表示用于制造产品的配方。要为此设计一个类,请通过 xml。您可以识别以下数据类(对象,即类的实例代表真实世界的实体,而类更像是对象的模板/蓝图):

  • 食谱(主课)
  • 可发酵
  • 酵母
  • 风格
  • 设备
  • 捣碎
  • MashStep 等等。

确定构成数据模型(信息库)的类后,确定每个类的属性和行为。例如,Yeast 类将包含属性NameVersion 等。不用担心属性的类型(字符串、整数等)。

要识别控制器,请从用户的角度查看应用程序。用例是什么(用户对应用程序做了什么?编辑?添加?等等)。这些用例会无意中需要在特定流(序列)中处理信息。该信息在您的模型类中可用。控制器将调用模型类上的操作并确定它们之间的交互。

例如,假设有一个用例,用户需要向系统添加新的酵母。然后控制器将创建Yeast 类的新实例,并使用用户提供的值填充它(在执行某种验证之后)。然后将创建的酵母添加到ListOfAvailableYeasts 并提供给其他类。

视图(顾名思义)是数据的用户界面。在MVC 中,视图通常由观察者更新,观察者监视模型的变化并相应地更新 UI(MVC 模式有几种变体)。

这里的要点是,您应该首先关注面向对象的设计,而不是直接跳入设计模式。

如果您需要一些关于如何从 xml 创建类的指南,请查看xsd.exe 工具。您可以从 xml 生成 xsd(xml 架构),然后使用此 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;
...
}


希望这足以让您入门。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-09
    • 2011-08-06
    • 1970-01-01
    • 1970-01-01
    • 2011-04-27
    相关资源
    最近更新 更多