昼食の時に話題になったので、考えてみた。
最初からあまり書くことはない。 大抵、デバッグ中に書く。
ただし assertion を埋め込むようなデバッグをした次のコーディングフェーズでは、結構書く(長続きはしない)。
契約による設計をしたいと思いつつ、場当たり的。
最初に、自前の assert 処理を定義する(assert 関連マクロ、例外クラス、assertion を評価する関数など)。
比較的 assertion を埋め込む。
うーん。C++ の時ほどは書かないかな。
assert a_obj != null;
とか書いていて後で「あまり意味ないな」って思ったり。 C++ だと assertiion でチェックしておかないと発見が遅れる場合があるが、Java だと NullPointerException が吐かれるから大抵気がつくから。
簡単に無効化できないという意識があるためほとんど書かない。 大規模なパッケージの場合は、Makefile.PL を実行する際デバッグフラグを立てると make 時にコメントアウトされている assertion を有効にするようにソースコードを書き換える。
事前条件/事後条件/不変表明で宣言できる仕様はプログラムの仕様の一部であるので、カバーできる範囲を明確にしつつ議論するのが重要。
assertion による実行時検出の場合は、実際にそこを制御が通過しなければならない。テストフェーズとの連携があると実用的(単体テストスケルトンの自動生成など)。
事前条件/事後条件/不変表明から内在的な表明状態を抽出できたとして、状態数はどれぐらいになるのだろう? 1〜3ぐらいだと面白くない。かといって多すぎる場合は設計上の誤りがある可能性が高い。
Naney (なにい)です。株式会社ミクシィで SNS 事業の部長をしています。
nDiki は1999年1月に始めたコンピュータ日誌を前身とする Naney の Web 日記(兼パーソナルナレッジベース)です。ちょっとしたノートは nNote にあります。
※内容は個人的見解であり所属組織とは関係ありません。