所以我有一个简单的程序,大致点击一个按钮,它执行任务,没有什么花哨,非常简单。现在,我已经为它添加了更多功能任务。它做了大约5个不同的主要更复杂的任务。从处理插入名称,地址,电话号码等的常见类/命名空间示例来看,该任务几乎没有任何输入。任务更像是设置设置(选中/取消选中复选框)以了解您希望如何执行任务然后单击按钮以执行它。代码已经失去控制。所以我现在正在尝试组织它。我是自学成才,所以我遇到了一些麻烦,但这是我到目前为止组织的想法。任何关于组织这种方式的正确方法的评论将不胜感激。
现在我还有一个用于程序的Windows窗体和另一个用于弹出设置窗口的窗体。最大的问题是这些适合哪些? public partial class className:Form?此设置是否允许不同任务类中的方法仍然与表单webbrowser控件交互?该表单有几个webbrowser控件,任务在webbrowser控件中执行。
我想一般来说,我只是想找到管理代码和正确设置/构造代码的最佳方法。从阅读这个How to use separate .cs files in C#?开始,我只想坚持使用一个类/文件,因为任务涉及windows窗体中的webbrowser。
我一直在查看http://msdn.microsoft.com/en-us/library/w2a9a9s3%28v=vs.100%29.aspx以及代码示例
下面列出的相关部分答案 0 :(得分:2)
将您的程序分解为更易于维护的块 - 重构的艺术 - 可能是一个非常具有挑战性的,但也是一个非常有益的编程部分。就像@Keith说的那样,你可以边做边学。
最重要的建议是以小型,自包含的步骤进行重构。
您可以通过多种方式开始此操作。如果您需要详细的建议,将有助于了解一些代码的外观。例如,什么是“任务”方法的签名(它们的名称,参数和返回类型)以及它们如何与“设置”交互。
这是我要提出的一个建议。 单一责任原则建议单独的任务应该在不同的类中(通常,这意味着它们应该在单独的文件中 - 但这对编译器来说根本不重要,它只是为了便于阅读)。如果任务在不同的类中,则需要一种方法来了解表单上的设置。但是任务并不关心设置在表单上的事实 - 他们只想要设置的值。因此,创建一个包含表单中所有设置的数据结构。然后,在表单类中编写一个单独的方法,从控件中读取所有设置,因此您可以将它们集中在一个位置。然后,在每个任务按钮的按钮单击处理程序中,只需调用该方法即可获取设置,并将设置传递给您尝试运行的特定任务。的Presto!
您的代码看起来像这样: 编辑:我忘了需要将WebBrowser控件传递给任务。固定的。 强>
// Note: All classes and structs go in the same namespace, but each goes in its own .cs file.
// Use a struct, rather than a class, when you just need a small set of values to pass around
struct MySettings
{
public int NumberOfWidgets { get; set; }
public string GadgetFilename { get; set; }
public bool LaunchRocket { get; set; }
}
partial class MyForm
{
// ...constructor, etc.
private void ButtonForTask1_Clicked(object sender, EventArgs e)
{
var settings = ReadSettingsFromControls();
var task1 = new Task1(settings);
task1.DoTheTask(ref this.WebBrowserControl1);
}
private void ButtonForTask2_Clicked(object sender, EventArgs e)
{
var settings = ReadSettingsFromControls();
var task2 = new Task2(settings);
task2.DoTheTask(ref this.WebBrowserControl1);
}
// ... and so on for the other tasks
private MySettings ReadSettingsFromControls()
{
return new MySettings
{
NumberOfWidgets = int.Parse(this.txt_NumWidgetsTextBox.Text),
GadgetFilename = this.txt_GadgetFilenameTextBox.Text,
LaunchRocket = this.chk_LaunchPermission.Checked
};
}
}
class Task1
{
// Readonly so it can only be set in the constructor.
// (You generally don't want settings changing while you're running. :))
private readonly MySettings _settings;
public Task1(MySettings settings)
{
_settings = settings;
}
public void DoTheTask(ref WebBrowser browserControl)
{
// TODO: Do something with _settings.NumberOfWidgets and browserControl
// You can use private helper methods in this class to break out the work better
}
}
class Task2 { /* Like Task1... */ }
希望有所帮助!同样,如果你发布一些示例代码,你可能会得到更好的建议如何重构它。