2017-02-09 10 views
4

ユニットテストと依存性注入の観点から、ヘルパーメソッドに関してはいつも採用されている標準は何ですか?ここで 依存型注入とユニットテスト - 静的ヘルパーメソッドまたはプライベートインスタンスメソッド

は私の例の状況です:

public class GoodiesController : Controller 
{ 
    private IMyContext _context; 

    public GoodiesController(IMyContext context) 
    { 
     _context = context 
    } 

    public async Task<IAction> GetThoseGoodies() 
    { 
     if(YouLikeThemThisWay(Request.Path)) 
     { 
      var result = await _context.GoGetThemThisWay() 
     } else { } 
    } 

私の質問です私はいくつかのクラスまたはプライベートインスタンスメソッドなどの静的ヘルパーとしてYouLikeThemThisWay(string path)としたほうが良いのですか? YouLikeThemThisWayのようなものが2つあるとしますか?

答えて

4

本当にあなたのYouLikeThemThisWay(string path)メソッドが何をするかによって異なります。静的メソッドを使用するか、次のように私のルール:

  1. それは非プリミティブ依存性を必要としていますか?その場合は、staticを使用しないでください。
  2. アプリケーションの状態に影響しますか?その場合は、staticを使用しないでください。
  3. 内部的にアクセスできないクラスまたはタイプ(IE BCLクラスまたはプリミティブ)の機能を拡張しますか?もしそうなら、静的な拡張子を使用してください!
  4. ユニットテストに影響を与えますか?ルーチンを模擬することができない場合、makeを難しくしますか?いいえの場合は、静的にしてください!
  5. 複数のタイプまたはクラスで使用されますか?もしそうなら、静的な方が良い候補になります!
  6. データベースやファイルシステムの呼び出しのように、ルーチンはある種のIOを実行していますか?もしそうなら、私は静的にしません。

簡単にテストされ、状態に影響を与えないか、通常は静的になる小さなヘルパー機能です。状態が関与している場合、ルーチンは通常挿入する依存関係を必要とするか、ルーチンがIOまたはIPC呼び出しを行って静的​​にしません。

依存関係の問題の1つは、技術的には依存関係を処理するためにメソッド注入を使用できますが、私はそれを簡単に保つのが好きです。あなたの方法はおそらく静的であることはOKです。

スタティックでも再利用が大きな要因です。ルーチンが1つのクラスでのみ使用される場合、静的にするのは無意味かもしれません。私の静的メソッドのほとんどは、どこにでも簡単にアクセスできるヘルパークラスにあります。

編集:静的にすることを検討することさえできるように、私は通常、これらの5つのルールの大部分またはすべてを静的にする必要があることに注意してください。

+0

私は完全にポイント2を取得するとは思わない。このメソッドは、基本的に外部リソースを呼び出さない。それは単に提供された入力で動作します。 –

+0

最初に私は 'context'に入れようと思っていました。質問は本当にそれを嘲笑したり、単にそれを呼び出す必要がありますか(すなわち' context'から取り除く、つまり私の質問、 'static''または' private') –

+0

ポイント2は、静的にすることを考えているメソッドがアプリケーションのグローバルな状態に影響することを意味します。IEはメソッドをどこかで変更して、「元に戻す」ことができないため、関数を複数回連続して実行することはできません同じ結果。静的関数は常に[idempotent](https://en.wikipedia.org/wiki/Idempotence) – Carson

関連する問題