契約プログラミング

3,241 views
3,117 views

Published on

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
3,241
On SlideShare
0
From Embeds
0
Number of Embeds
195
Actions
Shares
0
Downloads
11
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

契約プログラミング

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

×