使用 EmptyClass 避免条件判断

博客介绍了在基于接口编程中,当B组件引用实现IA接口的A组件且A组件引用可空时,频繁使用条件判断易出错。引入EmptyClass实现IA接口且不做任何操作,将其作为默认值,可避免条件判断,使代码更易读、维护,且不牺牲性能。
在习惯了使用基于接口的编程之后,经常会遇到这样的问题,比如,B组件需要使用实现了IA接口的A组件,但是如果在没有A组件的情况下B组件也可以正常工作,像这样:
publicinterfaceIA
{
voidDoWork1();
voidDoWork2();
}

publicclassB:IB
{
privateIAtheA;

publicB(IAa)
{
this.theA=a;
}

publicvoidDoJob()
{
//dot.gif
if(this.theA!=null)
{
this.theA.DoWork1();
}
}

publicvoidDoOtherJob()
{
//dot.gif
if(this.theA!=null)
{
this.theA.DoWork2();
}
}
}

可以看到很多地方都要用到if(this.theA!=null)进行条件判断,如果某个地方露掉了这样的判断,运行时可能就会抛出“引用为空”的异常。有没有办法来彻底避免类似的条件判断了?有,那就是EmptyClass的目的。EmptyClass实现了比如上述的IA接口,但是EmptyClass什么都不做,即EmptyClass完全由VS.NET的智能感知自动生成(声明EmptyClass时,在写完接口名后按TAB键)。
我们看看自动生成的IA对应的EmptyClass:
publicclassEmptyA:IA
{
#regionIA成员

publicvoidDoWork1()
{
//TODO:添加EmptyA.DoWork1实现
}

publicvoidDoWork2()
{
//TODO:添加EmptyA.DoWork2实现
}

#endregion
}

现在就可以在B中来避免前面的条件判断了:
publicclassB:IB
{
privateIAtheA;

publicB(IAa)
{
this.theA=a;

//如果引用为空,则赋值什么都不做的EmptyClass
if(this.theA==null)
{
this.theA=newEmptyA();
}
}

publicvoidDoJob()
{
//dot.gif
this.theA.DoWork1();//不在需要条件判断!!!!!!!!
}

publicvoidDoOtherJob()
{
//dot.gif
this.theA.DoWork1();
}
}

这个简单的小技巧,你一定已经学会了:)
在当一个组件对另一个组件的引用可以为空的时候,EmptyClass的实例就可以作为这个引用的默认值,这样不仅没有牺牲性能(空方法调用与条件判断的开销差不多),而且使得我们的代码更漂亮、更容易阅读和维护。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值