一、设计上的多态
无论是在网上还是书籍上,还是自己的文章里都反复分析过多态的原理、应用和各种常见的情况。本篇重点从设计的角度来阐述一下多态,而不对多态的具体的用法进行说明。在前面的知识学习中可以知道,多态可以分为动多态和靜多态,有很多种实现的方式。而这种实现方式的不同,其实恰恰是给设计者提供了一种设计上的思路。
二、多态在设计上的展开
1、普通多态 (动多态 )
无论是在常见的学习中的多态的用法还是普通模板中的多态的用法,它们其实都是可以归为动多态这一类。动多态有虚表,有虚指针,需要迟后联编。它的应用上更灵活,也更容易为开发者理解。一般开发者接触到继承后,就可以对这种多态进行学习和应用了。
2、特殊多态(静多态 )
多态其实还有一些特殊情况,一个是通过模板或宏来模拟实现多态(注意区别普通多态中的模板中的多态应用)。另外一个就是前面提到CRTP的多态的应用。它们这一类基本上可以归到静多态这一类上。因为它不同于初学者学到的多态的情况,所以也称为特殊多态。这一类多态其实从严格意义上来讲只是实现了多态的效果。
掌握多态的实现和原理需要开发者自己认真的学习相关的技术,而设计者更多的考虑是如何将多态的场景更好的结合到技术实现中。举一个不太恰当的例子,开发者是要做千里马,而设计者是要做伯乐。
三、动多态和静多态在设计上的展开
开发者最初接触多态基本都是从动多态开始,即使用虚拟函数来处理父子类的不同的行为。但这种多态的缺点也因此暴露出来,即效率和延期绑定。而在某些情况下,设计者可能既需要多态行为又想避免上述的缺点,或者想在编译期确定一些行为,那么就可以使用静多态来实现。无非是牺牲了一点编译时间增加了一点复杂度而已。特别是本身就大量使用了宏或模板的项目来说,在需要使用静多态时,可能会更有优势。
这再次印证了经常提到的,没有最好的,只有最合适的。一个优秀的设计者,一定是根据项目的实际情况来确定应用哪项技术。而实际情况千差万别,同一个设计者,同一家公司,同一个需求,但不同样的开发团队,可能就有所不同。正如兵法说的“兵无常势,水无常形”。
动多态与静多态不是互斥的,它们是可以综合应用、共同在一个项目中解决问题的。但因为模板编程本身或宏编程本身就具有一定的复杂性和难度,所以很多初学者甚至中级开发人员应用起来都较为吃力,所以设计者一定考虑到这个问题。这也是为什么静多态不如动多态在实际的项目中看到的多的原因。
扬长避短不单纯是指扬某个技术的长和短,还指开发人员开发水平的长和短以及其它类似的长短,这是开发人员与设计人员考虑问题的不同所在。
四、多态体现的设计原则和方法
多态能在面向对象编程中三分天下有其一,是有原因的。它其实可以广泛的实践一些设计原则和方法:
1、开闭原则
对父类封闭,对子类开放。这样就可以更好的解决代码的扩展问题。
2、接口隔离原则
可以使用纯虚类实现接口,来达到更好的灵活性和扩展性。
3、代码重用
这个一看就明白,父类直接可以为子类可用,就看重用的程度有多大罢了。
4、设计模式的应用
在设计模式中,象抽象工厂模式等,都可以广泛的应用到多态的设计。
五、总结
勿在浮砂筑高台。只有掌握技术本身,才能更好的在设计上展开应用。换句话说,一个优秀的设计者本身必须是一个优秀的开发者。这也是前一段时间网上经常说的所谓“PPT架构师”的味道。知其然并知其所以然,顺势而为,才可能有一个优秀的设计出来。