0

補遺編集:

経験豊富な Spring Framework 開発者からのフィードバックがなかったため、これに対する回答を受け入れていません。

私は、Spring-Framework の applicationContext.xml ファイル (ここでは、Spring Bean ファクトリにロードするための Bean の初期化と依存関係が記述されています) に使用する代替 DSL に取り組んでいます。

私の動機は、Spring がこの目的で XML を使用するのが好きではなく、これまでに考案された代替手段がどれも本当に好きではないということです。ここでは説明しませんが、さまざまな理由から、Groovy などの命令型スクリプト言語ではなく、宣言型言語にとどまりたいと考えています。

そこで私は ANTLR パーサー ツールを手に入れ、SFig と名付けた新しい Bean ファクトリ DSL を考案しました。これについて詳しく説明しているリンクは次のとおりです。

SFig™ - Spring-Framework の代替メタデータ構成言語

ソースコードリポジトリサイトは次のとおりです。

http://code.google.com/p/sfig/

これまでのところ、言語構文でどのようにやっているのか知りたいです。SFig は効率的でわかりやすいと思いますか? (私は現在、複数行のテキスト文字列に特に関心があります):

properties_include "classpath:application.properties";


org.apache.commons.dbcp.BasicDataSource dataSource {
    @scope = singleton;
    @destroy-method = close;
    driverClassName = "${jdbc.driverClassName}";
    url = "${jdbc.url}";
    username = "${jdbc.username}";
    password = "${jdbc.password}";
    defaultAutoCommit = true;
}


org.springframework.orm.ibatis.SqlMapClientFactoryBean sqlMapClient {
    @scope = singleton;
    @init-method = afterPropertiesSet;
    @factory-method = getObject;
    configLocation = "classpath:sqlmap-config.xml";
    dataSource = $dataSource;
}


/* this string will have Java unescape encoding applied */
STRING str = "\tA test\u0020string with \\ escaped character encodings\r\n";


/* this string will remain literal - with escape characters remaining in place */
STRING regexp = @"(\$\{([a-zA-Z][a-zA-Z0-9._]*)\})";


/* multi-line text block - equates to a java.lang.String instance */
TEXT my_multi_line_text = ///
Here is a line of text.
This is yet another. Here is a blank line:

Now picks up again.
///;


/* forward use of 'props' bean */
java.util.HashMap map {
    this( $props );
}


/* equates to a java.util.Propertis instance */
PROPERTIES props {
    "James Ward" = "Adobe Flex evangelist";
    "Stu Stern" = "Gorilla Logic - Flex Monkey test automation";
    Dilbert = "character in popular comic strip of same title";
    "App Title Display" = "Application: ${app.name}";
    "${app.desc}" = "JFig processes text-format Java configuration data";
}


/* equates to a java.util.ArrayList instance */
LIST list {
    this( ["dusty", "moldy", "${app.version}", $str] );
    [234, 9798.76, -98, .05, "numbers", $props, ["red", "green", "blue"]];
}
4

2 に答える 2

0

私はあなたが参照しているSpringXMLの経験があまりないので、次のフィードバックを少しだけ受けてください。

2番目と3番目の警告として:

  • コードのスニペットを提供すると、言語とそのセマンティクスがどのようなものであるかがわかりますすでに行った選択の一部を完全に理解することは困難です(そして正当な理由があります)。そのため、ここでのフィードバックは、それらの選択に照らして完全に矛盾するか、不可能になる可能性があります。
  • 言語デザインは科学と同じくらい芸術であるため、この段階では、フィードバックが得られる可能性は非常に主観的である可能性があります。

より大きなメタ質問:DSLとしてSpringの構成を行おうとしていますか、それともより一般的なクラスのフレームワークとしてですか?

そこに:エンプターに注意してください。今私の主観的で不完全なフィードバック;)

  • との@プレフィックスが付いている理由はわかりませんが、 。はわかりません。また、xml-caseとcamelCaseの両方の組み合わせは、最初から完全に明らかではありません。プレフィックスはタイプ修飾子ですか、それともこれらのキーワードは言語ですか?scopedestroy-methoddriverClassName@

  • ブロックヘッダー形式についてのあなたの意図が完全にはわかりません。クラス名があり、次にそのクラスの関数があります。特定の関数に使用するクラスを指定する意図はありますか?

例えば

sqlMapClient: org.springframework.orm.ibatis.SqlMapClientFactoryBean {
    # body.
}

あるいは:

sqlMapClient {
    @class = org.springframework.orm.ibatis.SqlMapClientFactoryBean;
    # is there a sensible (perhaps built-in) default if this is missing?
}
  • 私は変数置換が好きです; 値はシステムプロパティから取得されると思いますか?

  • 特に、表示した正規表現の場合、文字列リテラルを(エスケープせずに)指定できるのが好きです。ただし、複数文字の引用符または引用符修飾子を使用することは、少し異質なようです。あなたは一重引用符を検討したと思います(シェルとPerlはリテラル文字列に一重引用符を使用します)。

  • 一方、複数行TEXTのトリプルフォワードスラッシュは正しいアプローチだと思いますが、Cスタイルの言語でのコメントを彷彿とさせる2つです。Pythonは"この目的のためにトリプルを使用します。一部のシェルイディオムには、コピーしない複数行のテキスト規則があります。

  • 私は、アドレス指定のURI概念のように見えるものを使用して、プロパティと構成の場所の外観が非常に好きです。これがURIのclasspath://file.xml場合、より明確になる可能性があります。ただし、ここでスティックの端が間違っている可能性があります。

  • 私はまた、あなたが持っているリストとマップのリテラルの概念がとても好きですが、どこにあるのかわかりません:

    • this入ってくる(Javaコンストラクターの呼び出しだと思う)
    • 一部のタイプが大文字になっている理由とそうでないタイプがある理由。デフォルトのMAPタイプがあると思いますか?必要に応じて、より具体的なタイプにすることができますか?
    • ディルバートは引用符で囲まれていない文字列リテラルですか?

最後に、別の構成DSLを紹介しますが、おそらくsysadminの使用法については、Puppetです。

うまくいきます。

于 2008-12-22T00:55:58.677 に答える
0

Spring とその applicationContext.xml ファイルについて少し背景を説明します。これにより、SFig 構文で行われているいくつかのことが明確になります。

applicationContext.xml ファイルは、Spring Bean ファクトリによって管理される Bean の Bean 初期化を表すために使用されます。したがって、このファイルの SFig バージョンで見られる Bean の例を考えると、Java アプリケーション コードでは、次のように Bean のインスタンスを作成するように Bean ファクトリに要求できます。

SqlMapClient sqlMapClient = getBean("sqlMapClient");

Bean ファクトリは、Bean が必要とするすべてのインスタンス化と初期化を、依存関係を注入するところまで処理します。この場合、SqlMapClient Bean にはdataSource Bean のインスタンスが必要です (SFig の例でも説明および参照されています)。

Bean 記述子は、次の情報を Bean ファクトリに中継します。

  • Bean の Java クラス名
  • それを要求または参照するための Bean ID
  • Bean 定義のメタ属性 (オプション)
  • コンストラクターの初期化引数 (オプション)
  • および/またはプロパティ初期化子

「@」プレフィックスは、Bean 定義のメタ属性です。これらは、Bean ファクトリが Bean を管理するために使用する属性です。たとえば、@scope = singleton は、Bean ファクトリに、Bean の単一のインスタンスを作成し、それをキャッシュし、要求されたときに参照を渡すように通知します。設定できるものは、Spring-Framework で定義されているものと同じです。

Bean がコンストラクターを介して初期化される場合、それは SFigで括弧内の引数を使用して呼び出しているように見える構文によって表現されます。

または、そのプロパティを設定することで Bean を初期化できます。'@' が前に付いていない、割り当てられた識別子は Bean プロパティです。

必要な依存関係である Bean を参照する場合、Bean ID の前に「$」を付けることで参照できます。このいくつかの例は、SFig の例に示されています。

文字列リテラルに現れる変数の ${foo.bar} スタイルは、Java プロパティ値に置き換えられます。この場合、プロパティは次の行を介してファイル application.properties からロードされます。

properties_include "classpath:application.properties";

含まれるプロパティに見つからない場合は、Java システム プロパティが次に検索されます。これは、多くの Java フレームワークで広く採用されている方法です。現在の XML ベースの applicationContext.xml ファイルにも、この使用を許可する方法があります。

java.util.Properties は Bean の初期化によく使用されるため、SFig は、Properties オブジェクトを宣言するための特別な便利な構文として PROPERTIES を提供します。対応する SFig LIST を持つ java.util.List についても同様です。また、値の配列は角括弧 [...] 内で宣言できます。

さらに、複数行のテキストのブロックを宣言するための TEXT があります。文字列リテラルのプレフィックス「@」は、エスケープ エンコーディング (C# から借用した言語構文) をオフにすることを意味します。

SFig DSL の主要な設計目標の 1 つは、本質的に宣言的であり続けることです。命令型のスクリプト機能を追加することは意図的に控えています。テキスト構成ファイルに組み込まれたプログラミング ロジックの複雑さは、それをデバッグしなければならない可能性を示唆しています。コードのデバッグのさらに別の次元を開きたくありません。

于 2008-12-22T04:18:37.740 に答える