web-dev-qa-db-ja.com

クラスには参照透過性のメソッドしか含まれていないという意図を伝える良い方法はありますか?

私の職場では、コードの記述に主にC#を使用しています。私は、参照透過性のメソッドを持つクラスが、将来のメンテナのために参照透過性を意図していることを示す良い方法を見つけようとしています(つまり、同じ引数のセットが与えられると、常に同じ戻り値が得られます)。参照透過性のメソッドのみを含むことを目的としたクラスに静的クラスを使用することを検討しましたが、コンストラクターDIを使用して実行するために、依存するすべてのクラスをスタブアウトする単体テストのアプローチを好むため、同僚からプッシュバックを受けました。いずれにせよ、ほとんどの場合メモリ内にあるため、単体テスト用に参照透過性関数をスタブアウトしないことに不利な点はありませんが、同僚にそのことを納得させることができませんでした。

私たちのクラス名は、名前空間にDTOやFactory、Controllers andModelsなどの典型的なOOパターン名を使用しています。OO)のパターン名はわかりません。私が目指している意図の種類を示します(つまり、副作用のある操作を導入しないようにするか、データベースまたはファイルシステムから読み取るものに依存します)。

1
jeff charles

これを行うために私が想像できる最善の方法は、純粋、ステートレス、または参照透過性という名前の名前空間を使用することです(これはほとんどの場合混乱する可能性があるため、参照透過性よりも単純な名前を使用してください)。これにより、同僚に伝える必要があるのは「名前空間Xには参照透過性のコードのみが含まれる」だけなので、誰かがその名前空間を使用するたびに、理解の頭にクリックが入る可能性があります。

3
Jimmy Hoffa

"この静的クラスには、System.Math静的クラスのメソッドのように、参照透過性のメソッドのみが含まれています。サイドを引き起こす関数を配置しないでください。 -ここでの効果。 "

参照透過性のメソッドは、テストするすべてのメソッドの中で最も簡単です。値を渡して、戻り値を調べます。それでおしまい。

もちろん、プッシュバックは「この「参照透過性」メソッドが他のメソッドを呼び出さないことをどうやって知るのか」ということになるでしょう。その答えは、あなたがそれらの他の方法をテストしたということです、そしてあなたはすでにそれらが機能することを知っていますよね?

さらに読む
静的はユニットテストにとって普遍的に「悪」であり、もしそうなら、なぜresharperはそれを推奨するのですか?

5
Robert Harvey

これは本当にフープを飛び越えていますが、コンストラクターが例外をスローするReferentiallyTransparentBaseと呼ばれる基本クラスを作成するのはどうですか?次に、その人が例外のデバッグを開始すると、コメントが表示されます//インスタンスを作成すると、このクラスのメソッドは機能しなくなります。 SOそれをしないでください。うまくいけば彼らは写真を手に入れるでしょう。

0
Dunk