這是一個簡單的設計決策,似乎對每一方都有重大的熱情。我正在努力去真正瞭解哪種設計的負面影響最小。設計決策:通過方法進行溝通
我要補充一個香蕉的方法:
public Banana AddBanana(string name)
{
// add the banana
var _Banana = new Banana { Name = name };
this.Bananas.Add(_Banana);
return _Banana;
}
但在某些情況下,我不能添加一個香蕉,像這樣:
public Banana AddBanana(string name)
{
// test the request
if (this.Bananas.Count > 5)
return null;
if (this.Bananas.Where(x => x.Name == name).Any())
return null;
// add the banana
var _Banana = new Banana { Name = name };
this.Bananas.Add(_Banana);
return _Banana;
}
現在,我想回去傳達給呼叫者爲什麼他們不能。
哪種方式更好?
方法1:用一個異常
public Banana AddBanana(string name)
{
// test the request
if (this.Bananas.Count > 5)
throw new Exception("Already 5 Bananas");
if (this.Bananas.Where(x => x.Name == name).Any())
throw new Exception("Banana Already in List");
// add the banana
var _Banana = new Banana { Name = name };
this.Bananas.Add(_Banana);
return _Banana;
}
方法2進行通信:與測試
public Class CanAddBananaResult
{
public bool Allowed { get; set; }
public string Message { get; set; }
}
public CanAddBananaResult CanAddBanana(string name)
{
// test the request
if (this.Bananas.Count > 5)
return new CanAddBananaResult {
Allowed = false,
Message = "Already 5 Bananas"
};
if (this.Bananas.Where(x => x.Name == name).Any())
return new CanAddBananaResult {
Allowed = false,
Message = "Banana Already in List"
};
return new CanAddBananaResult { Allowed = true };
}
public Banana AddBanana(string name)
{
// test the request
if (!CanAddBanana(name).Allowed)
throw new Exception("Cannot Add Banana");
// add the banana
var _Banana = new Banana { Name = name };
this.Bananas.Add(_Banana);
return _Banana;
}
在方法1進行通信,消費者知道基於所述exception.Message的問題。
在方法2中,消費者可以防止發生異常而不是抓住異常。
哪種方法更好?
我讀過這樣的內容:設計類,以便在正常使用中不會拋出異常。例如,FileStream類公開了另一種確定是否已到達文件末尾的方法。這樣可以避免在讀取文件末尾時引發的異常。 http://msdn.microsoft.com/en-us/library/seyhszts(v=vs.71).aspx
但「特殊」的方法似乎是少代碼。這是否意味着更簡單/更好?
無法添加香蕉作爲例外情況,還是可以在正常操作過程中發生? – BrokenGlass
這不是特例,請看測試。重複和限制。沒有什麼特別的。 「例外情況是特殊情況」是一個流行的短語,但這裏真正的決定點是什麼? –