開発現場で使えるかもしれない?
Groovyの入門
Java Doでしょう#04
2月13日
自己紹介
 @zgmf_mbfp03
 フォローは非推奨
 サバゲー, 酒大好き
はじめに
 Groovyに触れてまだ4ヶ月たってないです
 まだ入門中です
 温かい目で見守ってください Groovyわかないお
アジェンダ
 Groovyとは
 環境構築
 入門
 利用用途
 まとめ
Groovyとはなんぞや
 Java VMで動いちゃう動的型付け言語
 J2SE1.4以上で動作
 Javaとの高い親和性が!
 JavaのAPIやライブラリを簡単に使用可能
 Rubyに強い影響を受けているから似た文法が多いらしい
 私はRubyを知らない・・・
JDKについて
 要求はこんな感じ
参考: http://www.groovy-lang.org/download.html
Indy(InvokeDynamic)はJVMに追加された新しいバイトコードと、その処理の仕組みを総称する呼び方らしい・・・
私は全く理解していない!
Groovyの環境構築
 Macでの設定 (Windowsは… 知らないから調べてね!)
 ターミナルを立ち上げ
 $brew install groovy
 これだけ
 確認
 $ groovy –version
 $Groovy Version: 2.4.5 JVM: 1.8.x Vendor: Oracle Corporation OS:
Mac OS X
Groovy-Eclipse
 EclipseでGroovyを扱う
 groovy-all-x.x.x.jar追加
Javaとの差
 セミコロンを省略
 return を省略
 throws宣言を省略
 例外処理
 形宣言を省略
 プリミティブ型はラッパー型
 リテラルが異なる
 アクセス修飾子
 メソッド呼び出し
 演算子のオーバーロード
 クロージャ
 Etc…
HelloWorld
 JavaでHello World!
HelloWorld
 JavaでHello World!
 これをGroovy化!
 拡張子を *.java から *.groovy に
 セミコロンを省略
 System.out.println が println に
 カッコを省略
 スクリプト形式に
HelloWorld
セミコロンを省略
 セミコロンを省略
return を省略
 return を省略
 最後の評価された値が返却される
例外処理
 例外処理
 throwsを省略
 catchのクラスを省略
 Exception扱い
形宣言を省略
 形宣言を省略
 defは、JavaでいうObject型
 形無しは、thisが示すオブジェクトのProperty
プリミティブ型はラッパー型
 プリミティブ型はラッパー型
 ラッパー型になるが nullの代入は実行時にエラー
リテラルが異なる1
 リテラルが異なる
 浮動小数の計算が正確
 ${…} を書くと
GString扱い
 GStringは${…}の中に
書かれたものに置換
リテラルが異なる2
 リテラルが異なる
 []を書くだけでList扱い
 + や - で要素の追加、削除が可能
 演算時のオーバーロード
 他のコレクションにする場合は
as で強制変換
 Mapは連想配列風とプロパティ風
の扱い方が有る
アクセス修飾子
 アクセス修飾子
 Private? そんなものは無視
 アクセス可能
 無印はPublic扱い
 パッケージプライベートはないわけではない
メソッド呼び出し1
 メソッド呼び出し
 メソッド名はStringまたはGStringで書ける
 引数は初期化できる
メソッド呼び出し2
 メソッド呼び出し
 コンストラクタはデフォルトだけでいい
 アクセサメソッドはいらない
 裏でsetter, getter をいい感じに呼んでいるらしい
演算子のオーバーロード
 演算子のオーバーロード
 演算子は、それに対応するメソッドが存在している
クロージャ
 クロージャ
クロージャ
 クロージャ(Groovy)
参照 http://www.groovy-lang.org/closures.html
英語読めないお(´・ω・`)
クロージャ
 クロージャ(Groovy)
 第一級関数であり、メソッドとは区別される
 引数を取り、値を返し、内部で宣言された変数を参照し、使う
ことができるコードの集まり
 コードブロックやメソッドポインタのようなもの
入門なんだから
クロージャ実装
 定義と実行
匿名クラス
 Java
 Groovy
コレクション操作
 Java8 - StreamAPI forEach, sorted, map
 Groovy - Closure each, sort, collect
Groovy からStreamAPI
 StreamAPIを使うことも可能
 ラムダ式ではなくクロージャになる
JavaからGroovyクラスの利用
 JavaからGroovyのクラスを問題なく利用できる
 クラスの利用
 スクリプトの実行
JavaからGroovyの実行
GroovyShell
 GroovyShellクラス
 簡単なGroovyの実行に便利
 Binding バインド変数の設定
 GroovyShell#evaluate
 戻り値がスクリプトの結果
JavaからGroovyの実行
GroovyScriptEngine
 GroovyScriptEngineクラス
 ディレクトリ指定でGroovyスクリプトを実行
 GroovyScriptEngine#run
 戻り値がスクリプトの結果
Groovyの利用
 ビルド
 Gradle
 テスト
 Spock
 Geb
 メインの言語
 Grails
 Spring
 Android
 その他
 XMLパース
 HTML, XMLの出力
 HTMLスクレイピング
 RDBMSの操作
 Excelの操作
まとめ
 Groovyは, Javaとの親和性が高い動的型付け言語
 スクリプトとして実行が可能
 Javaよりも適当に書ける
 JavaからGroovyを呼び出せる
 Groovyを使ったツールやライブラリも有る
番外編 – Spockの紹介 −
Groovy製のテストツール Spock
 テストフレームワーク
 Groovy製でJUnit上に構築されたもの
 PowerAssertで細かいエラー情報を出力
 BDD的なテストコード記述
 標準でMockAPI使用可能
 データドリブンテストの記述が可能
PowerAssert
 JUnit
 Spock
Spockでの記述方法
 テストクラスはGroovyクラス
 テストクラスは Specification を継承する
 メソッドには @Unroll を付ける(データドリブンテスト)
 ブロックに分けて記述
ブロックについて
Mockの使用方法
 Setup(Given)ブロックに記述
 Mockでモックの定義
 >>で振る舞い定義
 クラス名.metaClass.setAttribute(インスタンス, フィールド
名, 新しい値)でフィールド変更
Spockまとめ
 JUnitより結果がわかりやすい
 BDD的な記述により、処理がわかりやすい
 標準でMockAPIがあり、楽・・・?

開発現場で使えるかもしれないGroovy