な渡すパラメータを知っておきたい暗黙のうちに違反する封止?
-
13-09-2019 - |
質問
ありがとうちから試験駆動開発の人々の機能を有する車の大量の情報を暗黙のうちには悪いことであると考えていた。きたこ悪いから試験的になんでもら必要に応じて封止材の視点?以下の質問が気になる:
基本的には、人を作りたかった"という機能をアプリケーションへのランダムにシャッフルする配列の型になります。複数の人に聞の乱数発生関数を必要として渡されたパラメータとします。このように、言語道断な違反の封止にものって、なく検査します。できないのではないでその配列をシャッフリングアルゴリズムを要する状態ですべての以外の配列がシャッフリング、実装の詳細を呼び出し側はいい?なの正しい場所にこの情報を暗黙のうちには、あらかのスレッド-地域のシングルトン?
解決
はい、それは壊れないカプセル化する。ほとんどのソフトウェア設計上の決定と同様に、これは二つの対向する力の間のトレードオフです。あなたはRNGをカプセル化するなら、あなたはそれが困難なユニットテストのために変更することにします。あなたはそれパラメータ作るなら、あなたはRNGを変更(および潜在的にそれが間違って取得)するためのユーザーのために、それが容易になります。
私の個人的な好みは、エンドユーザーのためのデフォルトの実装(この特定のケースでは、独自のRNGを作成するデフォルトコンストラクタ)と良いドキュメントを提供し、その後、テストすることが容易にすることです。署名してメソッドを追加する
public static IEnumerable<T> Shuffle<T>(this IEnumerable<T> source)
それは、この方法の最も通常の使用例世話をするだろうそのシードとして現在のシステム時刻を使用してRandom
を作成します。元のメソッド
public static IEnumerable<T> Shuffle<T>(this IEnumerable<T> source, Random rng)
試験のために使用される(既知の種とRandom
オブジェクトを渡す)と、ユーザが、彼らは暗号的に安全なRNGが必要決定それらまれにすることができます。 1パラメータの実装は、このメソッドを呼び出す必要があります。
他のヒント
ように思うがまとめられることにより、封止.の状態の配列は、データそのものである場合でも、"乱数の発生源"は、本質的にはサービスです。なぜ配列には、自然に関連する乱数の発生源?なぜないようにするほこりがたたないシングルトン?う状況の異なる条件など速度vs暗号法論的には確保のランダム?ある理由 java.util.Random
は SecureRandom
サブクラス:)このようになるかどうかをシャッフルの結果が予測可能な多くの努力や観察のでしょうか。それがコンテキストの情報をシャッフルアルゴリズムでない。
一度開始する考え方としてサービスでは意味があるのでとして渡された依存性がある。
あり、 え でスレッドから-地域のシングルトン(および実行っているブログにてこの数日間は一般的にコードしていくことで、 呼び出し側 を取得することを決定します。
係で、"乱数の発生源としてのサービス"のコンセプトであることでお客様をお迎えいたします繰返し精度-業に対し、試験に失敗した場合、を渡すことができる Random
特定の種やノウハウだけは常に同一の結果、デバッグします。
もちろん、あるいは、オプションの Random
オプションを使用糸-地域のシングルトンとしてデフォルトの場合、呼び出し側が学んでいくスタイルではありませます。
とは思わないことに違反する封止.
えお
すると思うのでできることをRNGの特徴であるクラスです。いう方法を提供することを必要としないので見回りすることができて便利で複製のランダム化.
どの場合、配列shufflerたゲームを用いたRNGレベル。ユーザがっレベルを保存してから、再度再生後、より効率的な店舗のRNGます。
一般の場合
簡単なるクラスにはシングルタスクのこのような一般的な心配をする必要が漏洩その内部に点在している。その封止は、論理のタスクではなく、必要な要素による論理です。