目前我的主要表单有很多事件处理程序,因为有很多控件。它非常类似于绘画应用程序。我已经将它压缩了很多,我尽可能地共享事件处理程序,但是类仍然是大约1,000行代码。我意识到这对你们所有人来说可能并不多,但它比我的其他课程要大得多。
我已经为其他类重构了很多代码,但所有这些事件处理程序仍然会大量增加行数。我也开始使用区域块将事件处理程序分成组,并且工作得相当好但我仍然想知道SO对此问题的看法,以便最好地组织大量的表单事件处理程序。
编辑:所以我一直在使用部分课程,我必须说,我并不是那么喜欢他们。我不知道此时该怎么做。
我可能会回到使用区域块,因为我不确定用户控件是否会帮助解决我的问题。老实说,我不介意该地区阻挡那么多。那个类是我使用它们的唯一地方,它很好地组织了代码的不同部分(菜单事件处理程序,工具条事件处理程序,拖放支持等等)。
尽管如此,如果有人还有任何其他想法,或者想详细说明迄今发布的任何内容,我还是会非常感激,因为我仍然在寻找更好的解决方案。
答案 0 :(得分:4)
1000行代码什么都不是,这不应该是重构代码的基础。在有意义的地方重构你的代码;不只是因为一个类包含的代码行多于其他类。有些类需要比其他类更多的代码,这完全没问题。
话虽如此,如果它有意义,您可以将控件划分为逻辑部分,并将它们放在用户控件中。确保这样做有充分的理由,因为否则你只会对代码库进行编卷。
我必须再次提醒你,不要将你的代码分割为只是以减少代码行。
答案 1 :(得分:3)
如果您还没有(您没有提及),我会将各个控件拆分为UserControls。您可以处理UserControl
类中的所有事件,并仅公开父表单必须绝对处理的事件。这些可能会很少,并且会大大减少主表单的责任。
例如,每个工具按钮都可以存在于UserControl中。画布控件可以维护和实例工具控件等。您可以继续创建复合控件,其中每个上层变得不那么复杂,并且大部分实际逻辑都在其下面处理。
答案 2 :(得分:2)
您可以将功能拆分为单独的类(例如,像Ed建议的那样创建UserControl),或考虑使用partial
类(其中一个类可以在许多文件中拆分)。当“主”类文件变得很大时,我发现partial
类可以方便地将相关的代码块组合在一起。有时,这是将这些代码块重构为单独的类和/或控件的第一步。
如果没有看到代码,很难提出具体的建议,但这些是你的一些选择。
答案 3 :(得分:1)
我建议使用更多的OOP解决方案。添加更多 *复杂度*时,请勿添加UserControls
。让我们试着保持你已经拥有的复杂性,但是让事情更加清晰,因为这是你真正要求的,我相信。
DI喜欢。实际上,如果你需要为很多控件处理很多事件,请创建ControlManagers
,它接受控件并订阅它的事件。
因此,对于每个控件,您都拥有自己的经理。
优点:
在不同的classe中清除分开的代码,以便在出现问题时易于识别,从架构的角度来看我会更清楚。
您不会在大量控件和订阅者(每个控件一个订阅者)之间进行大量委托事件来破坏您的体系结构
顺便说一下,你需要组织不同类之间的数据流。但根据我的经验,这不是一个大问题。
编辑
示例伪代码:
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项的状态。
这些类是为这个唯一的形式创建的,并且尽可能轻量级。