私は少し極端かもしれませんが、防御プログラミングは好きではありません。原則を導入したのは怠惰だと思います。
この特定の例では、ポインタがnullではないことを表明する意味はありません。nullポインターが必要な場合は、代わりに参照を使用するよりも、実際にそれを強制する(そして同時に明確に文書化する)より良い方法はありません。そして、それは実際にコンパイラによって強制され、実行時にジルチを要しないドキュメントです!!
一般的に、私は「raw」タイプを直接使用しない傾向があります。説明しましょう:
void myFunction(std::string const& foo, std::string const& bar);
foo
との可能な値は何bar
ですか?まあ、それはaが含むかもしれないものによってのみかなり制限されていstd::string
ます...それはかなり曖昧です。
一方で:
void myFunction(Foo const& foo, Bar const& bar);
はるかに良いです!
- 引数の順序を誤って逆にした場合、コンパイラによって検出されます
- 各クラスは、値が正しいことを確認する責任があり、ユーザーに負担はかかりません。
私は強いタイピングを好む傾向があります。アルファベット文字のみで構成され、最大12文字のエントリがある場合は、内部で割り当てを確認するために使用されるstd::string
単純なメソッドを使用して、をラップする小さなクラスを作成し、代わりにそのクラスを渡します。validate
このようにして、検証ルーチンを1回テストする場合、その値が到達する可能性のあるすべてのパスについて実際に心配する必要はありません。>値が到達したときに検証されます。
もちろん、それはコードがテストされるべきではないということではありません。私が強力なカプセル化を好むというだけであり、入力の検証は私の意見では知識のカプセル化の一部です。
そして、例外なくルールはあり得ないので...公開されたインターフェースは、何が起こるかわからないため、検証コードで肥大化する必要があります。ただし、BOM内の自己検証オブジェクトを使用すると、一般的に非常に透過的です。