groovy 2.1.0 20130118

5,016 views

Published on

Groovy 2.1.0 is great!

Published in: Technology

groovy 2.1.0 20130118

  1. 1. Groovy 2.1.0が凄い 2013/1/18 JGGUG G*Workshop NTTソフトウェア Grails推進室 上原潤二 http://www.flickr.com/photos/mrhermit/3214708288/13年1月18日金曜日
  2. 2. 自己紹介 上原潤二(@uehaj) NTTソフトウェア株式会社Grails推進室 JGGUG(日本Grails/Groovyユーザグループ) 運営委員 書籍執筆: プログラミングGROOVY(技術評 論社), Grails徹底入門(翔泳社) ブログ「Grな日々」 GroovyServ, LispBuilder, GVM, staticalizer開発者 Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.13年1月18日金曜日
  3. 3. Groovy 2.1.0の新機能 invoke dynamic(Indy)フルサポート GPars 1.0へのアップグレード @DelegateToアノテーション 拡張可能な型検査 メタアノテーションシステム カスタムベーススクリプトクラスの指定 コンパイラ設定スクリプト コンパイラ設定ビルダー コマンドラインからGroovyスクリプトを指定するため のURLプリフィックスjar://, file://サポート Slide # 3 JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.13年1月18日金曜日
  4. 4. 記事かいた G*Magazine Vol.6 Groovy臨機応変(第一回) 動中の静…Groovy 2.1.0の新 機能その1 Slide # 4 JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.13年1月18日金曜日
  5. 5. 何が凄いのか? Slide # 5 JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.13年1月18日金曜日
  6. 6. 静的Groovyに 関連する機能拡 張が凄い。(個人の感 想です) Slide # 6 JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.13年1月18日金曜日
  7. 7. Groovy 2.1.0の静的Groovyに関連する機能拡張 @DelegatesToアノテーション カスタム型チェク拡張査 カスタムベーススクリプトクラ スの指定 コンパイラ設定スクリプト コンパイラ設定ビルダー Slide # 7 JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.13年1月18日金曜日
  8. 8. @DelegatesToアノテーション メソッド宣言におけるメソッド引数(クロージ ャ)に指定 def foo(@DelegatesTo(<Class>) Closure c) { … } このメソッドの引数に渡したクロージャが呼 び出されるときにはdelegateプロパティに @DelegatesToに指定した型<Class>のイン スタンスが代入されているということを、呼び 出し側が判るように宣言する。 Slide # 8 JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.13年1月18日金曜日
  9. 9. つまりこういうこと(1) def foo(Closure c) { … } foo { toUpperCase() // String#toUpperCase()が呼び出 される } Slide # 9 JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.13年1月18日金曜日
  10. 10. つまりこういうこと(2) def foo(@DelegatesTo(String) Closure c) { … } @TypeChecked // 静的型チェックのもとで foo { // このクロージャ内では、delegateプロパティは // Stringインスタンスを保持していると仮定できる toUpperCase() 静的型チェックもしくは静的 コンパイルできる。 } (DelegatesToが無ければ静 的型チェックエラー) Slide # 10 JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.13年1月18日金曜日
  11. 11. つまりこういうこと(3) def foo(@DelegatesTo(String) Closure c) { … } @TypeChecked foo { // delegateはStringインスタンスを保持 // していると仮定できる toooUpperCase() } コンパイル時エラーになる Slide # 11 JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.13年1月18日金曜日
  12. 12. 何ができるのか? Slide # 12 JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.13年1月18日金曜日
  13. 13. 何ができるのか? delegateを用いて実装されたビ ルダーやDSLの静的型チェック が簡単にできる。 「カスタム型チェック拡張」よりも簡単だが 制約は比較的大きい。 IDEが対応すれば補完も ドキュメントとしても役立つ Slide # 13 JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.13年1月18日金曜日
  14. 14. やってみた(1) 静的型チェック可能なMarkupBuilderモドキ @TypeCheckeddef  test()  {    new  HtmlBuilder().html  {        head  {            title  "Groovy  2.0.1は凄い!"        }        body  {            p  "Groovy  2.0.1は凄い!"            ul  {                li  "リスト1"                ul  "リスト2"            }            h1  "凄いわ!" コンパイル時エラーになる        } →flymake-groovyでデモ    } } https://gist.github.com/4563201 Slide # 14 JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.13年1月18日金曜日
  15. 15. やってみた(2) import  groovy.transform.* class  HtmlBuilder  {    def  html(@DelegatesTo(Html)  Closure  c)  {        c.delegate  =  new  Html()        println  "<html>";  c();  println  "</html>"    } } class  Html  {    def  head(@DelegatesTo(Head)  Closure  c)  {        c.delegate  =  new  Head()        println  "  <head>";  c();  println  "  </head>"    }    def  body(@DelegatesTo(Body)  Closure  c)  {        c.delegate  =  new  Body()        println  "  <body>";  c();  println  "  </body>"    } } class  Head  {    def  title(String  s)  {  println  "    <title>$s</title>"  } } class  Body  {    def  h1(String  s)  {  println  "    <h1>$s</h1>"  }    def  p(String  s)  {  println  "    <p>$s</p>"  }    def  ul(@DelegatesTo(Ul)  Closure  c)  {        c.delegate  =  new  Ul()        println  "    <ul>";  c();  println  "    </ul>"    } } class  Ul  {    def  li(String  s){  println  "      <li>$s</li>"  } } Slide # 15 JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.13年1月18日金曜日
  16. 16. カスタム型チェック拡張でたぶんできそうなこと Grailsのdynamic finderを、DBスキーマをコンパイ ル時に参照することで静的型チェック コンパイル時にメソッドが存在しない場合、Groovy のモジュールをGrapeでダウンロードしてメソッド を追加する メソッドが存在しない場合、invokeMethod呼び出 しにする(Groovy++のmixedモードコンパイル相当) sprintf()のフォーマットと引数型のチェック 任意のチェッカ(コーディング規約チェックとか) AST変換が道を開いたGroovyコンパイラのオープン 化の一環 Slide # 16 JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.13年1月18日金曜日
  17. 17. まとめ Groovy 2.1.0の 静的Groovyに関 連する機能拡張が 凄い。(詳しくはG*Magで) Slide # 17 JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.13年1月18日金曜日

×