首先对于第8章的代码,正好写完了一个一模一样的实例。
其中使用了接口和抽象的方法。得到了一个易于修改和添加功能的表达式树的模型。代码上传VS2013;
现在总结一下:
1.首先,对于如果需要使用标志标记的方法实现,必须要严肃的考虑,是不是要利用类的继承来实现。比较两个方法:
如果是标记方法,那么就说明一定有共同点,可以提取共同点,如果是不同点不会影响接口设计,就可以不使用。
如果使用提取的方式,会导致很多不必要的类出现,而且是一次性的,就不用类时限。假象,如果你要实现一个类,但有一个标志,每一次添加一个类型,就需要改变原来的代码,如果是使用类的继承,那么你不需要跳转到那个判断引擎中来,可以直接添加到一个文件中,编译器会实现自动检测。这样的话添加功能不会出错,因为其他的代码完全不用变化,人们可以值专注自己添加的代码。更具miller定理,就可以得到更加快的效率和更加少的bug。这是最大的优点。
2.使用接口的方法,可以使得添加新的功能更加的容易,但是必须要考虑的是根据什么划分不同的类。
这个程序中使用的是节点的元数来获得的不同的继承。那么你添加一个元数相同的就必须要自己到判断引擎中添加代码。但是你可以 更加的利用性质,那么就是把标志符也作为继承因子来构建不同的类,但是这样的话会得到很多的不同的名字的类,要增加用户的记忆能力,折中才是王道。比如要添加一个Exp_muti , Exp_cheng . 。但是目前的这个使用了句柄,应该不会有问题。
添加复杂度,如果是改变接口的添加,就必须要对所有的派生类都变化。
如果是添加一个继承因子或者是同一阶段继承类,就是只要直接堆砌就好了。
两个复杂度都很小。
附件。Expression , 工程名FirstBlood.代码在这,点击打开链接