编程核心能力之复用
「十问复用」
Q:复用的本质是什么?
A:分离变与不变,对不变的部分进行复用。
Q:复用的驱动力是什么?
A:对个人来说能偷懒,对组织来说能提高效率,对代码本身来说能简化表达。
Q:复用有好的隐喻吗?
A:我想到一个:减肥,增加有用的,减去没用的。
Q:复用就是指消除重复吗?
A:表面上是这样,可以进一步理解为代码的进化,为每一段可复用的代码找到自己的生态位。
Q:复用会遇到哪些困难?
A:去尝试复用易变的部分。
Q:复用做得不好的原因有哪些?
A:选了个大而难的部分,提高了复用难度。
Q:复用有哪些好的实践?
A:每次只选一个不变的点去复用,小步迭代。
Q:复用有速成方法的吗?
A:复用是个能力,需要靠练习才能掌握。
Q:那如何练习呢?
A:尝试每天做一个重构复用的提交。
Q:业务代码需要考虑复用吗?
A:需要,而且复用的部分才是业务领域的精华。
「复用的技术思维」
为什么把复用归为技术思维?
因为它和需求是弱相关的,我们日常工作生活中一般也用不到,也很难实现复用。
复用更多的是高维的,非线性扩展的,只有在软件世界里才能实现。
先看一个例子感受一下:
这个例子中要处理的数据是个整型数组,大部分语言中都为数组这类的常见容器实现了map,大家知道这个知识后,也比较容易去使用。
现在让事情稍微复杂一点,把数组单元变成复合类型。
你是否能坚持,或自然地使用map来思考和解决问题?
这里,功能的主体map并未改变,数据客体的变化,只导致一处修改,就是和map组合的扩展函数。
如果你能熟练做到这样思考,你的复用技术思维就开始升级了。
「复用和可编程」
上文说到复用最适合在软件世界中实现,但不是什么东西默认就满足可复用条件的。
很多时候需要做些改变,这些改变中有个很重要的就是可编程。
可编程怎么理解呢?
形象点的话,可以比作乐高积木,通过有限的形状,可以拼出无限的形状,每块积木的接口设计就能体现出可编程性。
如果觉得乐高的可编程性不够,想想我们人类的语言,这几乎是全能的了,可以满足我们任何需求的表达。
软件中的可编程则更多的体现在自动化上,每一处可通过编程来实现的自动化,都将为复用增加一个维度。
要做到这样的一个常用方法是区分要表达的是什么和如何做,即what和how。针对what来进行编程,以实现更高维的what。
软件里的技术栈也大体是这个思路,是我们可以学习的宝贵资源。
「复用的多维分析」
从解决的问题角度来说,复用并没有解决全部问题,但复用一定要解决主要问题。也就是主体对应的问题。剩余问题通过组合的方式去扩展实现。
从抽象的角度来说,复用的逻辑越通用,其所解决的问题越抽象,离具体的问题价值越远,依赖扩展来提供价值。
从问题粒度的角度来说,复用越通用,所聚焦的粒度越小,从而越稳定。
从扩展性角度来说,越通用的复用,需要的扩展越复杂。
以上,可以看出,复用有很强的正反馈,是值得去做的一件事。
回到具体的问题,问题的主体决定了复用可抽象的高度。
抽象度越高,所采用的复用组件越稳定。
越稳定的组件,当然也早就有人实现了。
所以,主体逻辑的组合是有套路的,一般很少需要我们再造轮子。
复用就是巨人的肩膀,『编程日课』要做的就是和大家一起爬上巨人的肩膀。
「复用的最高境界」
Eric在《Composing Software》书的结尾部分总结到:
代码应该简单,而不是过分简单化。
并引用了《The Elements of Style》中的一段话:
生动有力的文章要简明扼要。一个句子不应该包含不必要的单词,一个段落不应该包含不必要的句子,就像一幅画不应该包含不必要的线条,一台机器不应该包含不必要的零件一样。这并不要求作者把所有的句子都写得简短,或者避免所有的细节,只在提纲中描述主题,而是要求每个词都能说明问题。
复用度不够的代码会显得繁琐,虽然单个拿出来,容易理解,但一直简单的重复就太过简化了。
这会导致,当这种简单重复过多时,复杂度会呈线性,甚至超线性增长。最终导致维护成本激增。
从正面来说,代码变更时,要及时梳理,通过复用突出主体,去掉非必要的部分。像诗一样美,没有一个字是多余的。
版权声明: 本文为 InfoQ 作者【顿晓】的原创文章。
原文链接:【http://xie.infoq.cn/article/55bf1b78bcccc7fc113d6b880】。文章转载请联系作者。
评论