C# Idioms: Safely方法
2024-07-21 02:19:52
供稿:網友
c# idioms: safely方法
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>類)。
本文來源于網頁設計愛好者web開發社區http://www.html.org.cn收集整理,歡迎訪問。