防御的プログラミング

防御的プログラミングとは?

注意深く慎重を期したプログラミングのことで、システム内の各コンポーネントがそれ自体を最大限に保護できるようにする。 具体的には、不正な動作を発生させるような方法でコンポーネントが呼び出された時点で、それを阻止するか?少なくとも不正動作の状況を把握しようとする試み。

ちなみに、エラーチェックは防御的プログラミングに該当しない。理由として、エラーチェックは業務上必要なコードなので、防御的プログラミングを意識しなくても、必ず実装すべきコードだから。

防御的プログラミングの実践

1. カプセル化を正しく行う
クライアントに、見せてはいけないメソッドは必ず非公開(private)にする。公開にすると、どんなに注意しても、必ずクライアントから利用される場合がある。 防御的プログラミングとは少し違うかもしれないが、クライアントに公開してしまうと、機能拡張時のエントロピーが増大するだけなので、メソッドに限らず、クラスやフィールドのアクセス修飾子を意識して、プログラムしよう。

2. 全ての警告をオンにしてコンパイルを行う
警告が生成されたということは何らかの理由が必ずあるので、それを放置してはいけない。必ず警告をつぶすこと。

3. 静的解析ツールを導入する
日常的なプログラミング作業の一環として、習慣化すること。 静的解析ツールを導入することにより、プログラムのバグっぽい箇所を教えてくれる。 JavaだとFindBugsが有名。

4. キャスト(型変換)は行わない
キャストを行うと、コンパイラに対して「型チェックを気にしない。」と宣言しているようなもん。せっかく静的言語を選択しているのに、キャストを行ってしまったら、静的言語のよさがなくなってしまう。

5. finalを徹底的に活用する
finalを付けられるものは、絶対に付けるように意識する。そうすることで、意図しないクラスの使わる機会が減り、安全性が増す。