GUI アプリを作成するときは、アプリケーションを「制御」または「調整」する最上位クラスを使用します。最上位クラスは、ネットワーク接続の初期化、アプリケーション全体の UI アクションの処理、構成ファイルのロードなどの調整を担当します。
GUI アプリ コントロールの特定の段階で、別のクラスに渡されます。たとえば、ユーザーが認証されると、メイン コントロールがログイン画面からデータ入力画面に切り替わります。さまざまなクラスは、最上位のコントロールが所有するオブジェクトの機能を使用する必要があります。以前は、オブジェクトを下位のコントロールに渡すか、インターフェイスを作成するだけでした。最近、オブジェクト全体ではなく、メソッド デリゲートを渡すように変更しました。主な理由は次の 2 つです。
- 単体テストでは、クラスよりもメソッドをモックする方がはるかに簡単です。
- 従属クラスが使用しているメソッドを正確にクラス コンストラクターで文書化することにより、コードが読みやすくなります。
簡略化されたコード例を以下に示します。
delegate bool LoginDelegate(string username, string password);
delegate void UpdateDataDelegate(BizData data);
delegate void PrintDataDelegate(BizData data);
class MainScreen {
private MyNetwork m_network;
private MyPrinter m_printer;
private LoginScreen m_loginScreen;
private DataEntryScreen m_dataEntryScreen;
public MainScreen() {
m_network = new Network();
m_printer = new Printer();
m_loginScreen = new LoginScreen(m_network.Login);
m_dataEntryScreen = new DataEntryScreen(m_network.Update, m_printer.Print);
}
}
class LoginScreen {
LoginDelegate Login_External;
public LoginScreen(LoginDelegate login) {
Login_External = login
}
}
class DataEntryScreen {
UpdateDataDelegate UpdateData_External;
PrintDataDelegate PrintData_External;
public DataEntryScreen(UpdateDataDelegate updateData, PrintDataDelegate printData) {
UpdateData_External = updateData;
PrintData_External = printData;
}
}
私の質問は、私はこのアプローチを好みますが、次の開発者はどのようにそれを見つけるのでしょうか? サンプルおよびオープン ソースの C# コード インターフェイスは、デカップリングの推奨されるアプローチですが、デリゲートを使用するこのアプローチは、関数型プログラミングに傾いています。後続の開発者が、彼らにとって直感に反するアプローチについて息を切らして罵倒する可能性はありますか?