当表单的类变得太大时该怎么办?

时间:2011-08-26 17:25:57

标签: c# winforms design-patterns

目前我的主要表单有很多事件处理程序,因为有很多控件。它非常类似于绘画应用程序。我已经将它压缩了很多,我尽可能地共享事件处理程序,但是类仍然是大约1,000行代码。我意识到这对你们所有人来说可能并不多,但它比我的其他课程要大得多。

我已经为其他类重构了很多代码,但所有这些事件处理程序仍然会大量增加行数。我也开始使用区域块将事件处理程序分成组,并且工作得相当好但我仍然想知道SO对此问题的看法,以便最好地组织大量的表单事件处理程序。

编辑:所以我一直在使用部分课程,我必须说,我并不是那么喜欢他们。我不知道此时该怎么做。

我可能会回到使用区域块,因为我不确定用户控件是否会帮助解决我的问题。老实说,我不介意该地区阻挡那么多。那个类是我使用它们的唯一地方,它很好地组织了代码的不同部分(菜单事件处理程序,工具条事件处理程序,拖放支持等等)。

尽管如此,如果有人还有任何其他想法,或者想详细说明迄今发布的任何内容,我还是会非常感激,因为我仍然在寻找更好的解决方案。

5 个答案:

答案 0 :(得分:4)

1000行代码什么都不是,这不应该是重构代码的基础。在有意义的地方重构你的代码;不只是因为一个类包含的代码行多于其他类。有些类需要比其他类更多的代码,这完全没问题。

话虽如此,如果它有意义,您可以将控件划分为逻辑部分,并将它们放在用户控件中。确保这样做有充分的理由,因为否则你只会对代码库进行编卷。

我必须再次提醒你,不要将你的代码分割为只是以减少代码行。

答案 1 :(得分:3)

如果您还没有(您没有提及),我会将各个控件拆分为UserControls。您可以处理UserControl类中的所有事件,并仅公开父表单必须绝对处理的事件。这些可能会很少,并且会大大减少主表单的责任。

例如,每个工具按钮都可以存在于UserControl中。画布控件可以维护和实例工具控件等。您可以继续创建复合控件,其中每个上层变得不那么复杂,并且大部分实际逻辑都在其下面处理。

答案 2 :(得分:2)

您可以将功能拆分为单独的类(例如,像Ed建议的那样创建UserControl),或考虑使用partial类(其中一个类可以在许多文件中拆分)。当“主”类文件变得很大时,我发现partial类可以方便地将相关的代码块组合在一起。有时,这是将这些代码块重构为单独的类和/或控件的第一步。

如果没有看到代码,很难提出具体的建议,但这些是你的一些选择。

答案 3 :(得分:1)

我建议使用更多的OOP解决方案。添加更多 *复杂度*时,请勿添加UserControls。让我们试着保持你已经拥有的复杂性,但是让事情更加清晰,因为这是你真正要求的,我相信。

DI喜欢。实际上,如果你需要为很多控件处理很多事件,请创建ControlManagers,它接受​​控件并订阅它的事件。

因此,对于每个控件,您都拥有自己的经理。

优点:

  1. 在不同的classe中清除分开的代码,以便在出现问题时易于识别,从架构的角度来看我会更清楚。

  2. 您不会在大量控件和订阅者(​​每个控件一个订阅者)之间进行大量委托事件来破坏您的体系结构

  3. 顺便说一下,你需要组织不同类之间的数据流。但根据我的经验,这不是一个大问题。

    编辑

    示例伪代码

    UserControl1 mycontrol1; UserControl2 mycontrol2; 
    public class MyControl1Manager  {
        public MyControl1ManagerFor1  (UserControl1 uc1) {
              //subscribe to events of uc
              // here all code to handle events
        }
         public MyControl1ManagerFor2  (UserControl2 uc2) {
              //subscribe to events of uc
              // here all code to handle events
        }
    }
    

    以及代码中的某处:

       MyControl1ManagerFor1  controlManager1 = new MyControl1ManagerFor1  (mycontrol1);
       MyControl1ManagerFor2  controlManager2 = new MyControl1ManagerFor2  (mycontrol2);
    

    像这样。

    希望这有帮助。

答案 4 :(得分:0)

一旦我的表格变得非常大。它以各种方式显示相同的信息。为了减少单个文件中的代码数量,我使用了类似于UserControls的方法。所有GUI元素都放在表单上,​​但它们的初始化和处理程序由辅助类维护。它们是UserControls的等价物,但没有GUI界面。这些类在main form的构造函数中初始化:

SideViewHelper sideView = new SideViewHelper(parentForm, gridControlMaster, gridControlDetail, buttonSubmit);

处理gridControl事件的所有逻辑,按钮事件都在helper类中处理。

初始化后,主窗体(parentForm)可以通过单次调用ViewHelper的方法来改变许多UI项的状态。

这些类是为这个唯一的形式创建的,并且尽可能轻量级。