契約プログラミング
TRANSCRIPT
•名前:織田 信亮 (おだ しんすけ)
•勤務地:大阪で開発者しています
•.NET (C#) がメイン (Java はよく知りません )
•SQL World, わんくま同盟 , JGGUG の勉強会等に参加
•オンラインの活動
Blog :お だ のスペース
http://d.hatena.ne.jp/odashinsuke/
twitter : @shinsukeoda
自己紹介
• Design By Contract (DbC) のこと
• Eiffel という言語が起源
• 仕様をコード内に記述する 事前条件 ( メソッドの開始時に満たす条件 ) 事後条件 ( メソッドの終了時に満たす条件 ) 不変条件 ( どんな操作が行われても保障される条件 )
• サポートする言語 Eiffel D Spec#
契約プログラミング
事前条件の例 - 実装
The Spec# programming system: An overview. より抜粋http://research.microsoft.com/en-us/projects/specsharp/krml136.pdf
• Groovy での 契約プログラミングを行うライブラリ1.2.1 が最新版http://blog.andresteingress.com/2011/03/31/gcontracts-1-2-1-released/
• AST 変換にて実現• PowerAssert で契約違反を検出• アノテーションとクロージャーで条件を指定 事前条件 ( メソッドに指定 ) - @Requires( { condition } ) 事後条件 ( メソッドに指定 ) - @Ensures( { condition } ) 不変条件 ( クラスに指定 ) - @Invariant( { condition } )http://groovy.dzone.com/announcements/gcontracts-10-released
GContracts
import org.gcontracts.annotations.*
@Invariant({ speed >= 0 && speed <= 100 })class Rocket { int speed boolean started
@Requires({ !started }) def start() { started = true }
@Requires({ started }) @Ensures({ old -> (speed - old.speed) > 0 }) def accelerate() { speed += 10 }}class BetterRocket extends Rocket { @Override def accelerate() { speed += 20 }}def betterRocket = new BetterRocket()betterRocket.accelerate()
http://blog.andresteingress.com/2010/07/12/gcontracts-1-1-2-released/
• Interface にも設定可能• @Contracted がついてるパッケージ、クラスを
AST 変換対象とする• 「 ContractGroovyDoc 」 Ant タスクで、ド
キュメントに事前 / 事後条件を出力出来る
… ほかにもまだまだあります。http://blog.andresteingress.com/2011/03/11/gcontracts-1-2-0-released/
1.2 からの新機能
• メソッドのパラメータが Not Null とか、メソッド毎に仮引数名違うしめんどくせー
似たようなの書くのマンドクセ ('A`)
AnnotationContract
@Precondition@AnnotationContract({ it != null })public @interface NotNull {}
class Tester { def doSomething(@NotNull param) { println "hello world: ${param}" }}
http://blog.andresteingress.com/2011/03/31/getting-started-with-annotation-contracts/
• Java Contracts for Java ( cofoja)http://code.google.com/p/cofoja/
• .NET Code Contractshttp://research.microsoft.com/en-us/projects/contracts/
他の言語では?
テストツール の Pex と組み合わせると凄いことに!!