9

私はいくつかのコードをリファクタリングしていて、HFileと呼ばれるクラスを見ています。HFileにはすべてプライベートコンストラクターがあるため、実際にそのインスタンスを作成することはできません。次のようにHFilesのインスタンスを作成する代わりに:

var file = new HFile('filename')
file.Save()

すべてのHFileインタラクションは、静的メソッドを介して処理されます。したがって、ファイルを保存したい場合は、次のように呼び出します。

HFile.save('filename')

次に、内部でHFileのインスタンスが作成され、保存されます。明らかに、全体の話を知らなくても、読者は判断を保留する必要がありますが、静的な方法を使用することは私の職場で非常にファッショナブルになっているようです。だから私は、静的メソッドの使用法について、座って静的メソッドの使用法を確認するグループに役立つ、静的メソッドの使用に関する優れた原則/ベストプラクティスがあるかどうか疑問に思っています。

4

6 に答える 6

11

多くの静的メソッド/静的クラスは、手続き型炎の兆候です。つまり、オブジェクト指向言語で手続き型コードを記述します。この種の考え方をなくす最善の方法は、オブジェクト指向の原則と実践を完全に理解することです。静的クラスのテストを作成するのははるかに難しいため、テスト駆動開発を使用し、コードをテスト可能にすることが役立ちます。最終的に、TDD を使用する場合、テストの苦痛を軽減するためだけに、より分離されたオブジェクト指向アーキテクチャに自然と引き寄せられます。

于 2010-01-29T22:27:59.943 に答える
6

一般に、状況や組織構造のカプセル化が必要な場合は、クラスを使用します。

一方、分野横断的な懸念事項があり、アプリケーション全体で広く使用できる場合は、静的ユーティリティ クラスのメソッドを検討できます。 System.Math.NET フレームワーク (および Java) の は、この例です。

あなたの例では、HFile はおそらく状態を持つオブジェクトであるため、通常は静的メソッドを使用して保存しません。オブジェクト全体を静的メソッドに渡して保存するよりも、特定の HFile オブジェクトに対してメソッド呼び出しを行う方が簡単です。特定のアプリケーションでそれが意味を成すかどうかは、アプリケーションのパラダイムが HFile オブジェクトを、渡されて外部メソッドによって処理されるものと見なすか、またはそれ自体を保存できるスタンドアロン オブジェクトと見なすかによって異なります。

于 2010-01-29T22:23:48.493 に答える
5

静的メソッドはモック化できないため、テストが困難です。このため、私の職場ではそれらを避ける傾向があります。ただし、ファクトリ メソッドには使用します。

于 2010-01-29T22:24:52.883 に答える
3

静的メソッドの数については、これらのメソッドが何を行っているかについて心配するほど気にしません。値を返す、または引数として渡すオブジェクトを変更する静的メソッド? 大きな問題ではない。プライベート静的フィールドを変更する静的メソッド? 心配だ。他のクラスに属するパブリック静的フィールドを変更する静的メソッド? 湿った手ぬぐいを額に当てて、暗い部屋に横になる必要があります。

于 2010-01-29T23:10:56.053 に答える
2

これはあまりオブジェクト指向ではありませんね。あなたの場所は OO コードがあまり好きではないかもしれませんが、それは問題ありません。ただし、データとメソッドをカプセル化する場合は、そのデータを処理するインスタンス メソッドが必要です。

豊富な静的メソッドは、おそらく多くのグローバル変数に関連付けられています。例えば。静的な HFile.save('filename') を呼び出す場合、ファイル名に保存しようとしている情報はグローバルである必要があります。一般に、物事をより管理しやすくするために、グローバルを削減しようとします。

しかし、手続き型のコードを書きたい場合は問題ありません。

于 2010-01-29T22:25:29.303 に答える
2

IMO静的メソッドは、職場で一般的であると説明した目的には役に立ちません。この方法の短所:
- 基本的に 1 つのメソッドを呼び出すだけのために、ファイルを表すオブジェクトを作成する意味は何ですか?
- インターフェイスベースのポリモーフィズムを使用できません

あなたの質問に答えるために、静的メソッドを使用するいくつかのケース
を次に示します。 - クラスの機能に関連する何かを実行するユーティリティ メソッド。おそらく、オブジェクトの配列を取り、それらを比較します。おそらく、いくつかの一般的なデータ操作 (変換など) を行います。
- クラス変数を使用してクラス関連の作業を行う必要がある場合
- シングルトン デザイン パターンを実装する場合

于 2010-01-29T22:29:45.227 に答える