現在、Win Form アプリケーションでは、データの共有に使用される変数を含むグローバル変数クラスを使用しています。私の質問は、これを達成するために他にどのような方法がありますか? ベストプラクティス?なぜ?
2 に答える
グローバルは多くの理由で悪いですが、おそらく最も明白な理由は、理想的に言えば、同じメソッドを呼び出して同じパラメーターを渡すたびに、常に同じことを同じ結果で行う必要があるためです。グローバルはそのルールにブレーキをかけます。何かが別の場所で適切に初期化されなかったり、一部のグローバルが正しく変更されなかったりしたために、突然、コードが予期しない動作を開始します。
グローバルの必要性をなくすために私が見つけた最善の方法は、依存性注入 (DI) の原則に従うことです。このトピックについてはオンラインで多くの資料がありますが、一言で言えば、クラスが独自に依存関係を作成または検索するのではなく、多くの場合コンストラクターで依存関係を提供するように単に要求する必要があります。グローバル変数を介してアクセスしているものはすべて、定義上、それらにアクセスするクラスの依存関係と見なされます。したがって、たとえば、次のようにグローバル設定オブジェクトを使用する代わりに:
Global settings As New Settings()
そして、それを次のように使用するクラス:
Public Class MyClass
Public Sub DoSomething()
If settings.SomethingEnabled Then
' ...
End If
End Sub
End Class
代わりに、次のようにします。
Public Class MyClass
Public Sub New(settings As Settings)
_settings = settings
End Sub
Private _settings As Settings
Public Sub DoSomething()
If _settings.SomethingEnabled Then
' ...
End If
End Sub
End Class
これにより、コードがよりクリーンで柔軟になり、信頼性が高まります。また、コードをはるかにテストしやすくすることも大きな利点です。
データは、用途に応じて共有する必要があります。アプリケーション全体で変数が必要な場合は、グローバル スコープを持つことがわかり、グローバル変数の概念 (public static shared など) が適している可能性があります。
多くの場合、これは当てはまりませんが、グローバル変数は実際には避ける必要があるためです (詳細については、こちらとこちらをご覧ください)。
データは必要なレベルでカプセル化する必要があります。たとえば、フォームにその機能に適用可能なデータ/変数が含まれているが、他のフォームが値を必要とする場合、これはパブリック読み取り専用プロパティの理想的なケースです。これにより、変数の実際の詳細がアプリケーションの残りの部分から隠されます。