3

ScalaDBTest と呼ばれる scala の dbunit を置き換える実用的な文法を作成しました。プログラム全体が動作します - 書くのに 2 日しかかかりませんでした。やるべきことがたくさんあります。

とにかく、DSL がデータベースにデータを入力するために使用している文法は順応性があり、それについてのフィードバックが欲しいです。

基本的な構文は次のようになります。それはとても簡単です:

country:
- country_id: 1, name: "Canada"
- country_id: 2, name: "United States"

これは、XML や SQL の挿入ステートメントよりも確実に優れています。

「:」や「=」を使って議論しました。前者の方が見栄えが良いですが、後者は自動的に入力できるようです。

レコードに「ラベルを付ける」という概念もあります。ある意味で、上記の構文は匿名レコードでした。ラベルはさまざまな方法で使用できるため、興味深い機能になります。

country:
    record: Canada -> country_id: 1, name: $label # produces "Canada"
    record: UnitedStates -> country_id: 2, name: $label.uncamel # produces "United States"

私はこの構文が嫌いです。ちょっと二言です。「-」を使用するのは正しくないように見えますが、「record」のような実際のコマンド ワードを使用する場合は、「->」を使用してそれらを区切る必要があります。

$label は単にラベルを繰り返すだけなので、文字列を再利用する方法として最小限のラベルを使用できます。$label.uncamel は、キャメルケースのように見える場所にスペースを追加します。

ラベルの背後にある考え方は、API が ID を覚えなくてもレコードにアクセスできるようにすることです。取得したい国オブジェクトが「カナダ」であることがわかっている場合は、ラベル「カナダ」を渡すだけで、それが一意の ID に変換され、データベースから取り出されます。

デフォルトのパラメータを指定できる例を次に示します。

province:
? country_id: 1, nice_weather: true
- province_id: 1, name: "British Columbia"
- province_id: 2, name: "Manitoba", nice_weather: false
- province_id: 3, name: "New York", country_id: 2

ここで、本当の力を見ました。これら 3 つの「都道府県」レコードはすべて、4 つの列を持ちます。2 つの州はカナダからのものであるため、デフォルト値から自動的に継承されます。3 番目のケースでは、New York の United States で上書きします。必要に応じて組み合わせることができます。

実際には、実際にはいくつかの値しか気にしないことが多いため、これにより入力と認知負荷が大幅に節約され、残りは、必要なフィールドの欠落などについてデータベースを黙らせるための単なるプレースホルダーになる可能性があります。これは、ポリモーフィック オブジェクトのテストにも非常に役立ちます。

ここに別のものがあります:

article:
? date_create: $now
- article_id: 1, title: "The Fed Sucks"
- article_id: 2, title: null

このスニペットは、dbUnit のようなトリックを行わずに実際に null 値を配置できることを示しています。DbUnit では、カスタム文字列 ("[NULL]" など) を実際の null 値に変換するトランスフォーマーを最初に作成する必要があります。

実際、私たちはより表現力に富み、さまざまな表現や関数を提供してデータの生成を支援することができます。たとえば、$now は、今日の日付/時刻の適切にフォーマットされた SQL 日付を返します。これらの種類の機能を拡張して、テスト データの作成を容易にします。

とにかく、構文を本当にきれいにするための助けを探しています。いくらでも変えられるし、これは新鮮なので、あとで変えるよりも、最初からカッコいいものにしたいと思っています。

ありがとう

4

4 に答える 4

1

外部 DSL を作成するのではなく、これを Scala に埋め込むことを検討します。役立つ機能は、ケース クラス、デフォルト パラメーター、コンパイラによって生成されたコピー メソッドです。

于 2010-10-20T05:32:21.360 に答える
1

次の方法で、ラベルの初期構文を拡張することをお勧めします。

  1. 列名によるセグメント/グループ ラベル。
    country: [label:name]
    - country_id: 1、name: 「カナダ」
    - country_id: 2、name: 「米国」
  2. 入力を最小限に抑えるために、列インデックスごとにラベルをセグメント化/グループ化します。
    country: [label:2]
    - country_id: 1、名前: 「カナダ」
    - country_id: 2、名前: 「米国」
  3. シングルレコード
    国:
    -[label:2] country_id: 1, name: "カナダ"
    -[label:name] country_id: 2, name: "米国"

レコード内の列数を追跡したくない場合は、インデックス ベースのラベルを削除できます。

ツールを拡張したい場合は、レコード グループの同時実行などの別の属性を追加できます。たとえば、5 つのスレッドで 5K 行を作成すると、次のようになります。


country: [label:name] [concurrency:5]
-[label:2] country_id: 1, name: "カナダ"
-[label:name] country_id: 2, name: "アメリカ合衆国"

于 2010-10-20T05:36:08.083 に答える
1

理解しやすく簡潔な形式であることは確かに重要ですが、標準化された代替手段を探すことなく、独自の独自仕様を作成することはまだ正当化されていません。JSONHAMLなど、軽量で読みやすい XML の代替手段を使用することを検討しましたか? 適切に定義されたサブセットのみをサポートする場合でも、ツールのサポートと標準化の利点があることに注意してください。

于 2010-10-20T11:51:50.180 に答える
1

これはYAMLによく似ているので、それを確認することをお勧めします。あなたが持っているものの有効なYAML構文のカップルを次に示します。

country:
  - country_id: 1
    name: Canada
  - country_id: 2
    name: United States

# country
---
country_id: 1
name: Canada
---
country_id: 2
name: United States
于 2010-10-20T12:37:03.223 に答える