2005年2月19日星期六

《ASD》设计模式:NULL Object

CFoo * pcf = bar.GetFoo();
if ( !pcf && cf.Ready() )
{
pcf->Execute();
}
这是一段非常常见的代码。但是有人觉得!cf的写法不够优雅,就说可以用NULL Object模式来简化这种写法。

NULL Object模式大致说来,就是从当前的CFoo类中,派生一个CNullFoo类出来,这个类什么事情也不做。比如说他的Execute函数可能就是一个空函数。
然后,当bar.GetFoo()失败了,原本要返回一个NULL的时候,就返回这个CNullFoo类的实例。
于是,在调用端,就不用做!pcf的判断了,不管GetFoo结果如何,都可以一致的对待。

这个方法虽然看起来不错,但是好像没有省多少事,却还增加了一个类,是否有点不值呢?

对于像我这样的C++程序员来说,可能不会马上想起nested class,但是《ASD》一书,是使用Java来写例子程序的。
所以,这个CNullFoo类,其实是CFoo的一个Nested Class。这样,这个方案就可以接受了。
但是在C++中,我还是觉得这个模式是没有什么价值的。

顺道一提,我对Java的看法。
我热爱C++,所以对于Java多少会有点欠缺热情。不过我希望我下面说的话尽量公正。
一般说来,C++有两大缺点,一个是和C语言兼容,一个是复杂性。
就和C语言兼容而言,确实不爽。然而,这更多是编程习惯的问题。大家都知道,那一部分是C++中不太光彩的部分,那么不要去用它不就好了吗。(我要故作天真状了。)
而对于复杂性,我个人觉得,还可以接受。相反倒是Java不够复杂,就丧失了很多非常cool的特性,而变得不够灵活。在复杂和受限之间,我宁愿选择复杂。
但是Java有两个特性,使我非常艳羡的。
一个是语言的动态性(反射机制),另一个是nested class。都是目前的C++在语言一级上,很难实现,又非常有用的东西。不过,好像在C++/CLI中,这两个特性都会出现。
^_^ 这太让人期待了。

没有评论: