2012-01-31 13 views
3

私が働いているアプリケーションは、ファイルのインポートから大量のデータを入力し、それに従ってデータベースの列を更新します。私は、検証に基づいてすべての入力値を処理し、それに応じてデータの変換を実行するカスタムルールエンジンを用意する必要があります。 E。文法の初心者ガイド

アプリケーションのフィールドの1つは商品名です。したがって、実装する必要があるルールの1つは、ファイルからの入力値が小文字である場合、Product nameを小文字から大文字に変換することです。同様に、多くのテキスト/数学的変換が必要です。これらの理由から、各属性のルールを定義し、解析してルールを適用するカスタムルールエンジンを用意する必要があります。

ANTLRは、Javaの周囲のパーサージェネレータの1つです。
1>パーサージェネレータの動作と、文法を実装するためのベストプラクティスに関する一般的な情報。

2>私はこのルールエンジンを完全に設計する必要があるので、誰も私が参照できるサンプルルールエンジンを指摘できますか? UIからデータベース設計に至るまで私は、データベースのコアロジックとOracleのためのUI、Java用のGWTを使用してい

3>はあり、私は自分の文法を定義するのパスをフォローしたいんがJavaの

4>のために周りの他のパーサジェネレータとパーサジェネレータを使用してこのルールエンジンを構築すると、考慮すべき他のアプローチはありますか?

+0

ファイルがかなり構造的に複雑でない限り、文法はたぶんあなたの人生をより困難にするでしょう。シンプルな文字列テスト、switch文などは十分であるはずです。 – Dan

+0

さて、私たちが現在持っているルールは、始めることだけです。私が言ったように、今では文字列/数学的変換が存在するので、複雑なものが入ってくると "単純な文字列テスト、switch文"がうまくスケールされるかどうかはわかりませんでした。よく –

+0

あなたの問題を記述した方法は、結合する列の選択、出力列の選択、またはこのデータに対して任意の計算を行うことの限界が明確ではありません。あなたが許可されているものに対して信頼できる*限界*を定義できない場合は、Turing対応言語の完全な能力が必要です(Javaはうまくいくようです)。すべての列とレコードにアクセスするには、少なくともデータのアクセスと更新のためにSQLの能力が必要になるでしょう。あなたは、あなたが計算しようとしているものに明確な限界がありますか?なぜあなたはまだ別の言語があなたに役立つと思いますか? –

答えて

1

JavaベースのルールエンジンであるJbossRules(以前はDrools)を使用するだけでよいでしょう。また、スクリプトエンジンを使用してルールを実装することもできます(Apache Rhino(Javascript in Java)など)。

このような状況で自分自身を書くことは過剰なようですが、エンドユーザーがルールやスクリプトを作成しようとすると、より良いセキュリティを保証することができます。

EDITはコメントでの質問に対処するために:私は、既存のルール・エンジンを使用することをお勧め

(ALA JbossRules/Droolsの)代わりに(ルールコンポーネントに対して)あなた自身のパーサーや文法を書きます。例えば、Droolsを見てください。

ルールが(DBアクセスライブラリまたは計算ライブラリを使用する必要がある)特殊ロジックの場合、ルールによって使用される単一のJava APIを記述する必要があります(ルールによって、あなたがリファクタリングするとき)。このアドバイスは、どのルールエンジンを使用しているかに関係なく適用されます(あなた自身または既存のルールエンジン)。

データ入力ファイルのデータ形式がすでに解決されており、ルール形式とルール解析の解決策のみを探しているとします。

+0

あなたのご意見ありがとうございます。ルールエンジンはここの「機能的」な人々によって使用され、私たちのアプリケーションでは一般に公開されません。しかし、reは変換ルールのための任意のレベルの入れ子になる可能性があるので、パーサージェネレータを使うことを考えました。パーサジェネレータは正しい方法だと思いますか? –

+0

私たちのカスタム文法ではルールエンジンを使用しないか、ルールをまったく使用しないことをお勧めしましたか? –

+0

@ darkie15あなたの質問に答えるように更新されました。 –

1

パーサージェネレーターであるJavaCCがあり、ルールを評価するためのグルーヴィーがあります。スクリプトエンジンを使用するかどうかは、文法に依存します。ルールがjavascript、java、pythonなどで表現できず、新しい言語で記述したい場合は、パーサジェネレータを使用する必要があります。しかし、あなたが作成したメソッドの中でいつでもあなたが望むことを何でもやって、ルールから呼び出すことができます。ルールはスクリプトエンジンによって評価されます。