我有一個名爲DatabaseRow
的抽象類,它在派生和構建後主要從Load(object id)
方法加載。方法鏈接的最佳實踐(「return this」)
我有很多代碼創建類的新實例,從一個ID加載它,然後返回類。我想簡化這段代碼到一行代碼中(只是爲了整潔,有很多類只會有返回這些Loaded實例的屬性列表)。
我可以想到做這件事有兩種方式,但對我來說都不是「正確」的。
我在Load
方法到底能return this;
和使用return new Derived().Load(id);
2.我可以創建一個通用的方法返回一個載入的方法。
public static T LoadRow<T>(object id) where T : DatabaseRow, new()
{
T row = new T();
row.Load(id);
return row;
}
我已經看到了使用相同的方法,數一些其他的代碼,但我從來沒有見過任何有經驗的開發人員推薦它,我也沒有穿過在.NET框架的任何方法來了做同樣的事情,所以也許這不是最佳做法?
有沒有人知道任何其他解決方案可能比這兩個更好?
解決方案:
閱讀SirViver的回答和評論後,我意識到,返回需要的所有屬性進行反正緩存。解決方案很不同,但類似於選項(我不希望任何人拿出這個答案,因爲我沒有解釋這部分設計)
所有這些實例將從從數據庫中的另一列中檢索的值(如果您喜歡,則使用數據庫關係)。我沒有試圖從這個值中加載新的實例,而是創建了一個方法來從列名稱加載實例並將加載的值緩存在Dictionary中。這很有效,因爲這是DatabaseRow
類的主要功能之一。
private Dictionary<string, DatabaseRow> linkedRows;
protected T GetLinkedRow<T>(string key) where T : DatabaseRow, new()
{
if (linkedRows.ContainsKey(key)) return (T)linkedRows[key];
else
{
T row = new T();
row.Load(this[key]);
linkedRows.Add(key, row);
return row;
}
}
在我的情況下,我有一個類繼承'DatabaseRow',並有5個屬性都使用這個相同的功能。有5行代碼,類似於'public Derived MyProperty {get {return new Derived()。Load(myInt); }}比將屬性分隔成多行代碼要容易得多。 – Connell 2011-06-01 12:01:17
但是,財產法的「整潔」究竟如何呢?無論如何,在大多數情況下,屬性代碼應該由Visual Studio摺疊,並且不像你總是要經常看類實現。也就是說,構建和加載屬性訪問數據似乎非常危險。如果有人不知道結果需要緩存,可能會導致性能下降和/或意外行爲。 – SirViver 2011-06-01 12:13:34
就是這樣!我現在覺得自己像個白癡。你對緩存的評論提醒我,我已經在我的DatabaseRow類的底部創建了這個函數! 'protected T GetLinkedRow(string key)其中T:DatabaseRow,new()'加載行並將其緩存在基於key的值的字典中。 –
Connell
2011-06-01 12:20:16