程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C# Idioms: Safely方法

C# Idioms: Safely方法

編輯:關於C語言
marshine

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



名稱

Safely Method

意圖

通過方法保證返回有效(不為空引用,null或Nothing)的對象或拋出異常,當存在多個調用者時簡化調用者需要處理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>類)。
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved