在WinForms中实现干净的UI功能并保持体面的解耦体系结构的最佳方法是什么?

时间:2020-03-06 14:37:46  来源:igfitidea点击:

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

通常,我觉得自己正在转向"能做所有事情的大类"反模式,因为似乎有很多东西与"主"表单类交互。通常,即使我在使用相对模块化设计实现的类中包含私有状态变量,我仍然发现它增长得如此之快以至于荒谬。

因此,在不陷入这些陷阱的情况下,人们可以给我一些有关生成高质量,可测试,脱钩的WinForms设计的好的建议吗?

解决方案

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

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

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

如果要将UI的逻辑放在单独的类中,则可以尝试MVP。

就像Martin Fowler或者Michael Feathers所说的那样,在模型视图演示者中,UI的逻辑被分为一个名为presenter的类,该类处理来自用户的所有输入并告诉"哑"视图显示什么以及何时显示。模式的特殊可测试性来自于这样一个事实,即可以用模拟对象代替整个视图,并且通过这种方式,最重要的部分演示者可以很容易地进行隔离的单元测试。

在Winforms中使用MVP模式非常好。

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

我最近遇到的一件事是利用.NET的部分类功能来处理其中一些较大的类型形式。如果我有一个带有5个不同选项卡的选项卡控件。我将创建部分类,并将文件命名为CardImportMethods.cs,ManageLookupTables.cs等,同时将其保留为CentralizedForm类的一部分。

即使只有UI逻辑,在管理这些事情时,进行这种细分也很有帮助。