2

私にはアイデアがあり、フィードバックを得るためにあなたに実行してもらいたいと思いました。以下をご覧になり、ポジティブかネガティブかを問わず、ご意見をお聞かせください。

私は常々、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 の使用方法に似ています。
  • 後で: 長い文字列を作成するために、多数の呼び出しからの文字列の結果を連結できるようにします。コンパイル時である場合もあれば、実行時である場合もあります。

繰り返しになりますが、これについてフィードバックをいただければ幸いです。これはばかげた考えですか?このようなものはすでにそこにありますか?このようなものをわざわざ使用しますか、それとも私だけに留めておくべきですか?

4

2 に答える 2

2

グアバ ライブラリhttp://code.google.com/p/guava-libraries/の一部である Google コレクション API を使用します。リストとマップのサポートは素晴らしいです。達成しようとしている種類の構造をサポートします

public static final ImmutableList<Color> GOOGLE_COLORS
   = new ImmutableList.Builder<Color>()
       .addAll(WEBSAFE_COLORS)
       .add(new Color(0, 191, 255))
       .build();
于 2011-02-08T01:55:11.210 に答える
1

これは確かに実行可能ですが、私はそれがあまり好きではないと言わなければなりません。

これにより、データ構造の初期化が少し簡単になります。

しかし

  • コンパイル時定数を使用してこのようなデータ構造を初期化する必要はめったにありません。したがって、class/javaファイルに隣接する別のファイルの方が便利です。

  • これは、開発者にとってまったく透過的ではありません。コメントがデータに変換されることを誰も期待していません。実際、そのようなコメントに出くわした場合は、おそらく古いコードにコメントしたと考えて、すぐに削除します

  • ATPは強力で興味深いツールですが、IDEの統合には欠けています。そのため、常にANTを使用してアプリケーションをビルドして実行する必要があります。これは、F11を実行したり、IDEがその目的のために提供するショートカットほど高速ではありません。

つまり、基本的には、開発インフラストラクチャの複雑さに大きな打撃を与えて、タイピング速度の向上を最小限に抑えます。

それでもアイデアは面白いです。私は実際には、「DSL」タイプの注釈を定義して、注釈宣言で定義された任意の言語でその注釈にコードを入れることができるバリエーションを高く評価します。もちろん、それは大きな言語の変化であり、すぐには起こらないでしょうし、おそらくまったく起こらないでしょう。

于 2009-03-17T07:07:43.407 に答える