Groovyでの検証DSL

命令型プログラミング言語の一般的な問題の1つは、ツリーマークアップやデータ処理のルールセットなど、宣言構造の式の欠如です。 Groovyは、 Builderなどのクラスや抽象構文ツリーレベルでのメタプログラミングでこの問題を解決しました。



同様に、入力データの処理は、クライアント/サーバーアプリケーションの不可欠な段階の1つです。 このプロセスは、多くの場合、一連のifおよび対応する例外によって記述されます。 多数のパラメーターを使用すると、このようなコードは読みにくくなり、正確性の分析が重要なタスクになります。 そのため、多くの場合、データの前処理のロジックはいくつかのメソッドとクラスによって「広げられ」ます。 さらに、新しいパラメーターが表示されると、そのパラメーターのチェックと正規化(フォーマット、文字のエスケープなど)を忘れがちです。 この問題の解決策として、DSLを使用して宣言スタイルでこれらのルールを記述することができるGroovyライブラリが作成されました。 たとえば、次のスクリプトは、メールアドレス、ログイン、性別、「ルールに同意します」ボックスの状態、重量、日付の6つの受信パラメーターを処理します。



import org.grules.console.Gender // isEmail   Java/Groovy ,    — email.            import static. email isEmail ["Invalid email"] //  >>     — isAlpha  isUnique. invalidLoginssage  dupLoginssage     . login isAlpha [invalidLoginssage] >> isUnique [dupLoginssage] // Gender  Java enum.    gender  ,     "MALE".         Groovy . gender["MALE"] toEnum(Gender) // m   ResourceBundle,  m.agreeToTerms —  . termsCondition[""] !isEmpty [m.agreeToTerms] //  o     .          it. weight toPositiveBigDecimal [decimalErr] >> {round it / 1000} //    &&, ||  !.              . endDate isAfterNow && isBefore(deadline) && {it.day != 1}
      
      





スクリプトの実行結果は、5つのグループに分けられたパラメーターを持つJavaオブジェクトの形式のレポートです。



DSLの場合、検証プロセスはライブラリの制御下にあるため、メタレベルでの操作(たとえば、各パラメーターの統計の収集やクライアント側のJavascriptコードの生成)を実行できます。 Javaでは、アノテーションを介して同様の機能を使用できますが、ASTへのアクセスと非プリミティブデータ型のサポートがないため、その範囲が制限されます。



開発者がDSLの使用を開始するために必要なのは、プロジェクトクラスパスにライブラリを含め(たとえばMaven経由 )、Grulesサフィックスとすべてまたは一部のパラメーターの処理ルールの説明を使用してGroovyスクリプトを作成することです。



HelloWorldプロジェクトは、3つのファイルで構成されています



HelloGrules.groovy



 package test email isEmail ["Invalid email"] age toPositiveInt ["Invalid age"] >> {it > 18} ["You must be adult"]
      
      





Test.groovy



 package test import org.grules.Grules class Test { public static void main(String[] s) { def grules = new Grules() def result = grules.applyRules(HelloGrules, [email: "megmail.com", age: "35"]) assert result.cleanParameters.age == 35 assert "email" in result.invalidParameters assert result.invalidParameters.email.errorId == "Invalid email" println result } }
      
      





build.gradle



 apply plugin: 'application' apply plugin: 'groovy' apply plugin: 'maven' repositories { mavenCentral() } mainClassName = "test.Test" dependencies { groovy 'org.codehaus.groovy:groovy:2.0.5' exclude group: 'asm', module: 'asm' compile 'org.grules:grules:0.2.0.8' exclude group: 'asm', module: 'asm' }
      
      





開始するには、ルートディレクトリでgradle run



コマンドをgradle run



ます。



プロジェクトの詳細については、次のリソースを参照してください。wikiオンラインコンソールgithub出版物 (英語)。



All Articles