私にはアイデアがあり、フィードバックを得るためにあなたに実行してもらいたいと思いました。以下をご覧になり、ポジティブかネガティブかを問わず、ご意見をお聞かせください。
私は常々、Java の規則に従わなくても、特定のデータを Java コードに埋め込む方法があればいいのにと思っていました。最近、ドメイン固有言語 (DSL) についての話をよく耳にします。DSL を日常的にもっと活用できればどんなに素晴らしいことか。私はこれを合理的にエレガントな方法で行う方法を考えていると思います。
以下は、Java コード (およびその他の C に似た言語) で表現するのが面倒で、これで解決したいことがわかっているものの例です。
文字列配列としての短い文字列のリスト
String[] ar = { "Item1", "Item2", "Item3", "Item4" };
文字列配列としての長い文字列のリスト
String[] ar = { "The quick brown\n fox jumped over\n the lazy dog.",
"The quick brown\n fox jumped over\n the lazy dog.",
"The quick brown\n fox jumped over\n the lazy dog.",
"The quick brown\n fox jumped over\n the lazy dog.", };
多次元文字列配列としての文字列のテーブル:
String[][] ar = { { "InvoiceID", "Date", "SubTotal", "Tax", "Total" },
{ "1", "1/2/2009", "300, "21", "321" },
{ "2", "1/4/2008", "100", "7", "107" },
{ "3", "1/6/2008", "200", "14", "214" } };
キーと値のペアのリスト
Map states = new HashMap();
states.add("FL", "Florida");
states.add("OH", "Ohio");
states.add("GA", "Georgia");
states.add("NY", "New York");
states.add("SC", "South Carolina");
HTML コードの単一文字列
String html = "<a href=\"www.somesite.com\">Some site</a>";
適切なテキスト形式の HTML テキスト ブロック
String html = "Hi, John,\r\n<br>\r\n<br>Thank you for writing to us. We do not currently carry that specific product.\r\n<br>\r\n<br>Regards,\r\n<br>";
以下で説明するソリューションを少し調査しましたが、これをエレガントに実現できる使用可能なライブラリを作成できると思います。Java 5 および 6 には、Annotation Processor Tool (APT) と呼ばれるものがあります (Debian APT とは異なります)。独自のソース コード プロセッサを作成します。これは、ソース コードを書き直す機会を与えるためにコードがコンパイルされるときに呼び出されます。コードを書き直した後、通常どおりコンパイルされます。
APT を利用するには、次の手順を実行する必要があります。 1. このライブラリの jar を ANT クラスパスに配置します。2. このライブラリの jar をプロジェクト クラスパスに配置します。3. javac の代わりに apt タスクを呼び出し、preprocessdir パラメータを追加して、生成されたファイルを配置する場所を指定します。
DSL コードは、コードの結果が配置される変数の直後のコメント内に配置できます。プロセッサが実行されると、コード内で次のコメントを探し、コードを抽出し、プロセッサを介して実行し、コードを生成してコンパイルを実行できます。
もう一度リストを示します。今回は、次のようになります。
文字列配列としての短い文字列のリスト
@DslTextArray
String[] ar = null; /* Item1, Item2, Item3, Item4 */
文字列配列としての長い文字列のリスト
@DslMultilineTextArray
String[] ar = null;
/*
The quick brown
fox jumped over
the lazy dog.
The quick brown
fox jumped over
the lazy dog.
The quick brown
fox jumped over
the lazy dog.
The quick brown
fox jumped over
the lazy dog.
*/
多次元文字列配列または JTable としての文字列のテーブル:
@DslTextTable
String[][] ar = null;
/*
InvoiceID,Date,SubTotal,Tax,Total
1,1/2/2009,300,21,321
2,1/4/2008,100,7,107
3,1/6/2008,200,14,214
*/
キーと値のペアのリスト
@DslMap
Map states = null; /* FL=Florida, OH=Ohio, GA=Georgia, NY=New York, SC=South Carolina */
// Could also put each pair on a new line
HTML コードの単一文字列
@DslText
String html = null; /* <a href="www.somesite.com">Some site</a> */
適切なテキスト形式の HTML テキスト ブロック
@DslText
String html = null;
/*
Hi, John,
Thank you for writing to us. We do not currently carry that specific product.
Regards,
Mike
*/
このソリューションについて私が考えることができるいくつかの要件/機能:
スクリプトが Java ソース コードで生成するデータを保持する変数を宣言する必要があります。これにより、コンパイラがデータの出所を認識していなくても、ソース コードの残りの部分は結果データについて知ることができます。
- IDE と javac がエラーを表示しないように、Java 言語に違反してはなりません。
- 既存のすべての Java コードを操作します。既存のコードを置き換える必要はありません。これらのスニペットを好きな場所に追加してください。
- 追加の型で簡単に拡張できる必要があります。
- ソースコードの強調表示と自動補完を可能にする IDE の拡張機能を後で作成できる必要があります。
- 変換はコンパイル時に行われるため、有効な Java コードを生成する必要があります。
- リスト、CSS、SQL などの複数行のテキスト ブロックなどの String および String[] に変換します。
- XML、HTML の変換とエンコード
- コードが書き直されるとき、同じ行番号を保持します。デバッグや読み取りエラーが面倒にならないように、行を追加しないでください。
- 実行時に任意の BSF 言語で記述されたコードを実行します。任意のパラメーターをスクリプトに渡し、任意の Java クラスまたはプリミティブを Java に返すことができるようにします。
- コンパイル時に任意の BSF 言語で記述されたコードを実行して、Java ソース コードを生成します。Linux での M4 の使用方法に似ています。
- 後で: 長い文字列を作成するために、多数の呼び出しからの文字列の結果を連結できるようにします。コンパイル時である場合もあれば、実行時である場合もあります。
繰り返しになりますが、これについてフィードバックをいただければ幸いです。これはばかげた考えですか?このようなものはすでにそこにありますか?このようなものをわざわざ使用しますか、それとも私だけに留めておくべきですか?