写点什么

编程核心能力之复用

用户头像
顿晓
关注
发布于: 2020 年 07 月 17 日
编程核心能力之复用

「十问复用」



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》中的一段话:



生动有力的文章要简明扼要。一个句子不应该包含不必要的单词,一个段落不应该包含不必要的句子,就像一幅画不应该包含不必要的线条,一台机器不应该包含不必要的零件一样。这并不要求作者把所有的句子都写得简短,或者避免所有的细节,只在提纲中描述主题,而是要求每个词都能说明问题。



复用度不够的代码会显得繁琐,虽然单个拿出来,容易理解,但一直简单的重复就太过简化了。



这会导致,当这种简单重复过多时,复杂度会呈线性,甚至超线性增长。最终导致维护成本激增。



从正面来说,代码变更时,要及时梳理,通过复用突出主体,去掉非必要的部分。像诗一样美,没有一个字是多余的。

编程日课 - 和你一起渡过深水区。



发布于: 2020 年 07 月 17 日阅读数: 59
用户头像

顿晓

关注

因观黑白愕然悟,顿晓三百六十路。 2017.10.17 加入

视频号「编程日课」 一个不爱编程的程序员, 一个用软件来解决问题的工程师, 一个有匠心的手艺人。

评论

发布
暂无评论
编程核心能力之复用