2. 复用性
(上接)在软件开发过程中,其实很多要实现的功能都具有相同或者相似性。当你开发完一段代码后,你发现这段代码可以用到另一个程序中,这时复用就出现了。最简单的复用就是代码拷贝,将一段代码拷贝到另一个地方使用。代码拷贝应当是最低级别的复用,因为它可维护性差,当这段代码因为某种原因需要修改时,这种修改就变成了可怕的梦魇。将同样的代码在几十甚至上百处进行同样的修改。这样的修改也许我们大多数都遇到过,很烦,很累,也很讨厌,有人形容为“代码搬运”。如果写一个通用函数或者通用类让所有地方调用,问题就可以得到解决。这就是我们要考虑的代码复用性。
如果你在编写代码的时候考虑一下,这段代码是否可以被其它地方使用,或者考虑一下这个要编写的功能在其它地方是否编写过,随时有复用的意识,我们的编码水平就开始在提高了。在编写代码时,为了这段代码在其它地方使用,你可能就要想法编写得更加通用。在编写另一段代码时,突然发现某个功能已经在某段代码中实现过了,那么你可能就要考虑重构那段已经实现的代码,将通用的部分从那段代码中解藕出来(这就是前面提到的解藕的原因之一)。
比如,我在开发过程中发现了很多可以通用的功能,都把它们提出了写成了公用行数放到工具类或者写成公用类中,如获取当前期间、获取本位币、BigDecimal的四则运算、当前汇率的计算等。我要特别提到的是我开发条件查询的过程。
起初,我编写了一段某个报表的条件查询代码。很快,我发现这段代码可以在很多地方复用,因为几乎所有报表都需要条件查询。但是,编写一个通用的条件查询代码其实不太容易,因为不同的报表有不同的字段、不同的条件查询项以及不同的条件逻辑。还是像前面提到的分析方式,先总结出所有需求的共同点、不同点、扩展点,共同点保留,不同点提取出来做成扩展点,预见可能有那些扩展功能都罗列出来,最后重构了这段代码。现在,不管是什么报表,有什么字段或条件查询项,只要在条件查询页面添加了控件,并将控件的名称注册到我的条件查询类中,几乎不编写java代码就可以实现条件查询了(一些特殊判断逻辑的条件需要编写代码)。如果要增加新的条件查询项,只需要在条件查询页面中增加这个控件并且注册这个控件名,新增条件就完成了。
<plugin desp="查询" onEvent="filter" type="..plugin.CommonDynamicGridPlugin" attr="grid:grid;hasPage:true">
...
<plugin type="..plugin.CommonFilterPlugin">
<value name="join">and</value>
<value name="include">
AP_APVoucher.cVouTypeGUID;AP_APVoucher.cCurGUID;AP_APVoucher.cSupGUID;AP_APVoucher.cVouCodeLower;AP_APVoucher.cVouCodeUpper;AP_APVoucher.dVouDateLower;AP_APVoucher.dVouDateUpper;AP_APVoucher.iRedFlag;AP_APVoucher.iAuditStatus;iCheckStatus;GLVoucher;AP_APVoucher.iPayableAMT_FLower;AP_APVoucher.iPayableAMT_FUpper;AP_APVoucher.iPayableAMTLower;AP_APVoucher.iPayableAMTUpper
</value>
<value name="AP_APVoucher.cFlag">AP</value>
<plugin desp="生成“是否核销”过滤信息的plugin" type="..CheckStatusFilterPlugin"></plugin>
<plugin desp="生成“是否制证”过滤信息的plugin" type="..GLVoucherFilterPlugin"></plugin>
</plugin>
</plugin>
举这个例子我是想说明一个复用的过程。通常,一个复用的过程总是从具体到抽象的重构过程:起初都是一些具体的应用,然后从它们中间发现了共同的地方,进行抽象和提取,最后进行代码重构形成通用的东西。也许在你开发完成通用的代码之后,又发现了更加广阔的应用,又继续重构,不断升级。代码重构是需要一些功底的,需要理论进行支持,诸如设计模式等等。但在这里我强调的是意识,代码编写时的一种复用意识。有了这种意识,我们的代码才逐渐开始精妙起来。
分享到:
相关推荐
chromedriver-win64-136.0.7059.0.zip
python学习一些项目和资源
python学习资源
python学习资源
python学习教程
python学习教程
【毕业设计】java-springboot+vue会议管理系统实现源码(完整前后端+mysql+说明文档+LunW).zip
内有各个系统的版本全了
分数阶模型辨识,分数阶模型辨识
大数据基于python的电影天堂数据可视化(源码+配套文档) 系统功能: 登录 、首页 、电影数据管理 、我的信息 关键技术:Python、Django、Mysql、Hadoop、Scrapy、Vue、B/S 技术支持:已测试可正常运行,调试问题可联系客服有偿解决。 更多项目:3000+优质源码,支持【定制】、修改、部署、讲解和文档。
【毕业设计】java-springboot+vue疾病防控综合系统的设计与实现源码(完整前后端+mysql+说明文档+LunW).zip
【毕业设计】java-springboot-vue家具销售电商平台实现源码(完整前后端+mysql+说明文档+LunW).zip
134dfffffffffffffffffffffffffffffff
代码说明: 设置结束时间:通过new Date().getTime()获取当前时间戳,并加上10分钟的毫秒数(10 * 60 * 1000),得到倒计时的结束时间。 更新倒计时:updateCountdown函数计算当前时间与结束时间的差值,并将其转换为分钟和秒数。 显示倒计时:通过console.log输出剩余时间,格式为“剩余时间:X分Y秒”。 停止倒计时:当剩余时间小于或等于0时,清除定时器并输出“时间到!”。 定时器:使用setInterval每秒调用一次updateCountdown函数,实现倒计时的动态更新。 扩展说明: 应用场景:倒计时功能常用于限时抢购、考试计时、活动倒计时等场景。 优化建议:可以将倒计时显示在网页的某个元素中,而不是控制台。例如,使用document.getElementById获取DOM元素并更新其内容。 兼容性:该代码在现代浏览器中均可运行,如果需要兼容旧版浏览器,可以使用var代替const和let。 扩展功能:可以添加声音提示、动画效果等,提升用户体验。
该项目是一个大学生校园兼职平台。该平台使用Java语言开发后台业务逻辑,运用了SpringMVC+Spring+MyBatis框架进行搭建,前台使用jQuery、layUI框架,数据库服务器采用MySQL5.6+对数据进行持久化。其主要功能有:兼职招聘、论坛交流、在线聊天、个人中心、信箱留言、登录注册等功能。
图解AUTOSAR-CP-CommunicationStackTypes逻辑图打包
解释程序的逻辑和变量等等
python学习一些项目和资源
最近在基于大型语言模型(LLM)的多智能体系统(MAS)方面的发展展示了其在处理复杂决策任务方面的显著潜力。然而,现有的框架不可避免地依赖于串行执行范式,即智能体必须完成顺序的LLM规划后才能采取行动。这一基本限制严重影响了实时响应和适应能力,而在动态环境中这些能力至关重要。本文提出了一种新的并行化规划-行动框架,用于基于LLM的MAS,该框架具有可中断执行的双线程架构,支持并发规划和行动。具体而言,我们的框架包含两个核心线程:(1) 由集中式内存系统驱动的规划线程,保持环境状态同步和智能体通信以支持动态决策;以及 (2) 配备全面技能库的行动线程,通过递归分解实现自动化任务执行。在具有挑战性的《我的世界》实验中证明了所提框架的有效性。
基于layui和thinkphp6.0的快速后台开发框架。快速构建完善的管理后台,内置表单、表格的php生成,以及完善的RBAC权限管理