在WinForms中实现干净的UI功能并保持体面的解耦体系结构的最佳方法是什么?
我倾向于使用相当自我记录的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逻辑,在管理这些事情时,进行这种细分也很有帮助。