设计心得——代码复用

一、代码复用

代码复用也可以叫做代码重用,它在设计中是一个非常重要的问题。什么是代码复用?很简单,就是写出来的代码别人可以基本不经过修改就可以拿来应用到其它场景中。这是不是普大喜奔的事情?那肯定是啊。但只要稍微动一下大脑就知道,越向底层支持走,重用代码的机会越多?反之,则越少。或者这样理解,与具体的业务耦合在一起的代码复用的可能性很小,反之越是抽象的代码,复用的可能性越大。
代码重用,极大的减少了重复开发某个功能的劳动,自然提高了效率。同时,已经被应用过的代码,基本上Bug已经被解决的差不多了,那么其安全性和稳定性自然也更高一筹。如果不同的场景都复用了一块代码,那么维护人员的成本也会降低,可维护性也会大提高。

二、复用的两种情况

代码的利用可以从两个维度进行分析,一个是整体的维度,即整体上的复用,即完全使用别人的代码,可能会有一些配置不同,但不需要对或极少对代码进行改动;第二是从开发即代码编写维度对模块、类或函数等的复用。
1、库、框架或者完全代码级别的复用
这种非常容易理解,在实际开发中,开发者可能用到的第三方的库、软件以及相关的框架等都可以算为复用别人的代码。特别是针对开源的框架,就更容易理解了,因为开发者可以把它的源码增加到自己的工程中并进行编译。
这种重用,要学习并理解其提供的接口或服务的应用方式;当然,如果深入学习后还可以小改一下,更好的适应开发者自己的环境而不必非使用统一的接口。这种现象在互联网的企业中非常多,在某些开源的框架上封装一层,然后实现自己的新功能。
当然,这也包含自己公司提供的一些动态库之类的库,比如大家可能都使用过一些公司自己的加密解密库,这也可以划到这一类代码复用中。
2、代码级别的复用
代码级别的利用,其实更强调的一种编程设计能力,即开发的代码,可以在内部通过函数重载、继承或者干脆使用模板编程来实现。这样别人可以直接拿过来使用或经过简单修改达到自己的目的。

三、实现的方法

这里不讨论第一种代码复用的实现方法,那种基本和开发一个软件没区别。主要分析一下第二种,即代码级别如何复用:
1、利用函数的重载
使用函数的重载可以轻松的实现一些区别不大的功能,既保持了接口的稳定性又能使得接口简单明了。特别是和默认参数配合用的话,在某些情况下可能解决不少问题。但不要过分依赖重载,太多的重载反而会造成应用方的迷惑。
2、利用继承
继承基本和函数重载类似,相同功能的方法可以抽象到父类中,子类不用再次编写;而针对一些细节上的不同,可以通过多态来实现。继承的缺点就不用多言了,往往是在性能和维护上有一定的降低和复杂性。

3、使用泛型(模板)编程
使用泛型编程的优势和劣势都非常明显,就要看开发者的自身水平和应用场景了。泛型编程更容易让代码被重用,但难度也更高。特别是和函数重载相比,可能一个函数就解决了不少的问题。正如刚刚所言,泛型编程的最大劣势就是难,不光难于开发也难于调试,更难于后期的维护(相对而言啊)。

4、使用设计模式
使用设计模式的优势在前面其实分析过,可以在某些场景下大幅的提高代码的重用。特别是在工厂模式这种创建对象形式类型里,对象的创建简单就是完美的重用。其它的这种类型的设计模式如建造者模式等都是如此。当然不是说其它的形式的设计模式不可以,只是不如这一大类更清晰。象职责链模式和命令模式其实都可以很好的重用相关的代码。使用这种模式的缺点就是场景限制比较大,不能乱用。

5、使用反射或类似的技术
使用反射技术或类似如宏等的代码生成技术,几乎就是天生的给代码重用的。只是传递的参数不同即可生成不同的结果。这种方式的缺点更容易理解,一个是C++这种语言不支持反射(后期的新标准可能支持),另外一个即使使用反射和宏这类代码生成复用,维护的难度也相对高很多。

四、实际应用

1、要有良好的思想
编程思想始终是指导开发的第一要务,没有一个正确的思想指导,只能是头疼医头,脚疼医脚
2、提供良好的接口设计
无论使用库级别复用还是代码级别的复用,一个最重要的交互点就是接口。接口设计至关重要,既要支持扩展,又必须关闭改动。既要灵活(解耦)控制数据交互,又要简单方便。这里面其实大家也看到了一些设计原则的应用,那么其实际的实现方法也可以应用过来,如依赖注入(控制反转)。
3、合理的分层和模块划分
这其实就考验开发者从底层开始的封装和抽象能力。然后在此基础上,对不同的抽象形成不同的群,在此基础上进行层和模块的划分。
4、应用设计原则
从最基础的代码重用来看,如果一段代码简单的可以完全直接使用,那么就最简单了。这在设计原则中本身就有体现,即单一职责,比如就完成一个读写XML配置文件的功能,这种极容易被复用。而实际情况被复用的也多是这种情况,比如串口操作、网口操作、图像读取显示等等。

五、总结

代码复用除了从设计角度看,其实也可以从重构的角度来看。重构的一个重要目的就是减少冗余代码,那么做好代码复用当然冗余就会大幅降低。所以说,一件事,如果从不同的维度和不同的应用方向来看,就会有不同的效果。这就又回到文中的“编程思想” 了,思想是什么?其实就是现实抽象的结果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值