我寫了一個工作語法來替換名爲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日期。我將擴展這些功能以幫助更輕鬆地編寫測試數據。
無論如何,我正在尋找幫助來真正清理語法。我可以做出任何改變,因爲這是新鮮的,所以我想從一開始就讓它變得非常時髦,而不是稍後再改變它。
感謝
方括號看起來非常好,一致。比角度更容易打字。謝謝! – egervari 2010-10-20 10:53:34