web-dev-qa-db-ja.com

「ユーティリティ」クラスが悪の場合、汎用コードはどこに置けばよいですか?

私は一般的に、グローバル変数/関数は悪であり、コードのすべての部分はそれが関係するクラスに存在するというルールに従っています。

これは従うのが非常に簡単なルールであり、これまでこのルールの問題に遭遇したことはないと思います。

ただし、今日は、特定のクラスではなく、Assemblyに関数を追加する必要があります。つまり、ほとんどすべてのクラスcouldがこの特定の機能を使用できます。

この関数をどこに置くべきですか(+1オーバーロード)?

「ユーティリティ」クラスに入れると、汚い気分になります。準関連クラスにそれを追加し、他のクラスにそれを直接呼び出させると、気分が悪くなります。

この特定のコードは、基本的にIList<PointF>を正規化されたリストに切り刻みます。 IList<PointF>の拡張メソッドとして追加するのが最善の策かもしれないと今感じています...

63
John Gietzen

これがIList<PointF>の操作である場合、IList<PointF>の拡張メソッドである必要があります。

一般的に、UtilsおよびHelperタイプのクラスは使用しないでください。ほとんどの場合、思考はユーティリティメソッドであり、実際にはおそらくあなた自身のクラスに属するかなり特定のメソッドであることがわかります(あなたが言うように)。ただし、Utilのようなクラス(関連する有用なメソッドをグループ化するクラス)が有効なエンティティであるドメイン固有のケースがあります。

29
Håvard S

「グローバル」変数とメソッドに問題はありません。常にそれらを使用します。フレームワークは、それらを「静的」クラスまたは「静的」メソッドと呼びます。

必要になることはめったにありませんが、通常、C#にはメソッド/変数が必要であり、VB.NETにはモジュールが必要である名前空間に内部静的クラスUtilを追加します。

.NET Frameworkのサンプル

  • System.Collections.Specialized.CollectionsUtil
  • System.Net.WebUtility
  • .NET FrameworkのMicrosoftのソースコードを確認します。多数の内部ユーティリティクラスがあります。
12
AMissico

もちろん、それを 'ListUtilities'またはPointListUtilitiesクラスに入れる必要があります。そうすれば、キャッチオール「ユーティリティ」クラスの主な問題である単一の責任原則を破ることはありません。

4
Ben Voigt