まず、1つのステートメントで多くのことを行わないでください。1行に膨大な数の間接参照操作がある場合、原因を見つけるのははるかに困難になります。デメテルの法則もこれに役立ちます-あなたがそのようなものを持っているなら、あなたorder.SalesClerk.Manager.Address.Street.Length
は例外を受け取ったときに通り抜ける多くのオプションを持っています。(私はデメテルの法則について独断的ではありませんが、すべてが適度にあります...)
次に、オブジェクトが別のタイプであることが有効as
である場合を除いて、を使用するよりもキャストすることをお勧めします。これには通常、直後にnullチェックが含まれます。だからここに:
// What if foo is actually a Control, but we expect it to be String?
string text = foo as string;
// Several lines later
int length = text.Length; // Bang!
ここでは、NullReferenceExceptionが発生し、最終的にはnullにトレースバックしますが、それがnullによるものなのか、予期しないタイプによるものなtext
のかはわかりません。foo
それが本当に、本当にである必要がある場合はstring
、代わりにキャストします。
string text = (string) foo;
これで、2つのシナリオの違いがわかります。
第三に:他の人が言っているように、データを検証します-通常はパブリックAPIと潜在的に内部APIへの引数です。私はこれを野田時間の十分な場所で行っているので、チェックを整理するのに役立つユーティリティクラスがあります。したがって、たとえば(からPeriod
):
internal LocalInstant AddTo(LocalInstant localInstant,
CalendarSystem calendar, int scalar)
{
Preconditions.CheckNotNull(calendar, "calendar");
...
}
nullにできることとできないことも文書化する必要があります。