重构大型复杂的用户界面

时间:2011-06-25 08:31:51

标签: c# winforms user-interface

我有一个很大的winform,上面有6个标签,里面装满了控件。第一个选项卡是主选项卡,其他5个选项卡是主选项卡的一部分。在数据库术语中,其他5个选项卡都引用了主选项卡。

你可以想象,我的形式变得非常庞大,难以维持。所以我的问题是,你如何处理大型UI?你是如何处理的?

3 个答案:

答案 0 :(得分:11)

在开始之前考虑一下你的目标。在我看来,你想瞄准SOLID principles。这意味着,除其他外,类/方法应具有单一责任。在您的情况下,您的表单代码可能正在协调UI内容业务规则/域方法。

分解为usercontrols是一个很好的开始。例如,在您的情况下,每个选项卡可能只有一个用户控件。然后,您可以使实际的表单代码非常简单,加载和填充用户控件。您应该具有这些用户控件可以发布/订阅的命令处理器实现,以启用视图间对话。

此外,研究UI设计模式。虽然在有状态的基于桌面的应用程序中难以实现,但M-V-C非常受欢迎并且已经很成熟。这导致了M-V-P / passive viewM-V-VM模式。我个人选择MVVM,但如果你不小心的话,你最终可以在WinForms中实现构建大量的“框架代码” - 保持简单。

此外,开始考虑“任务”或“操作”,因此构建task-based UI而不是具有相当于create/read/update/delete (CRUD) UI的内容。将绑定到第一个选项卡的对象视为aggregate root,并使用按钮/工具栏/链接标签,用户可以单击它们来执行某些任务。当他们这样做时,他们可能被导航到一个完全不同的页面,该页面仅聚合完成该工作所需的特定字段,因此消除了复杂性。

命令处理器

命令处理器模式基本上是用户发起事件的同步publisher/consumer pattern。下面列出了一个基本(相当天真)的例子。

基本上,您尝试使用此模式实现的是从表单本身移动事件的实际处理。表单可能仍然处理UI问题,例如隐藏/ [dis / en] abling控件,动画等,但是真正的业务逻辑的关注点的清晰分离是您的目标。如果您有rich domain model,则“命令处理程序”将基本上协调对域模型上方法的调用。命令处理器本身为您提供了一个在事务中包装处理程序方法的有用位置,或者提供审计和日志记录等{​​{3}}样式的东西。

public class UserForm : Form
{
    private ICommandProcessor _commandProcessor;

    public UserForm()
    {
        // Poor-man's IoC, try to avoid this by using an IoC container
        _commandProcessor = new CommandProcessor();
    }

    private void saveUserButton_Click(object sender, EventArgs e)
    {
        _commandProcessor.Process(new SaveUserCommand(GetUserFromFormFields()));
    }
}

public class CommandProcessor : ICommandProcessor
{
    public void Process(object command)
    {
        ICommandHandler[] handlers = FindHandlers(command);

        foreach (ICommandHandler handler in handlers)
        {
            handler.Handle(command);
        }
    }
}

答案 1 :(得分:2)

处理大型UI的关键是关注和封装的清晰分离。根据我的经验,最好尽可能地保持UI免于数据和功能:模型 - 视图 - 控制器是一个着名的(但很难应用)模式来实现这一点。

由于UI仅因UI代码而变得混乱,因此最好将所有其他代码与UI分离,并将与UI无关的所有内容直接委托给其他类(例如,将用户输入的处理委托给控制器类)。您可以通过为每个选项卡设置控制器类来应用此功能,但这取决于每个选项卡的复杂程度。也许最好将单个选项卡分解为几个控制器类,并将它们组合在一个控制器类中,以便于处理。

我发现MVC模式的变体很有用:The passive view。在此模式中,视图仅包含UI组件的层次结构和状态。其他所有内容都由控制器类委托并控制,这些控制器类可以确定如何处理用户输入。

当然,它也有助于将UI本身分解为组织良好且被封闭的组件本身。

答案 2 :(得分:1)

我建议你阅读微软实践和模式中的CAB(复合UI应用程序块),其中包含以下模式:命令模式,策略模式,MVP模式......等。

Microsoft Practice and patterns

Composite UI Application Block