Refecing Improving the Design of Existing Code reading comments(一)

本文探讨了重构的概念、目的及其在软件开发中的重要性。介绍了重构的原则、时机选择以及如何克服实施过程中的挑战,包括数据库、接口等问题。
        1、什么是重构

          Margin Flower给了两个重构的定义:

            (1):对软件内部结构的一种调整,目的是在不改变软件可观察行为的前提下,提高其可理解性,降低其修改成本。从这条定义可以看出要进行重构的意义,不是为了添加新的功能,也不是为了提高软件的性能,重构的意义在于提高代码的可读性及可维护及升级性。

            (2):使用一系列重构手法,在不改变软件的可观察的前提下,调整其结构。同上一条相同,强调了不改变软件的可观察性,调整的是程序的整体的结构,貌似这一说法更偏重于程序的架构,但是程序的架构与程序的可读、可维护及可升级有着密切的关系。

          2、为何重构

          重构的定义已经回答了这个问题,重构的目的就是提高程序的可读、可维护及可升级特性。但是作者有给出了更详细的解释。

          重构可以改进软件的设计,很多程序员在完全理解程序架构之前,为了短期的目的会对现有代码进行修改,如给某个类添加接口,或者暴露已经隐藏的接口,甚至直接引用已经隐藏的数据。这会导致程序的架构逐渐的腐败变质。通过重构可以是这些腐败变质的代码恢复到自己本应所在的架构位置。

         重构使软件共容易理解,程序设计的目的是与计算机交互,但是用于与计算机交互的代码,却需要与别的程序员进行交互,因此代码的可读性,是关系到项目成败的关键。

但是很多程序员在编写代码的时候并没有考虑到与其交互,或者后期对这段代码进行维护的程序员。有些代码到了后期就连编著者本人都无法理解,就像网上那些经典的代码注释一样。我就曾经经历过这种情况,不要再提那时候的心情了。对这些代码进行重构是必须的,当然在编写代码的时候也要注意,尽量避免这种情况的发生。当然很多时候由于工期等情况的原因,这种事情时刻都在进行着,为了终结这种纠结的心情,进行重构吧。

         重构帮助找到bug,很多人由于惯性思维,对自己写的东西基本失去了评判的能力。在进行重构的时候换一种更清晰的思路,对代码进行调整梳理,之前很多惯性思维不能发现的bug,在此时就会现身。

      提高编程速度,我也很纠结,感觉重构确实会降低编程速度,因为要浪费编码的时间去进行重构。但是从全局及长期来看,成熟的重构手法却真的能够提高编程速度。试想一下面对一个腐败的架构,一堆堆不知所谓的代码,后期怎么进行维护、扩展以及升级。可能还没到维护、扩展、升级的时候,代码已经遭到了废弃。

        3、何时重构

        这是一个很重要的问题,不记得是谁说过,项目过早的时候进行重构,我猜想是因为项目此时还没有暴露过的的错误与腐败出来。但是什么时候才是重构的最好时机呢。作者给了一个“三次法则”:添加功能时重构、修补错误时重构、审核代码时重构。其实重构原则也是构建原则,在构建的时候也要注意这些事项(个人愚见)。

        4、怎么让项目经理同意重构计划

        这个问题很严重,并且不同的项目有不同的情况。发挥个人聪明才智把。

        5、重构的难题

        代码重构会面临很多难题,作者提了4个:数据库、接口、难以通过重构手法完成的设计改动及何时不进行重构。

        数据库:大多数的商用程序都有一个背后紧耦合的数据库,这就是数据库结构难以修改的原因之一。还有一个原因就是数据迁移。在非面向对象的数据库中,在对象模型和数据库模型之间掺入一个分隔层可以解决这个问题。这个分隔层无需在一开始就加入,在发现对象模型变得不稳定时在引入即可。

       接口:对于尚未发布的接口,只需要修改所有的调用者就可以了,虽然可能是各个庞大的任务,但是仔细认真,还是可以完成的。对于已经发布到接口,就需要保留原接口,并引入新的接口,让原接口调用新接口。

       难以通过重构手法完成的设计改动:如有些架构设计错误,很难通过重构进行改动,这一点还没有理解。有待进一步挖掘。

       何时不该重构:记得看设计模式的时候,经典的一句话就是,如果没有理解当前的设计模式,就乱套设计模式,还不如不用。重构应该也是这个道理。重写而不是重构:现有代码根本无法运行。代码中满是错误。重构的前提是程序稳定运行,因此此时不应重构而应该重写。如果程序到了最后的期限也尽量不要重构。

        6、重构与设计的关系

         重构与设计互补,如前所言重构可以将导致架构腐败的代码引领回他本该所在的位置。Alistair Cockburn说过:“有了设计,我可以思考的更快,但是其中充满了小的漏洞”。重构则可以填补这些小的漏洞。虽然重构在某些情况下能够取代设计,但是我认为必要的设计是不可或缺的。

        7、重构与性能的关系

        短期看,重构可能会让软件变慢,但是他使优化阶段的软件性能调整更容易,最终会取得好的效果。

        8、重构起源何处

        这个不太关心,没有仔细看。

内容概要:本文是篇关于使用RandLANet模型对SensatUrban数据集进行点云语义分割的实战教程,系统介绍了从环境搭建、数据准备、模型训练与测试到精度评估的完整流程。文章详细说明了在Ubuntu系统下配置TensorFlow 2.2、CUDA及cuDNN等深度学习环境的方法,并指导用户下载和预处理SensatUrban数据集。随后,逐步讲解RandLANet代码的获取与运行方式,包括训练、测试命令的执行与参数含义,以及如何监控训练过程中的关键指标。最后,教程涵盖测试结果分析、向官方平台提交结果、解读评估报告及可视化效果等内容,并针对常见问题提供解决方案。; 适合人群:具备定深度学习基础,熟悉Python编程和深度学习框架,从事计算机视觉或三维点云相关研究的学生、研究人员及工程师;适合希望动手实践点云语义分割项目的初学者与进阶者。; 使用场景及目标:①掌握RandLANet网络结构及其在点云语义分割任务中的应用;②学会完整部署个点云分割项目,包括数据处理、模型训练、测试与性能评估;③为参与相关竞赛或科研项目提供技术支撑。; 阅读建议:建议读者结合提供的代码链接和密码访问完整资料,在本地或云端环境中边操作边学习,重点关注数据格式要求与训练参数设置,遇到问题时参考“常见问题与解决技巧”部分及时排查。
内容概要:本文详细介绍了三相异步电机SVPWM-DTC(空间矢量脉宽调制-直接转矩控制)的Simulink仿真实现方法,结合DTC响应快与SVPWM谐波小的优点,构建高性能电机控制系统。文章系统阐述了控制原理,包括定子磁链观测、转矩与磁链误差滞环比较、扇区判断及电压矢量选择,并通过SVPWM技术生成固定频率PWM信号,提升系统稳态性能。同时提供了完整的Simulink建模流程,涵盖电机本体、磁链观测器、误差比较、矢量选择、SVPWM调制、逆变器驱动等模块的搭建与参数设置,给出了仿真调试要点与预期结果,如电流正弦性、转矩响应快、磁链轨迹趋圆等,并提出了模型优化与扩展方向,如改进观测器、自适应滞环、弱磁控制和转速闭环等。; 适合人群:电气工程、自动化及相关专业本科生、研究生,从事电机控制算法开发的工程师,具备定MATLAB/Simulink和电机控制理论基础的技术人员。; 使用场景及目标:①掌握SVPWM-DTC控制策略的核心原理与实现方式;②在Simulink中独立完成三相异步电机高性能控制系统的建模与仿真;③通过仿真验证控制算法有效性,为实际工程应用提供设计依据。; 阅读建议:学习过程中应结合文中提供的电机参数和模块配置逐步搭建模型,重点关注磁链观测、矢量选择表和SVPWM调制的实现细节,仿真时注意滞环宽度与开关频率的调试,建议配合MATLAB官方工具箱文档进行参数校准与结果分析。
已经博主授权,源码转载自 https://pan.quark.cn/s/bf1e0d5b9490 本文重点阐述了Vue2.0多Tab切换组件的封装实践,详细说明了通过封装Tab切换组件达成多Tab切换功能,从而满足日常应用需求。 知识点1:Vue2.0多Tab切换组件的封装* 借助封装Tab切换组件,达成多Tab切换功能* 支持tab切换、tab定位、tab自动化仿React多Tab实现知识点2:TabItems组件的应用* 在index.vue文件中应用TabItems组件,借助name属性设定tab的标题* 通过:isContTab属性来设定tab的内容* 能够采用子组件作为tab的内容知识点3:TabItems组件的样式* 借助index.less文件来设定TabItems组件的样式* 设定tab的标题样式、背景色彩、边框样式等* 使用animation达成tab的切换动画知识点4:Vue2.0多Tab切换组件的构建* 借助运用Vue2.0框架,达成多Tab切换组件的封装* 使用Vue2.0的组件化理念,达成TabItems组件的封装* 通过运用Vue2.0的指令和绑定机制,达成tab的切换功能知识点5:Vue2.0多Tab切换组件的优势* 达成多Tab切换功能,满足日常应用需求* 支持tab切换、tab定位、tab自动化仿React多Tab实现* 能够满足多样的业务需求,具备良好的扩展性知识点6:Vue2.0多Tab切换组件的应用场景* 能够应用于多样的业务场景,例如:管理系统、电商平台、社交媒体等* 能够满足不同的业务需求,例如:多Tab切换、数据展示、交互式操作等* 能够与其它Vue2.0组件结合运用,达成复杂的业务逻辑Vue2.0多Tab切换组件的封装实例提供了...
代码下载地址: https://pan.quark.cn/s/41cd695ddf65 `htmldiff` 是个以 Ruby 语言为基础构建的库,其主要功能是在 HTML 文档中展示文本之间的差异。 该库的个显著特点在于它不仅能够识别出不同之处,还会借助 HTML 标签来呈现这些差异,从而让用户能够直观地观察到文本的变化情况。 这种特性使得 `htmldiff` 在版本控制、文档对比或任何需要展示文本变动场景的应用中显得尤为有用。 `htmldiff` 的核心作用是对比两个字符串,并生成个 HTML 输出结果,这个结果会明确地指出哪些部分被添加、哪些部分被删除以及哪些部分被修改。 此外,通过运用 CSS,用户可以进步调整差异展示的样式,使其与项目或网站的现有设计风格相协调。 在使用 `htmldiff` 之前,需要先完成该库的安装。 如果项目已经配置了 Ruby 环境和 Gemfile,可以在 Gemfile 文件中添加 `gem htmldiff` 语句,随后执行 `bundle install` 命令进行安装。 如果没有 Gemfile 文件,也可以直接采用 `gem install htmldiff` 命令来进行全局安装。 在编程实现时,可以通过调用 `Htmldiff.diff` 方法来对比两个字符串,并获取相应的 HTML 输出。 例如:```rubyrequire htmldiffstr1 = "这是个示例文本。 "str2 = "这是个示例文本,现在有更多内容。 "diff_html = Htmldiff.diff(str1, str2)puts diff_html```上述代码将会输出两个字符串之间的差异,其中新增的内容会被 `<ins>` 标签所包围,而...
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值