2012-02-08 150 views
1

我正在写一个flashcard程序,并且遇到我写这类Forms程序时总会遇到的问题。C#Windows窗体的设计模式

我会描述一下这个程序的问题。

在这个程序中,一个主窗体控制几乎所有的动作。根据用户的输入和形式的活动,不同的按钮/控件可以被启用或禁用,各种箱文本可被填充等

例如:

  • 有些问题可能是选择题和其他需要输入输入。
  • 用户输入他们的答案,然后点击一个按钮 - 如果他们有什么问题,他们可以选择重写“错误答案”的判断,并说这是一个不同的,正确的变体。
  • 关于哪些问题得到了正确回答的统计数据会保留下来,并用于决定下一步显示哪些闪存卡。

现在的问题。

如何最好地创建“表单”代码(例如,处理OK按钮的onclick命令,启用或禁用各种控件)和“逻辑”代码(底层数据存储,程序逻辑)之间的干净交互没有立即影响显示)?如果它们全都以表单对象代码的形式混合在一起,那看起来不太合适。

任何人都可以提出一个设计模式(特别是一个广泛使用),管理这干净吗?

在情况下,它是有关我想到的是这样的:

  • 对象模型:
    • 类MyForm的:窗体本身。
    • 类FormController:
      • 子类的MyForm。
      • 实例化需要MyForm类型的对象。
      • 的FormController的工作就是把它的MyForm的对象为特定的“状态”,通过启用/禁用的控制,显示各种文字等
      • 的FormController公开了一小部分,其处理的语义高层要求公共职能形式状态(如“DisplayNewQuestion(QuestionData d)”)
    • 堂课:包含所有底层持久性数据或对象,涉及本次会议,其中包括可能出现的问题的列表,从列表中选择下一个问题的对象,等等。
    • 类驱动程序:驱动Session和FormController对象。例如,它会向Session对象提出一个新问题,并将其传递给FormController对象以更新表单。

的优势,这样的事情是恶心形式的代码和漂亮的逻辑代码现在已经完全分离。但是值得吗?有更好或更常见的设计模式吗?

谢谢!

回答

2

在这种情况下,我总是最熟悉模型视图控制器。在树荫开发者写的最明智系列中,我曾经在主题阅读,see here

MVC的JIST是

模式包含要显示

数据

查看是您的形式并且仅具有用于显示和通知用户交互的逻辑

控制器包含使所有这些发生的胶水,包括总线逻辑。

的depenencies应该是

模型犯规了解视图或控制器

查看知道的模型,并且知道如何从中提取数据以显示

控制器知道模型和视图,instaniates他们两个并将他们连接在一起。

模型在事件发生变化时引发事件,视图捕获此事件并相应地刷新其显示。

当用户交互发生时,视图引发事件,控制器捕获此事件并为交互执行正确的操作,无论是更新模型还是保存或清除等等。

的观点不应写模型本身

你会看到很多的代码,其中的形式创建的控制器,但海事组织这是错误的。这是因为人们试图在asp.net webforms中应用这种模式,并且无法控制生命周期,所以总是创建的第一件事是视图,所以你别无选择,只能让它创建你的控制器,但是在你控制的winforms,所以清理干净,让控制器创建视图。

+0

谢谢!这看起来像是正确的设计,我很欣赏关于创建表单的最后一个注意事项 - 这似乎合乎逻辑。正是我在找的东西。 – 2012-02-08 17:48:15

2

您可能想要使用Model-View-Controller (MVC) design pattern,其中“逻辑”是您的控制器,“视图”是您的UI。该模型用于访问和检索数据源中的数据(例如SQL数据库)

将您的逻辑与您的用户界面区分开来是值得的,因为它使它们更易于维护。例如,如果您想要将您的UI从一个winform更改为一个网页,则不必重做所有的逻辑。

此外,它弥补了一个非常干净的代码。通常使用设计模式可以帮助其他程序员更快地理解您的代码。