在WinForms中实现干净的UI功能同时保持良好的解耦架构的最佳方法是什么?

时间:2008-09-23 21:45:56

标签: c# .net winforms

我倾向于使用相当自我记录的void doSomething()方法来实现UI功能,即如果用户按下此按钮然后执行此操作然后启用此列表框,禁用该按钮等。这是最好的方法吗?是否有更好的一般UI管理模式,即如何控制何时启用/禁用控件等。等取决于用户输入?

我常常觉得自己正在转向“做一切”反模式的“大班”,因为很多人似乎与“主要”形式的班级互动。通常情况下,即使我在类中包含了使用相对模块化设计实现的私有状态变量,我仍然发现它增长得如此之快,这是荒谬的。

那么人们可以给我一些好的建议来制作高质量,可测试,分离的WinForms设计而不会陷入这些陷阱吗?

4 个答案:

答案 0 :(得分:13)

如果您想将UI的逻辑放在单独的类中,可以尝试MVP

在模型视图演示者中,正如Martin Fowler或Michael Feathers所说,UI的逻辑被分成一个名为presenter的类,它处理来自用户的所有输入并告诉“哑”视图显示什么以及何时显示。模式的特殊可测试性来自于整个视图可以用模拟对象替换的事实,这样,演示者是最重要的部分,可以很容易地单独进行单元测试。

答案 1 :(得分:3)

使用MVP模式与winforms相当不错。

查看http://www.objectmentor.com/resources/articles/TheHumbleDialogBox.pdf

答案 2 :(得分:0)

我只将UI逻辑放在Form类中,并将任何应用程序逻辑放在它自己的类中:

class Form1 : Form
 {  
    void Button1_Click
     { 
       Program.DoCommand1();
     }
 }


static class Program
{
  internal static void DoCommand1() {/* ... */}
}

答案 3 :(得分:0)

我最近有一件事就是利用.NET的部分类功能来处理这些较大类型的表单。如果我有一个标签控件,上面有5个不同的标签。我将创建部分类并将文件命名为CardImportMethods.cs,ManageLookupTables.cs等,同时将它们全部留作CentralizedForm类的一部分。

即使只使用UI逻辑,在管理这些事情时,这种细分也会有所帮助。