我眼中的软件复用

刚进公司的时候,经常听到老同事的告诫:DRY(Don't Repeat Yourself),著名的四人帮(GOF)大作《设计模式》的小标题是“Elements Of Reusable Object-Oriented Software”-可复用面向对象软件的基础。可复用可谓程序员写代码的一致追求。那么可以从哪些角度去思考代码复用呢?

[b]变量级别的复用:[/b]
这主要涉及的是常量的复用,字符串抽取常量的重构技巧大部分程序员都会使用,但是很多同志往往会忽略多个类之间的常量重复,比方说,某个产品的类别,这在整个系统中都是统一的,这种情况下,使用一个Enum来表示这个类别,或者使用一个统一的常量类来管理所有的常量字符串或许是一个更好的选择。

[b]方法级别的复用:[/b]
方法复用的前提是方法要小,功能要单一;你很难复用一个上100行的方法,因为每个方法总有自己独特的一部分逻辑,也很难从两个大方法中看出其中重复的逻辑。因此,抽取方法,把每个方法的功能做到足够单一,然后,你自然就能发现其中重复的代码,然后,删除重复代码,一了百了。另外,把方法变小,功能变单一之后, 你还会发现很多代码不应该属于当前类,这会帮助我们改善对象设计,从而发现多个类中的重复方法,进一步的去除重复。

[b]类级别复用:[/b]
类复用主要就是2个手段:继承和组合,优先使用组合。通过对方法级别复用的追求可以一步步驱动出类级别的复用。在多个类中,通过Extract Method和Move Method的重构技巧,可以把一些方法聚合到一个类中,然后通过组合的方式共享给所有需要这些方法的类。另外,在类继承结构中,使用pull members up的重构技巧,把子类函数推上父类,在各子类中共享也是经常使用的手段。

[b]库级别的复用:[/b]
即把自己开发的代码变成第三方库,这种类型的复用主要需要考虑是如何让别人更方便的使用自己的类库?在Java的世界中,第三方依赖库管理无疑是Maven的天下,因此把自己的类库打包放到Maven中央库是实现库复用的基本手段。我之前写过一篇如何使用Gradle把自己开发的类库部署到Maven中央库中(http://ningandjiao.iteye.com/blog/1846441), 在Ruby的世界,当然是Gem包了,node.js的世界就是npm,而Object-C的世界就是类库,总之,类库级别的复用已与代码无关,重要的是了解业界当前的生态系统,然后让自己的类库能够非常方便的被别人集成,另外,有点说明文档总是好的,帮助别人更容易的理解和使用你的类库。

[b]软件级别的复用:[/b]
这个就是所谓的SaaS(Software as a Service)了,把自己的开发的功能以API的形式暴露给别人使用, 在公司内部,各个功能模块以这样的方式相互协作,最后整个公司的架构就是所谓的SOA(Service Oriented Architecture)了。做这个级别的复用其实就是API文档要详细,易懂,便于别人使用,同时最好API说明文档是可执行的,即别人可以直接在说明文档上验证自己对说明文档的理解,对于以REST形式开放的API接口,建议看看Swagger-UI(https://github.com/wordnik/swagger-ui), 至于其它形式的API接口,抱歉,我还没涉猎到。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值