2010-10-20 45 views
3

我寫了一個工作語法來替換名爲ScalaDBTest的scala中的dbunit。整個程序的工作 - 只花了2天寫。我有很多打磨要做。什麼可以使這個dsl​​更容易輸入或閱讀?

無論如何,我使用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個省份來自加拿大,因此它們將自動從默認值繼承。在第三種情況下,我們用美國代替紐約。我們可以根據需要混合/匹配。

實際上,這樣可以節省大量的打字和認知負擔,因爲我們通常只關心實踐中的一些值,其餘的可能僅僅是佔位符來讓數據庫關閉丟失的必填字段和等等。這對測試多態對象也有幫助。

下面是另一個:

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

這個片斷顯示,你實際上可以把空值沒有做任何的技巧,比如在DbUnit的。在DbUnit中,您必須首先創建一個將自定義字符串(如「[NULL]」)轉換爲實際空值的轉換器。實際上,我們可以更具表現力,並提供各種表達式和函數來幫助生成數據。例如,$現在返回當天日期/時間的格式正確的sql日期。我將擴展這些功能以幫助更輕鬆地編寫測試數據。

無論如何,我正在尋找幫助來真正清理語法。我可以做出任何改變,因爲這是新鮮的,所以我想從一開始就讓它變得非常時髦,而不是稍後再改變它。

感謝

回答

1

我會建議程度上通過以下方式將標籤最初的語法:列名

  1. 段/組標籤。
    國家:[標籤:名字]
    - COUNTRY_ID:1,名稱: 「加拿大」
    - COUNTRY_ID:2,名稱: 「美的」 的列索引
  2. 段/組標籤,最大限度地減少打字。
    國家:[標籤:2]
    - COUNTRY_ID:1,名稱: 「加拿大」
    - COUNTRY_ID:2,名稱: 「美的」
  3. 單Recod
    國家:
    - [標籤:2 ] COUNTRY_ID:1,名稱:「加拿大」
    - [標籤:名字] COUNTRY_ID:2,名稱:「美的」

可以消除基於索引標籤,如果你不想跟蹤的數記錄中的列。

如果你想擴展您可以添加像併發的記錄組的另一個屬性的工具,例如創建5K行與5個話題將是這樣的:


國家:[標籤:名字] [併發:5]
- [標籤:2] COUNTRY_ID:1,名稱: 「加拿大」
- [標籤:名字] COUNTRY_ID:2,名稱: 「美的」

+0

方括號看起來非常好,一致。比角度更容易打字。謝謝! – egervari 2010-10-20 10:53:34

1

我會考慮在Scala中嵌入這個,而不是創建外部DSL。這將有助於案例類,默認參數,編譯器生成的複製方法。

+0

我使用scala的組合分析庫。這是一塊蛋糕。 – egervari 2010-10-20 10:51:40

1

雖然這肯定是重要的是要有一個容易理解和簡潔的格式,恕我直言,仍然不能證明你自己的專有權沒有尋找標準化改變當地人。您是否考慮過使用輕量級和更易讀的XML替代方案,如JSONHAML?請注意,如果您只支持定義明確的子集,則仍然具有工具支持和標準化的優勢。

+0

JSON比我的格式更難編寫和推理。數據庫不需要像那樣嵌套。這完全不適合這個問題。我對哈姆的瞭解不多,但我認爲這種格式仍然過於複雜,目標遠大於我在這裏設定的目標。這不是關於表示 - 而是關於在數據庫中創建測試數據。例如,你將如何做默認列定義?這將有點奇怪。 – egervari 2010-10-20 11:59:53

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 
相關問題