当窗体的类变得太大时该怎么办?
本文关键字:怎么办 窗体 | 更新日期: 2023-09-27 18:06:41
目前我的主要形式有大量的事件处理程序,因为有很多的控件。这与油漆应用程序非常相似。我已经把它压缩了很多,并且尽可能地共享事件处理程序,但是这个类仍然有大约1000行代码。我知道这对你们所有人来说可能不多,但它比我的其他班级要大得多。
我已经重构了很多代码到其他类,但是所有这些事件处理程序仍然增加了大量的行数。我还开始使用区域块将事件处理程序分开到组中,这工作得相当好,但我仍然想知道SO对此事的意见,以便最好地组织大量的表单事件处理程序。
Edit:所以我一直在使用局部类,我必须说,我真的不太喜欢它们。我不知道现在该怎么办。
我可能会回到使用区域块,因为我不确定用户控件会帮助我的问题。老实说,我并不介意区域阻塞那么多。这个类是我唯一使用它们的地方,它很好地组织了代码的不同部分(菜单事件处理程序,工具条事件处理程序,拖放支持,等等)。
仍然,如果有人仍然有任何其他的想法或想详细说明任何张贴到目前为止,我将非常感激,因为我仍在寻找一个更好的解决方案来解决这个问题。
1000行代码不算什么,这不应该是重构代码的基础。在有意义的地方重构代码;不仅仅是因为一个类比其他类包含更多的代码行。有些类需要比其他类更多的代码,这完全没问题。
也就是说,如果有意义的话,您可以将控件划分为逻辑部分,并将它们放在用户控件中。但是,请确保这样做有充分的理由,否则您只会混淆代码库。
我必须再次提醒你,不要为了减少代码行数而把你的代码分成和。您可以将功能拆分为单独的类(例如像Ed建议的那样创建UserControls),或者考虑使用partial
类(其中一个类可以在许多文件中拆分)。当"主"类文件变得很大时,我发现partial
类可以方便地将相关的代码块组合在一起。有时,这是将这些代码块重构为单独的类和/或控件的第一步。
在没有看到代码的情况下很难提出具体的建议,但这些都是您的一些选择。
如果你还没有(你没有提到),我将把各种单独的控件拆分为UserControls。你可以处理所有的事件从UserControl
类,只暴露那些事件,父窗体必须绝对处理。它们的数量可能很小,并且会大大减少主表单的职责。
例如,每个工具按钮可以驻留在UserControl中。画布控件可以维护工具控件的实例,等等。您可以继续创建复合控件,其中每个上层变得不那么复杂,并且大多数实际逻辑都在其下面处理。
我建议使用更多面向对象的解决方案。不要添加UserControls
,因为您添加了更多 *复杂性*。让我们试着保持你已经拥有的复杂性,但是让事情变得更清晰,因为我相信这才是你真正想要的。
。在实践中,如果您需要为许多控件处理许多事件,请创建ControlManagers
,它接受控件并订阅其事件。
所以对于每个控件,你将有它自己的管理器。
优势:
在不同的类中清除分离的代码,以便在出现问题时易于识别,并且从架构的角度来看更清晰。
你不需要在大量控件和订阅者(每个控件一个订阅者)之间使用大量委托事件来破坏你的体系结构
编辑
伪代码示例:
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项的状态。
这些类是为这个表单创建的,并且是尽可能轻量级的。