C#のプライベート静的メソッドは何かを傷つけますか?


10

クラスで複数回発生する特定の検証用のプライベート検証メソッドを作成しました(検証されたデータをさまざまな理由で保存できません)。現在、ReSharperは、関数を静的にできることを示唆しています。静的メソッドの既知の問題のため、そうすることに少し消極的です。それはプライベート静的メソッドになります。私の質問は、プライベート静的メソッドは、パブリック静的メソッドのような同様の結合とテストの問題を引き起こす可能性があるのですか?それは悪い習慣ですか?私はそうは思いませんが、ここに落とし穴があるかどうかはわかりません。


10
静的メソッドの「既知の問題」とは何ですか?
Robert Harvey

3
@エド:そうです。正しく記述された静的メソッドは、外部APIや状態に触れないでください。クラス内にカプセル化された内部状態を操作することは私にはまったく問題ありません。ユニットテストではクラスの外部動作をテストするため、メソッドをユニットテストする必要はありません。
Robert Harvey

1
静的メソッドはグローバルな状態を変更する傾向があり、継承も強制終了します(機能を拡張する場合は常に、派生クラスのメソッドをオーバーライドできないため、呼び出しコードを変更する必要があります)。あなたはその1つの実装に結びついています。静的メソッドはモックできないため、単体テストが非常に困難になります。彼らは依存関係を隠します。まだまだあると思います。それらを盲目的に回避するだけでなく、私は情報に基づいた決定をするように求めています。
タマシュSzelei

2
@Tamás静的メソッドは、そのように記述した場合にのみグローバル状態を変更します。一般的に言って、私はユーティリティクラスで静的メソッドのみを使用します。これは、1つ以上のオブジェクトを受け取り、副作用なしでオブジェクトを返すメソッドです。これらの種類のメソッドには、説明する問題はありません。
Robert Harvey

1
@TamásSzelei彼らはどのようにグローバルな状態を変更する傾向がありますか?パラメータに渡さない限り、グローバル状態を見つけることもできません。
CodesInChaos

回答:


16

「これをテストする必要がありますか?」

とにかくメソッドがプライベートの場合、つまりメソッド自体のロジックを単体テストしたくない場合は、テスト容易性と保守容易性に関する限り、クラスはどちらかの方法でブラックボックスであり、クラスの内部動作はそのビジネスです。そしてそれだけ。リファクタリングも影響を受けません。これも考慮する必要があります。

だから、私の意見では、いいえ。「プライベート」メソッドを「プライベートスタティック」にしても、長期的な影響はまったくありません。


17

プライベート静的メソッドは、私の観点からは、可能な最も簡単なものです。

DataIn->メソッド-> DataOut

外部オブジェクトへの依存関係はなく、副作用もありません。なぜあなたはそれらを悪いと思いますか?


ありがとうございました。質問の下のコメントで懸念事項を説明しました。
タマシュSzelei

2
あなたが説明することは、静的メンバー変数に依存しない静的メソッドに対してのみ正しいです-それが「良い」と「悪い」静的メソッドを区別することができるものです。
Doc Brown

2

静的メソッドをスタブ化/偽造/モックアウトすることは(特に)簡単ではないため、パブリック静的メソッドを使用するクラスのテストは困難な場合があります。一方、インスタンスメソッドは、特に仮想である場合やインターフェイスを満たす場合に、簡単にモック化できます。

ただし、プライベート静的メソッドを使用しない理由はわかりません。実際、メモリを占有するためにクラスのインスタンスを必要としないため、パフォーマンスがわずかに向上します。

一方の上で何の静的コードのにおいのビットがあります。これは実際には「ヘルパークラス」ですか?メソッドがパラメータとして渡されたクラスの1つにもっと便利に常駐できるのでしょうか?これらの質問への回答は、多くの場合「静的としては問題ありません」ですが、覚えておく価値はあります。


とにかく、静的メソッドを含むクラスはすでにメモリを占有しています。staticキーワードに対する恐怖は根拠がないようです。
Robert Harvey
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.