我有一些ID類型爲int的對象,例如一個productId類的product類和一個帶有customerId的Customer類。有時我覺得ID很容易混淆,並且我正在考慮使解決方案使類型系統強化它們之間的區別,就像你在Haskell中做的那樣。c#可能的解決方案,以更好的字典安全類型
這個問題是最明顯的,當我有一個多本字典,通過ID保存,以便快速訪問對象:
Dictionary<int, Product> products;
Dictionary<int, Customer> customer;
Dictionary<int, List<Customer>> customersByProduct;
customerByProduct[what_id?].Add(new Customer())
現在,當我使用了這些字典的可能混淆了什麼是字典使用的代碼關鍵,特別是如果有更多字典更復雜的設置和對象有多個ID。
有些思維遊戲我可以改善這種情況的兩種解決方案,基本上我有什麼意見,如果有其他好的方法來處理它,以及它是否是一個好主意?
到目前爲止,我還沒有經歷過真正的混淆,只是感覺它開始有點複雜。有問題的代碼現在正在編寫,所以如果這些類型的錯誤甚至發生,我不知道,但我認爲主要風險是後來其他開發人員出現並需要更改/添加內容時。
private struct CustomerId
{
public CustomerId(int id)
{this.id = id;}
public override string ToString()
{return id.ToString();}
public int id;
}
private enum ProductId { }
void Main()
{
var customers = new Dictionary<CustomerId, string>();
var products = new Dictionary<ProductId, string>();
customers[new CustomerId(1)] = "Customer1";
customers[new CustomerId(2)] = "Customer2";
customers[new CustomerId(3)] = "Customer3";
products[(ProductId)1] = "Product1";
products[(ProductId)2] = "Product2";
products[(ProductId)3] = "Product3";
customers.Dump();
products.Dump();
customers[new CustomerId(2)].Dump();
products[(ProductId)3].Dump();
int cid = customers.Keys.First().id;
int pid = (int)products.Keys.First();
cid.Dump();
pid.Dump();
}
(例如可在linqpad直接運行)
你真的有混合id值的問題嗎?如果沒有,那麼你就是在浪費時間來解決永遠不會發生的問題。 –
否:)上下文是我們核心邏輯的一大塊是從頭開始重寫的,舊的解決方案沒有這些結構。你可以爭辯說,編譯器捕獲的更多錯誤更好,如果它是一個好主意,那麼最好在錯誤實際出現之前從頭開始實現它。無論如何,爲什麼我寫這個問題的一部分是要找出它是否是一個好主意,也許它不是? – viblo
在解決虛構問題之前解決實際問題是一個好主意。 OTOH,如果這曾經是一個問題,那麼我認爲在任何可能發生的地方解決它都是一個好主意。但只有在問題發生一次之後。 –