1. ホーム
  2. groovy

グルーヴィーな使い方

2022-02-07 22:47:33
<パス

1.groovyの基本

参考文献 チュートリアル
gradle package guide:compile "org.codehaus.groovy:groovy-all:${groovyVersion}"

2. Groovyによるjavaの拡張機能

1.ダイナミズム
java言語だけでは動的でない。groovyはこの欠点を補っている。groovyでは、プログラムの実行時にコードのロジックを再リリースすることなく自由に変更できますし、groovyの弱い型付けによって、あらゆる種類の型変換の問題に直面することはありません。
2. 構文糖
Groovyはjava言語とスクリプト言語の両方の機能を構文に持ち、構文を大幅に簡略化しています。

3. プロジェクトのダイナミクスを高めるためにgroovyを使用する

Java開発者にとって、あるプロジェクトに取り組む際、ある機能の一部を頻繁に修正・追加する必要がある、ハードコードのプロジェクトを使おうとすると頻繁にリリースしなければならず、成熟したシステムでは明らかに許されない、このような問題にしばしば遭遇する。では、コードプロジェクトを再リリースせずにシステム機能を実現するにはどうすればよいかを考えなければならない。以下に3つの方法を挙げる。

  1. 頻繁に変更する必要のあるシステム構成をデータベースに書き込んでおき、構成を変更する必要があるときは、データベースのパラメータを変更すればよいようにする。
  2. drools などのルールエンジンを使用する
  3. groovyの使用

あなたは、データベースの設定方法を使用する場合は、実際にはほとんどすべてのシステムは、多かれ少なかれ、この実装を持っていると言うことができる、このアプローチは、実行時の動作を変更するには、設定フィールドを取得するために実行時にデータベースを読み込み、データベースに比較的単純なデータフィールドを記述するために適している、このアプローチは非常に一般的で一般的ですが、このアプローチは比較的単純な構成にのみ適用され、時の必要性は変更がより複雑になると論理変化を伴う、この方法はもはや適用されませんです。
droolsならロジックも入れられるし、性能もいい。しかし、学習コストの問題があります。droolsにコードを書きたいjava開発者は、そのために少し努力する必要がありますし、droolsのコードはデバッグできないので、開発・保守ともに頭を悩ませるという深刻な問題があります。
groovyの良いところは、Java開発者がシームレスにgroovyで開発でき、さらにJavaのコードを直接groovyにコピーして実行できることです。groovyはStringを直接読み込んで実行することをサポートしているので、Javaコードを文字列としてデータベースに書き込んで、実行時に動的に読み出して実行することが可能です。中のコードのロジックは自由に変更することができ、公開することなくすぐに変更を反映させることができます。また、同じコード群をローカルにデバッグすることができ、例外が発生した場合も通常のjavaコードと何ら変わりはない。

以下は、テストに使ったgroovyのコードで、感触を確かめたものです。
1. Groovyクラスのパース


import org.codehaus.groovy.runtime.InvokerHelper

class a{
    static void main(String[] args) {
        GroovyClassLoader classLoader = new GroovyClassLoader()
        Class<? > ruleClazz = classLoader.parseClass(
                "def b(){ println \"I am grovy script b\" }\n" +
                        "void c(){ println \"I am grovy script c\"}\n" +
                        "private d(){println \"I am grovy script d\"}\n" +
                        "def e(int param = 1000){println \"I am grovy script e param default value is \"+param}\n" +
                        "String f(){return \"return from method\"}"
        )
        Script script = InvokerHelper.createScript(ruleClazz, new Binding())
        script.invokeMethod("b",null)
        script.invokeMethod("c",null)
        script.invokeMethod("d",null)
        script.invokeMethod("e",null)
        println script.invokeMethod("f",null)
    }
}

2. Groovy 式のパース

import org.codehaus.groovy.control.CompilerConfiguration
class a{
    static void main(String[] args) {
        CompilerConfiguration cfg = new CompilerConfiguration()
        cfg.setScriptBaseClass(Script.class.getName())
        def shell = new GroovyShell(cfg)
        def script = shell.parse("print 'value ' + value + ' as:' \n value>0?'positive':'negative'")
        def binding = new Binding()
        script.setBinding(binding)
        binding.setVariable("value",-1)
        println script.run()
        binding.setVariable("value",3)
        println script.run()

        println Eval.xyz(1, 2, 3, "x + y * z")// simple expression script, wrapper for GroovyShell
    }
}

Stringは完全にデータベースに格納し、実行時に読み出してから実行することができる(もちろん、効率化のためにスクリプトをキャッシュしておく方が良い)。こうすれば、データベース内のコードを修正するだけで、プロジェクトの挙動を動的に変更することができる。