2010-08-05 79 views
2

有沒有人看過變態代碼 - 也就是說,生成並運行指令(包括IL和Java字節代碼,以及本機代碼)的代碼 - 用於減少樣板代碼?使用變形代碼減少樣板

無論應用程序或語言如何,通常都會有一些數據庫代碼從數據庫中獲取行並返回對象列表。當然,根據你的數據庫連接器,有無數種方法可以做到這一點。您可能最終通過索引訪問行的單元格(這很尷尬,因爲將「SELECT Name,Age」更改爲「SELECT Age,Name」會破壞您的代碼,再加上索引混淆含義)或使用myObject.Age = resultRow。 getValue(「年齡」)(很尷尬,因爲這涉及簡單地通過每個字段來根據列設置其數據)。

保持與數據庫主題,LINQ to SQL是真棒。但是,定義數據模型並不太好,特別是當數據庫有很多表,SSMS無法在對象瀏覽器中列出所有表時。另外,這不是我不喜歡的存儲過程寫入或SQL參與;只是將對象連接到數據庫。

有人在我的實習生從我們的SqlCommand類(它繼承自System系統)使用.NET反射與System.Reflection.Emit生成一個方法來設置字段(使用包含列名稱的屬性進行裝飾)在具有無限構造函數的任何模型對象上。我會考慮這個變形,因爲該程序的特定部分寫入新的方法。

這種從數據庫生成對象的模式只是一個例子。兩天前我遇到的一件事是通過數據綁定支持SWT(通過JFace)。我用setAddress(Address address)和getName()創建了這些完全乾淨的模型,現在我必須使用PropertyChangeSupport消息傳遞器來污染setter,並攜帶一個PropertyChangeSupport實例(即使它只是抽象基類)!然後我發現PojoBindables,現在我感覺像一個80級的數據綁定,只是因爲我需要寫少。

具體來說,使用類似這樣的東西或Java Agent的本機代碼的東西真的很好。

回答

0

泛型編程可能會成爲你的衚衕。 Concept C++ website有一個非常好的教程,涵蓋抽象和提升,可用於任何語言的想法,並將樣板代碼轉化爲積極的力量。通過檢查幾乎完全相同的一系列樣板方法,您可以推導出一組要求,從概念上統一代碼(「爲了使X發生,必須執行Y,因此使X1發生,必須使用差異1來執行Y」)。 。從那裏您可以使用模板來捕捉共同點,並使用模板輸入來指定差異。 C#和Java在這一點上都有自己的泛型實現,所以值得一試。