2

そこで、ボタンを大まかにクリックするだけの簡単なプログラムを作成し、タスクを実行しました。今、私はそれが行うためのより多くの機能タスクを追加しました. 約 5 つの異なる主要なより複雑なタスクを実行します。タスクには、名前、住所、電話番号などを挿入する一般的なクラス/名前空間の例のような意味での入力はほとんどありません。タスクは、どのように実行したいかについて設定をセットアップする (チェックボックスをオン/オフにする) ようなものです。ボタンをクリックして実行します。コードが制御不能になりました。ということで、今整理しようと思っています。独学なので困っているところもありますが、組織としては今のところこんな感じです。これを整理する適切な方法についてのコメントをいただければ幸いです。

  • 名前空間 namespaceName
    • クラス task1Name
      • task1 のメソッド
    • クラス task1Name
      • task2 のメソッド
    • クラス task2Name
      • task3 のメソッド
    • クラス task3Name
      • task4 のメソッド
    • クラス task5Name
      • task5 のメソッド

現在、プログラム用のウィンドウフォームと、ポップアップ設定ウィンドウ用の別のウィンドウフォームもあります。大きな問題は、これらが正確にどこに収まるかということです。public 部分クラス className : Form? この設定により、さまざまなタスク クラスのメソッドが引き続きフォーム Web ブラウザ コントロールと対話できるようになりますか? フォームには 2 つの Web ブラウザー コントロールがあり、タスクは Web ブラウザー コントロールで実行されます。

一般的に、コードを管理し、コードを適切にセットアップ/構造化するための最良の方法を見つけようとしているだけだと思います。これを読んでから、C#で個別の.csファイルを使用する方法は? タスクには Windows 形式の Web ブラウザーが関係するため、1 つのクラス/ファイルに固執するだけかもしれません。

私はhttp://msdn.microsoft.com/en-us/library/w2a9a9s3%28v=vs.100%29.aspxとコード例の下にリストされている関連セクションを見てきました

4

1 に答える 1

2

プログラムをより保守しやすいチャンクに分割すること (リファクタリングの技術) は、プログラミングの非常に難しい部分ですが、非常にやりがいのある部分でもあります。@Keithが言ったように、あなたはやることで学びます。

最も重要なアドバイスは、小さな自己完結型のステップでリファクタリングすることです。

これを開始するには、いくつかの方法があります。詳細なアドバイスが必要な場合は、コードの一部がどのように見えるかを知っておくと役立ちます。たとえば、「タスク」メソッドのシグネチャ (名前、引数、および戻り値の型) とは何か、および「設定」とどのように相互作用するか。

これが私がする1つの提案です。単一責任の原則は、個別のタスクを個別のクラスにする必要があることを示唆しています (通常、これは、個別のファイルにする必要があることを意味しますが、コンパイラにとってはまったく問題ではなく、読みやすさのためだけです)。タスクが別々のクラスにある場合、フォームの設定を知る方法が必要になります。しかし、タスクは、設定がフォーム上にあるという事実を気にしません。設定の値が必要なだけです。したがって、フォームからのすべての設定を含むデータ構造を作成します。次に、コントロールからすべての設定を読み取る単一のメソッドをフォーム クラスに記述して、すべてを 1 か所にまとめます。次に、各タスクのボタンのボタン クリック ハンドラーで、そのメソッドを呼び出して設定を取得し、実行しようとしている特定のタスクに設定を渡します。プレスト!

コードは次のようになります:編集: 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... */ }

それが役立つことを願っています! 繰り返しになりますが、サンプル コードを投稿すると、リファクタリングの方法についてより適切なアドバイスが得られるでしょう。

于 2012-06-07T05:30:18.237 に答える