Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#适当的程序结构_C#_Winforms_Class - Fatal编程技术网

C#适当的程序结构

C#适当的程序结构,c#,winforms,class,C#,Winforms,Class,所以我有一个简单的程序,大致点击一个按钮,它执行了一个任务,没有什么特别的,非常简单。现在,我为它添加了更多的功能。它可以完成5个不同的、更复杂的主要任务。该任务几乎没有输入,就像处理插入名称、地址、电话号码等的常见类/命名空间示例。该任务更像是设置如何执行任务的设置(选中/取消选中复选框),然后单击按钮执行任务。代码已经失控了。所以我现在正试图组织它。我是自学成才的,所以我遇到了一些麻烦,但这就是我目前对组织的想法。如果您对组织此活动的正确方式有任何意见,我们将不胜感激 名称空间名称 类t

所以我有一个简单的程序,大致点击一个按钮,它执行了一个任务,没有什么特别的,非常简单。现在,我为它添加了更多的功能。它可以完成5个不同的、更复杂的主要任务。该任务几乎没有输入,就像处理插入名称、地址、电话号码等的常见类/命名空间示例。该任务更像是设置如何执行任务的设置(选中/取消选中复选框),然后单击按钮执行任务。代码已经失控了。所以我现在正试图组织它。我是自学成才的,所以我遇到了一些麻烦,但这就是我目前对组织的想法。如果您对组织此活动的正确方式有任何意见,我们将不胜感激

  • 名称空间名称
    • 类task1Name
      • task1的方法
    • 类task1Name
      • task2的方法
    • 类task2Name
      • task3的方法
    • 类task3Name
      • task4的方法
    • 类task5Name
      • task5的方法
现在,我还有一个用于该程序的windows窗体和另一个用于弹出设置窗口的windows窗体。最大的问题是这些东西到底适合哪里?公共部分类类名:Form?此设置是否允许不同任务类中的方法仍与表单webbrowser控件交互?表单有两个webbrowser控件,任务在webbrowser控件中生成

一般来说,我只是想找到管理代码和正确设置/构造代码的最佳方法。通过阅读本文,我可能只使用一个类/文件,因为任务涉及windows窗体中的webbrowser


我一直在看代码示例下面列出的相关章节,将程序划分为更易于维护的块(重构的艺术),这可能是编程中非常具有挑战性,但也是非常有益的一部分。就像@Keith说的,你会在实践中学习

最重要的建议是以小而独立的步骤进行重构。

有很多方法可以让你开始。如果您需要详细的建议,了解一些代码的外观会有所帮助。例如,“任务”方法的签名是什么(它们的名称、参数和返回类型),以及它们如何与“设置”交互

我有一个建议。单一责任原则建议单独的任务应该在单独的类中(通常,这意味着它们应该在单独的文件中——但这对编译器来说根本不重要,只是为了可读性)。如果任务在不同的类中,他们需要知道表单上的设置是什么。但是这些任务并不关心设置是否在表单上,它们只需要设置的值。因此,创建一个包含表单中所有设置的数据结构。然后,在form类中编写一个方法,读取控件中的所有设置,以便将所有设置都放在一个位置。然后,在每个任务的按钮的按钮单击处理程序中,只需调用该方法即可获得设置,并将设置传递给要运行的特定任务。普雷斯托

您的代码将如下所示:EDIT:我忘记了WebBrowser控件需要传递给任务。已修复。


希望有帮助!同样,如果您发布一些示例代码,您可能会得到关于如何重构的更好的建议。

这些任务实际上相关吗?或者你能把这件事分成几个重点项目吗?我想你可以说,任务是分开的,因为彼此之间不交流,但总体上是相关的。我的目标是设置任务的设置,然后最小化到系统托盘,让它整天在后台运行任务。我真的只是想找到一个更好的方法来管理代码,也许吧?是代码混乱还是用户体验混乱?一个生另一个。这是一个只有您才关心的实用程序吗?这个大问题确实值得一个长时间的回答,但对我来说,它可以归结为:是的,尝试将应用程序分解为封装的片段(类),它们可以很好地完成一件事。在这样做的过程中,您将从实践中学到实现这一目标的最佳方法。拆分的一个具体优势是支持单元可测试性。用户体验很好,只是我正在更新,以便成为对我和我的朋友更有用的程序,所以我添加了更多的设置和任务,现在代码变得越来越难更改/管理,特别是当我在添加/更改设置时更改了我希望任务的操作方式,试图使其适合最终版本。我主要只关心它,拥有漂亮、组织有序的代码更多地体现了我和我的完美主义个性。第二个最重要的建议是使用源代码管理来跟踪您所做的更改。如果您还没有这样做,请立即访问。这是免费的开源Mercurial源代码管理系统的一个很好的教程,你可以在Windows上获得。谢谢你的评论!我决定继续,开始组织和分解代码。另外,我还没有使用源代码管理,所以这也是一个很好的补充。我在不同的地方得到了5份程序副本,所以这将是一个很好的保持秩序的方法。不客气!如果您在重构过程中遇到任何问题(与代码或源代码管理相关),请告诉我们。请记得投票并接受有帮助的评论和回答。:)谢谢你,拉尔斯。我想知道如何按照这些思路构建我的C#程序,即如何分解表单和其他类。这个例子帮助很大。皮特
// 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... */ }