XPでは特に、テストケースが仕様書の意味も持つと言われます。
これとDbCの事前条件/事後条件によるコントラクトはどちらが優れているのでしょうか?
これはきちんと考えると意外とややこしい問題だと思います。Martin Fowlerはこの問題に対して興味深い意見を述べています。
DbCでは一般的なルールとして仕様を記述しますが、ちょっと難しいことをやろうとするとものすごくトリッキーなコントラクトを書かなくてはならなくなります。これに対して、テストケースではAPIの使用例が仕様の代わりになるので記述は簡単になります。
その代わり、仕様としての厳密さは失われるし、アサーションコードは煩雑になります。DbCの方がすっきり書けるケースも確かに存在するのです。
使われる状況を考慮にいれなければ、どちらが良いということはいえないと思います。現実的に考えた場合、仕様を理解するには使用例と、一般的なルールのどちらも必要です。新しいライブラリを使いこなすには、最初はコード例を見た方が早いでしょうが、完全に使いこなすには一般的なルールを知らなければなりません。コード例だけだと、そこから一般的なルールを頭のなかでリバースエンジニアリングしなければならなくなるのです。
XPのようにチーム間のコミュニケーションがうまくとれている場合、一般的なルールは暗黙のうちにチームのメンバーが了解しているので、正しくインターフェースを実装することができるでしょう。
従来型の開発手法を採用している組織では完全な仕様を記述する必要があるため、DbCのようなアプローチを採用する必要があると思います。
テストケースを使用例とするなら、一般的なルールは実装コード自体になります。あの「コードは仕様だ!」という奴です。
これは実装コードがきれいにかかれており、プログラマの意図が明解に示されている場合のみ成り立ちます。
DbCではこれに加えてエラーが起こったときに誰が悪いのかを簡単に特定できるというメリットがあります。ただし、その代償として多少の冗長さを必要とすることは否めません。コントラクトはほとんど実装コードと同じくらいの長さになってしまうことが良くあります。現状、テストケースにおけるJUnitのようなデファクトスタンダードとなるツールがないのも問題です。
結局最終的な結論は出ていないのですが、個人的な好みとしてはいまのところDbCの方が好きです。最近結構DbCについて勉強しているのでバイアスがかかった見方だとは自分でも思いますが。。。
皆さんはどう思いますか?
これとDbCの事前条件/事後条件によるコントラクトはどちらが優れているのでしょうか?
これはきちんと考えると意外とややこしい問題だと思います。Martin Fowlerはこの問題に対して興味深い意見を述べています。
DbCでは一般的なルールとして仕様を記述しますが、ちょっと難しいことをやろうとするとものすごくトリッキーなコントラクトを書かなくてはならなくなります。これに対して、テストケースではAPIの使用例が仕様の代わりになるので記述は簡単になります。
その代わり、仕様としての厳密さは失われるし、アサーションコードは煩雑になります。DbCの方がすっきり書けるケースも確かに存在するのです。
使われる状況を考慮にいれなければ、どちらが良いということはいえないと思います。現実的に考えた場合、仕様を理解するには使用例と、一般的なルールのどちらも必要です。新しいライブラリを使いこなすには、最初はコード例を見た方が早いでしょうが、完全に使いこなすには一般的なルールを知らなければなりません。コード例だけだと、そこから一般的なルールを頭のなかでリバースエンジニアリングしなければならなくなるのです。
XPのようにチーム間のコミュニケーションがうまくとれている場合、一般的なルールは暗黙のうちにチームのメンバーが了解しているので、正しくインターフェースを実装することができるでしょう。
従来型の開発手法を採用している組織では完全な仕様を記述する必要があるため、DbCのようなアプローチを採用する必要があると思います。
テストケースを使用例とするなら、一般的なルールは実装コード自体になります。あの「コードは仕様だ!」という奴です。
これは実装コードがきれいにかかれており、プログラマの意図が明解に示されている場合のみ成り立ちます。
DbCではこれに加えてエラーが起こったときに誰が悪いのかを簡単に特定できるというメリットがあります。ただし、その代償として多少の冗長さを必要とすることは否めません。コントラクトはほとんど実装コードと同じくらいの長さになってしまうことが良くあります。現状、テストケースにおけるJUnitのようなデファクトスタンダードとなるツールがないのも問題です。
結局最終的な結論は出ていないのですが、個人的な好みとしてはいまのところDbCの方が好きです。最近結構DbCについて勉強しているのでバイアスがかかった見方だとは自分でも思いますが。。。
皆さんはどう思いますか?