其实软件最初的设计是非常单纯的,按照业务流程一行一行往下写就行了。但是,随着业务流程越来越复杂,软件规模越来越大,考虑到软件的可维护性、易变更性等诸多因素,软件设计就变得不那么单纯了,而软件设计的功底就展现出来了。而在这些需要考虑的诸多因素中,代码的复用性是最考验程序员基本功的。
人们常说,有经验、能力比较强的程序员往往能写出优秀的代码。然而,依我以往的经验,情况并非如此。许多人开发过大量的程序,熟悉许多的软件架构,但要编写出优秀的代码却是完全不同的另一回事,它需要我们去掌握另一套软件设计理论,而这正是许多老程序员不屑一顾但又非常欠缺的知识。
扯得有些远了,我们言归正传。为什么说代码的复用性是最考验程序员基本功的呢?回想一下,我们在以往编写代码的过程中,有多少次在粘贴复制代码?不用说吧,一定是无数次。据说程序员操作最熟练的快捷键就是“ctrl+C”与“ctrl+V”。毫无疑问,我们编写的代码中有许许多多的功能是相似甚至完全相同的,关键在于你怎样去看待它。粘贴复制是最简单常用的方式,但在一个软件系统中,如果同一功能被粘贴复制了上百次,一旦这段代码需要变更时,那简直就是一种灾难。
这样的灾难,在我以往的软件开发中就发生过,令我深感其害。记得那是2005年,我参与维护一套老系统。该系统以往在各个省运行一切都正常,但此时要应用到直辖市却乱做了一团糟,因为直辖市和省不一样,单位上下级关系的判断必须做出修改。如果系统采用公用代码来判断上下级关系,问题会变得异常简单,但事实却不是这样。在这个老系统中,判断上下级关系的这段代码被粘贴复制了无数次,几乎贯穿了整个系统的所有类。剩下时间就是蚂蚁搬家式的代码搬运,在所有代码中去搜索、修改。同样的事情也发生在另一个项目,当客户对系统界面的某个地方不满意,而这个地方在系统的所有界面中都用到的时候。
同一段代码,当你拷贝第一次时也许还能容忍,但当你拷贝第二次时,你真的需要停下来仔细思考了,这是一种优秀的编程习惯。
有一次,我参与编写了一个供应链管理系统。起初,我为系统中的应付单编写了一段生成财务凭证的代码。随后,我又开始编写付款单生成财务凭证的代码。其实,应付单生成的财务凭证与付款单生成的财务凭证虽然有些许区别,但其实都是生成数条借方科目与贷方科目的分录(分录就是财务凭证的明细),分别拥有各自的科目、摘要、金额等等。再仔细分析,还有应收单、采购发票、各种核销单等等一系列单据,都需要生成财务凭证。接下来,我重构了之前仅仅为应付单编写的代码,将公用的部分写成独立的公用代码,而将不同的部分抽象为接口,并为各个单据编写了各自不同的实现。
在之后的开发中,这部分的需求发生了变更,要求能批量生成凭证,并提供三种方式的汇总,即所有单据生成一张汇总凭证、按单据类型分别生成汇总凭证,以及不汇总各自生成凭证。由于这里代码得到了合理的复用,实现这个功能变得异常简单——让公用代码实现汇总功能,让各个客户程序按照规则调用就可以了。经过这样的设计,系统向着可维护、易变更的良性方向发展。
但要写好代码复用并不容易。你也许可以在这里唾沫纷飞的说出一大堆理论,但真正到了实践中却可能面临诸多的难题。我经常编写软件开发平台,平台中的功能要提供给无数客户程序使用。我需要面临客户程序提出的许多变态需求,我既要满足这些新需求,又必须保证已有客户的正常使用,让它们感受不到我的变更。这常常让我花费数天的时间去思考,去分析,制订方案,最后才能动手去写代码。记住,在这时候草率的动手常常会给我们带来不可挽回的损失。关于代码复用的话题,还有经典的“不要重复自己原则(DRY)”,我会在后面慢慢与大家讨论。
最后,代码复用一个非常常见,大家应当注意的问题就是分包的问题。想象一个这样的场景,当我在进销存模块编写了一段不错的公用程序而财务核算模块需要使用它时,就产生了财务核算模块对进销存模块的引用。假如财务核算模块也有一段代码进销存模块需要使用呢?如此往复,模块与模块之间相互引用,形成了一张无形的网,剪不清,理还乱。遇到这种情况,正确的办法应当是对原有代码进行重新规划,把公用代码划分到基础模块中。如上例,当进销存模块的代码需要在财务核算模块使用时,这段代码就不应再存在于进销存模块了,而是应当提升到公用代码模块,最后做到包引用仅仅是一种树形结构——上层模块只能引用下层模块,而不能引用平级模块。
一次软件编程技术的探讨之旅
重新理解一切皆对象
重新审视代码复用
(续)
分享到:
相关推荐
钢铁行业周报:重新审视未来需求.pdf
6. 召回/粗排模型的重新审视:文章提出了从对比学习的角度来重新审视推荐系统中的召回和粗排模型,这可能意味着作者将提出一些创新的理论和方法来改进现有的推荐技术。 通过这些知识点,我们可以构建一篇详细的...
《钢铁行业周报:重新审视未来需求》 在当今全球化经济背景下,钢铁行业作为基础工业的重要组成部分,其发展状况直接影响到国家经济的稳定与繁荣。这份周报旨在深入探讨钢铁行业的未来需求趋势,以帮助业界人士更好...
通信行业研究周报:重新审视700M 5G引入后的建设需求.pdf
在当今快速发展的信息技术领域,软件复用已经成为提升软件开发效率、降低成本的关键方法之一。软件复用是指在多个软件项目中重复使用现有的软件资产(如代码片段、设计文档、测试案例等)。然而,要想有效地实施软件...
本文将深入探讨这一时期中国粮食安全面临的新常态问题,并对传统的粮食安全观进行重新审视。 首先,我们必须认识到,粮食增产虽是中国农业发展的重要成就,但伴随着的是产量、进口量、库存量同步增长的现象,导致了...
稀土行业深度研究报告:国之重器_重新审视稀缺的中国稀土战略资源-20200421-中信证券-40页精品报告.pdf
我们介绍了在复杂相互作用模型内大型强子对撞机能量上charm的生产结果。 形式主义既包括J /ψ的合并分解,也包括通过重组可能产生的第二J /ψ产生。 在不涉及自由参数的情况下进行了这种效果的估计。...
精品资料(2021-2022年收藏)
本文探讨了自动性和流利性的概念,这两者如何影响熟练阅读的发展。 这篇文章回顾了以下方面的研究:a)儿童使用的阅读策略,b)重复阅读教学策略以提高流利程度。 案例方案说明了主要发现。 根据研究和案例,得出四...
与以往的依靠标准面板估计量的面板研究相反,它使用一种估计方法来控制参数异质性和横截面依赖性在国家之间。 发现汇款流入减少了对私营部门的国内信贷,但从长远来看,它们有助于增加货币供应。 国家一级的结果表明...
行业研究报告、行业调查报告、研报
从公共财政制度到现代财政制度:现实审视与路径构思.docx
设计模式并不是具体的代码或库,而是一种通用解决方案的描述,适用于面向对象编程中遇到的各种复杂设计问题。这些模式经过时间的考验,已被证明是有效的,并且在不同的项目和团队之间可以重复使用,从而提高代码的...
- **高屋建瓴的观点**:除了具体的技术细节外,《代码大全》还分享了一些高层次的设计理念和思考方式,鼓励开发者从更高角度审视软件开发过程,从而达到更高的技术水平。 - **通用的概念**:书中介绍了一系列普遍...
20210616-东北证券-首批双创50ETF获批点评:如何审视科创板当下的投资价值.pdf