C# Idioms: Safely方法

<script type="text/javascript"> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
<script type="text/javascript"> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
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后缀:

XXX Safely(...);
GetXXXSaftly(...);

效果

简化了调用者对不适用返回值的处理,消除了调用者冗余的不适用值处理代码,并且能够更好的维护不适用值的处理代码。

实现

因为 Safely 方法只是在原来返回值 方法上的契约扩展,因此 Safely 方法将请求传递给原来的 方法,然后增加不适用值的处理。

代码示例

我们在StudentManager上增加一个GetStudentByID Safely 方法,当指定的Student不存在时,返回一个自定义的异常NotExistedStudentException,更上层的代码可以通过捕获异常来处理:

public Student GetStudentByID Safely(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>类)。


seover="window.status='正文--C# Idioms: Safely 方法';return true">
<script type="text/javascript"> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
<script type="text/javascript"> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值