プログラムをより保守しやすいチャンクに分割すること (リファクタリングの技術) は、プログラミングの非常に難しい部分ですが、非常にやりがいのある部分でもあります。@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... */ }
それが役立つことを願っています! 繰り返しになりますが、サンプル コードを投稿すると、リファクタリングの方法についてより適切なアドバイスが得られるでしょう。