(给CPP开发者加星标,提升C/C++技能)
来源:神技圈子https://blog.csdn.net/songguangfan/article/details/110929508
前言
编程范式有多种,主要有结构化的程序设计思想、对于对象的程序设计思想、面向对象的程序设计思想、基于接口的程序设计思想。那么这些范式各是什么意思呢?别着急,我们通过一个加法器的例子来逐一说明。
结构化程序的设计
我们来实现一个加法器,在这个加法器中已经保存了被加数,现在需要传递加数到加法器。如果你是一个C语言开发,第一反应多半是,这个很简单啊,用一个结构体来保存被加数,然后再外带一个加法函数就行了啊
代码中,结构体Augend保存了加法器的被加数,具体而言,就是由iAugend保存,第9至12行给出了加法函数的定义。该函数接收两个参数,一是Augend结构体的指针,二是加数iAddend。
但这个时候老板来了,他对你说,这个加法器要修改一下,现在需要给被加数添加一个权重值,而且以前的加法器要保留,因为还有一部分代码要保留它。没办法,拿人家的手短,吃人家的嘴软,继续当“码农”吧。既然有一部分代码要用到老的加法器,那么老的加法器我们还是保留的,这样一来,就可以按照新的思路来开发新的加法器了,具体的方法如下可以看到代码思路同上一个代码是完全一致的,不同的只是结构体和函数名称。很显然,WeightAugend保存了被加数和权重,而WeightAdd则是带权重的加法函数。好了,现在我们分析一下按照结构化程序设计思想实现的加法器有什么缺陷?学过面向对象的肯定会一口就能说出来,数据和操作这个数据的函数或方法没有封装在一起。确切一点就是,这个加法器没有把被加数、权重以及操作它们的加法运算封装在一起。另外一个缺陷是什么呢?因为引入带权重的加法器之后,需要对部分老代码进行修改,显然没有做到代码封闭,即没有实现这一变化点的封装。
基于对象的程序设计
在对象的世界,任何东西都可以被当成对象。那么按照这个说法,我们需要实现的这个加法器,显然也是个对象了。用过C++的同学第一反应肯定就是编写一个加法器的类,用一个数据成员保存被加数,然后再写一个public的加法方法就好了。一般就写成如下这样