当前位置: 首页 > article >正文

设计心得——多态

一、设计上的多态

无论是在网上还是书籍上,还是自己的文章里都反复分析过多态的原理、应用和各种常见的情况。本篇重点从设计的角度来阐述一下多态,而不对多态的具体的用法进行说明。在前面的知识学习中可以知道,多态可以分为动多态和靜多态,有很多种实现的方式。而这种实现方式的不同,其实恰恰是给设计者提供了一种设计上的思路。

二、多态在设计上的展开

1、普通多态 (动多态 )
无论是在常见的学习中的多态的用法还是普通模板中的多态的用法,它们其实都是可以归为动多态这一类。动多态有虚表,有虚指针,需要迟后联编。它的应用上更灵活,也更容易为开发者理解。一般开发者接触到继承后,就可以对这种多态进行学习和应用了。
2、特殊多态(静多态 )
多态其实还有一些特殊情况,一个是通过模板或宏来模拟实现多态(注意区别普通多态中的模板中的多态应用)。另外一个就是前面提到CRTP的多态的应用。它们这一类基本上可以归到静多态这一类上。因为它不同于初学者学到的多态的情况,所以也称为特殊多态。这一类多态其实从严格意义上来讲只是实现了多态的效果。

掌握多态的实现和原理需要开发者自己认真的学习相关的技术,而设计者更多的考虑是如何将多态的场景更好的结合到技术实现中。举一个不太恰当的例子,开发者是要做千里马,而设计者是要做伯乐。

三、动多态和静多态在设计上的展开

开发者最初接触多态基本都是从动多态开始,即使用虚拟函数来处理父子类的不同的行为。但这种多态的缺点也因此暴露出来,即效率和延期绑定。而在某些情况下,设计者可能既需要多态行为又想避免上述的缺点,或者想在编译期确定一些行为,那么就可以使用静多态来实现。无非是牺牲了一点编译时间增加了一点复杂度而已。特别是本身就大量使用了宏或模板的项目来说,在需要使用静多态时,可能会更有优势。
这再次印证了经常提到的,没有最好的,只有最合适的。一个优秀的设计者,一定是根据项目的实际情况来确定应用哪项技术。而实际情况千差万别,同一个设计者,同一家公司,同一个需求,但不同样的开发团队,可能就有所不同。正如兵法说的“兵无常势,水无常形”。
动多态与静多态不是互斥的,它们是可以综合应用、共同在一个项目中解决问题的。但因为模板编程本身或宏编程本身就具有一定的复杂性和难度,所以很多初学者甚至中级开发人员应用起来都较为吃力,所以设计者一定考虑到这个问题。这也是为什么静多态不如动多态在实际的项目中看到的多的原因。
扬长避短不单纯是指扬某个技术的长和短,还指开发人员开发水平的长和短以及其它类似的长短,这是开发人员与设计人员考虑问题的不同所在。

四、多态体现的设计原则和方法

多态能在面向对象编程中三分天下有其一,是有原因的。它其实可以广泛的实践一些设计原则和方法:
1、开闭原则
对父类封闭,对子类开放。这样就可以更好的解决代码的扩展问题。
2、接口隔离原则
可以使用纯虚类实现接口,来达到更好的灵活性和扩展性。
3、代码重用
这个一看就明白,父类直接可以为子类可用,就看重用的程度有多大罢了。
4、设计模式的应用
在设计模式中,象抽象工厂模式等,都可以广泛的应用到多态的设计。

五、总结

勿在浮砂筑高台。只有掌握技术本身,才能更好的在设计上展开应用。换句话说,一个优秀的设计者本身必须是一个优秀的开发者。这也是前一段时间网上经常说的所谓“PPT架构师”的味道。知其然并知其所以然,顺势而为,才可能有一个优秀的设计出来。


http://www.kler.cn/a/587164.html

相关文章:

  • 【VUE】day03-vue过滤器、计算属性、vue-cli、vue组件
  • java 中判断对象是否可以被回收和 GCROOT
  • DataWhale学习--大语言模型--模型发展历程
  • go 加载yaml配置文件
  • 成为Python砖家(7): 使用miniforge管理Python版本
  • STM32 HAL库实战:高效整合DMA与ADC开发指南
  • Unity学习日志番外:简易行为树
  • 金融时间序列分析(Yahoo Finance API实战)
  • Java构造方法详解:从入门到实战
  • 特殊 IP 地址
  • Dijkstra算法
  • 二叉树的层序遍历(102)
  • 平板作为笔记本副屏使用spacedesk
  • Java入职篇(5)—— IDEA快捷键
  • 计算机毕业设计:基于Android和SNS的音乐星球软件
  • rv1106上libwebsockets的编译
  • 阿里百炼Spring AI Alibaba
  • PECL(Positive Emitter-Coupled Logic)电平详解
  • 【AI】内容生成式AI(AIGC)的深度分析与扩展
  • PCDN 与边缘计算的结合:未来内容分发的新趋势