当窗体的类变得太大时该怎么办?

本文关键字:怎么办 窗体 | 更新日期: 2023-09-27 18:06:41

目前我的主要形式有大量的事件处理程序,因为有很多的控件。这与油漆应用程序非常相似。我已经把它压缩了很多,并且尽可能地共享事件处理程序,但是这个类仍然有大约1000行代码。我知道这对你们所有人来说可能不多,但它比我的其他班级要大得多。

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

Edit:所以我一直在使用局部类,我必须说,我真的不太喜欢它们。我不知道现在该怎么办。

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

仍然,如果有人仍然有任何其他的想法或想详细说明任何张贴到目前为止,我将非常感激,因为我仍在寻找一个更好的解决方案来解决这个问题。

当窗体的类变得太大时该怎么办?

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

也就是说,如果有意义的话,您可以将控件划分为逻辑部分,并将它们放在用户控件中。但是,请确保这样做有充分的理由,否则您只会混淆代码库。

我必须再次提醒你,不要为了减少代码行数而把你的代码分成

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

在没有看到代码的情况下很难提出具体的建议,但这些都是您的一些选择。

如果你还没有(你没有提到),我将把各种单独的控件拆分为UserControls。你可以处理所有的事件从UserControl类,只暴露那些事件,父窗体必须绝对处理。它们的数量可能很小,并且会大大减少主表单的职责。

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

我建议使用更多面向对象的解决方案。不要添加UserControls,因为您添加了更多 *复杂性*。让我们试着保持你已经拥有的复杂性,但是让事情变得更清晰,因为我相信这才是你真正想要的。

DI

。在实践中,如果您需要为许多控件处理许多事件,请创建ControlManagers,它接受控件并订阅其事件。

所以对于每个控件,你将有它自己的管理器。

优势:

  1. 在不同的类中清除分离的代码,以便在出现问题时易于识别,并且从架构的角度来看更清晰。

  2. 你不需要在大量控件和订阅者(每个控件一个订阅者)之间使用大量委托事件来破坏你的体系结构

当然,您需要组织,顺便说一下,不同类之间的数据流。但根据我的经验,这应该不是什么大问题。

编辑

伪代码示例:

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);

就像这样。

有一次我有一个非常大的表单。它以许多不同的方式展示了同样的信息。为了减少单个文件中的代码数量,我使用了类似于UserControls的方法。所有GUI元素都放置在表单上,但是它们的初始化和处理程序由助手类维护。它们相当于UserControls,但没有GUI界面。这些类是在main form的构造函数中初始化的:

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

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

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

这些类是为这个表单创建的,并且是尽可能轻量级的。