C# Idioms: Safely方法

來源:互聯網
上載者:User
C# Idioms: Safely方法

marshine

(原文排版格式 http://www.marshine.com)



名稱

Safely Method

意圖

通過方法保證返回有效(不為空白引用,null或Nothing)的對象或拋出異常,當存在多個調用者時簡化調用者需要處理null傳回值的代碼。

動機

一個存放對象的集合或類似功能的容器類,提供了根據索引值返回集合成員的介面,如果不存在指定索引值的項,則返回一個Null 參考。例如根據Student的SID(學號)從StudentManager返回Student對象,如果存在指定的學號,則返回一個有效Student對象,否則返回null。大多數情況下調用者需要根據是否null值決定如何處理,如果在程式的多處都需要假定返回的一定是非null的有效對象,否則程式必須執行特殊的路徑,如拋出異常,如下:

Student student = studentColleciont.GetStudentByID("13432");
if (student == null) {
// null處理代碼,如拋出異常
}

顯然在每一個調用處書寫這些代碼會造成代碼的重複,即便是將處理過程放在一個單獨的null值處理方法中,調用方仍然需要調用null值處理方法,並且null值處理方法顯得很孤立,影響程式的結構。

產生這個問題的關鍵是因為調用者依賴於方法的傳回值,並強化了方法定義的後置條件(不允許為null值),但是並不能修改原來方法定義的後置條件,因為其它地方需要保持原來的 定義。解決辦法是提供擴充了原方法契約(Contact,根據Design by Contact的思想,方法定義就是一個調用者和實現者之間的契約)的新方法,因為擴充方法要保證返回適用的值(使用“適用”,是因為null並非無效,只是不適應當前調用處),所以將它稱之為Safely方法。Safely方法保證返回 適用的值,並提供統一的異常處理方式,調用者不需要再處理返回null對象的情況。

適用性

多個調用者需要依賴方法返回適用的值。
無法修改原來的介面,原來的方法契約被更多的地方使用。
調用者不直接處理不適用值(如通過異常傳遞給上層調用者)。
結構

在原來的集合或容器上增加Safely方法,方法名由原來的方法名加Safely尾碼:

XXXSafely(...);
GetXXXSaftly(...);

效果

簡化了調用者對不適用傳回值的處理,消除了調用者冗餘的不適用值處理代碼,並且能夠更好的維護不適用值的處理代碼。

實現

因為Safely方法只是在原來傳回值方法上的契約擴充,因此Safely方法將請求傳遞給原來的方法,然後增加不適用值的處理。

程式碼範例

我們在StudentManager上增加一個GetStudentByIDSafely方法,當指定的Student不存在時,返回一個自訂的異常NotExistedStudentException,更上層的代碼可以通過捕獲異常來處理:

public Student GetStudentByIDSafely(string sid)
{
Student student = GetStudentByID(sid);
if (student == null)
{
// 拋出一個特定的異常
throw new NotExistedStudentException(sid);
}
return student;
}

語言相關性

語言無關。

相關模式

Nullable Object模式也被用於處理null值。同Nullable Object模式的差異在於,Safely方法保證返回不為null的對象, 而Nullable模式的目的是使null值和其它值一樣使用統一的處理方式,如調用ToString。Nullable將在Microsoft .Net Framework 2.0中得到直接支援(System.Nullable<T>類)。




聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.