契約プログラミング

14
Groovy でででででででで 契契契契契契契契契

Upload: oda-shinsuke

Post on 28-May-2015

2.665 views

Category:

Technology


2 download

TRANSCRIPT

Groovy でもやってみよう!

契約プログラミング

• 自己紹介

• 契約プログラミングってなに?

• Groovy では?

• 他の言語では?

• まとめ

アジェンダ

•名前:織田 信亮 (おだ しんすけ)

•勤務地:大阪で開発者しています

•.NET (C#) がメイン (Java はよく知りません )

•SQL World, わんくま同盟 , JGGUG の勉強会等に参加

•オンラインの活動

  Blog :お だ のスペース

  http://d.hatena.ne.jp/odashinsuke/

  twitter : @shinsukeoda

自己紹介

契約プログラミング

僕と契約して ry

契約プログラミング

• 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 と組み合わせると凄いことに!!

• Assert で事前条件書くより、なんかかっこいい!

• 契約を書くことで、誤った実装を許さない• Gcontract だと、 HTML ドキュメントに条件を

出力出来る• 個人的な話ですが、 DbC あまり試せていません。

一緒に勉強しませんか?

まとめ