海安零距离 海安论坛 海安新闻 海安

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1929|回复: 0

软件设计的哲学:第十六章 修改现有代码

[复制链接]

6234

主题

6234

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
18716
发表于 2019-12-27 15:30 | 显示全部楼层 |阅读模式
目录
            
    第1章形貌了软件开辟是怎样迭代和增量的。大型软件体系的开辟履历了一系列的演化阶段,每个阶段都添加了新的功能并修改了现有的模块。这意味着体系的筹划是不绝发展的。不大概在一开始就构思出一个体系的正确筹划;一个成熟体系的筹划更多地取决于体系发展过程中的变革,而不是最初的概念。前几章形貌了怎样在初始筹划和实现过程中挤出复杂性;本章讨论了怎样防止复杂性随着体系的发展而增长。
16.1 保持战略

第3章先容了战术编程和战略编程的区别:在战术编程中,紧张目标是让某些东西快速工作,纵然这会导致额外的复杂性;在战略规划中,最紧张的目标是产生一个巨大的体系筹划。战术方法很快就会导致杂乱的体系筹划。假如你想要一个易于维护和增强的体系,那么“工作”并不是一个富足高的尺度;你必须优先思量筹划并有战略地思索。这种头脑也实用于修改现有代码时。
不幸的是,当开辟人员深入到现有的代码中举行诸如bug修复或新特性之类的更改时,他们通常不会举行战略性思索。一个范例的心态是“我能做的最小的改变是什么来满意我的必要?”“偶然间开辟人员这么做是因为他们不喜欢修改代码;他们担心更大的变革会带来更大的引入新bug的风险。然而,这导致了战术规划。这些最小的更改中的每一个都引入了一些特殊的情况、依靠项或其他情势的复杂性。效果,体系筹划变得更糟了,问题在体系演进的每一步中不绝累积。
假如您想要维护一个干净的体系筹划,您必须在修改现有代码时接纳战略方法。 抱负情况下,当您完成了每个更改时,体系将具有假如您从一开始就在头脑中举行筹划时所具有的布局。为了实现这个目标,您必须抵抗快速修复的诱惑。相反,思量当前的体系筹划是否仍旧是最好的,根据必要的更改。假如没有,重构体系,以得到最好的筹划。通过这种方法,体系筹划可以随着每一次修改而改进。
这也是第15页先容的投资头脑模式的一个例子:假如您投入一点额外的时间来重构和改进体系筹划,您将得到一个更简便的体系。这将加快开辟速率,而且您将收回您在重构中投入的精神。纵然您的特定更改不必要重构,您也应该在代码中探求可以修复的筹划缺陷。无论何时修改任何代码,都要想法改进体系筹划,至少在这个过程中改进一点。假如您没有使筹划变得更好,那么您大概使它变得更糟。
正如在第3章中所讨论的,投资心态偶然与商业软件开辟的实际相辩论。假如以“正确的方式”重构体系必要3个月的时间,而快速而糟糕的修复只必要2个小时,那么您大概不得不接纳快速而糟糕的方法,特殊是在您的工作时间紧急的情况下。大概,假如重构体系会造成不兼容,从而影响许多其他人员和团队,那么重构大概是不实际的。
尽管如此,您应该尽大概地抵抗这些妥协。问问你本身:“思量到我目前的限定,这是我所能做的最好的创建一个干净的体系筹划吗?”大概有一种方法可以像3个月的重构那样简便,但可以在几天内完成?大概,假如你现在无法负担大规模重构的费用,让你的老板给你分配时间,让你在当前的末了限期之后再做重构。每个开辟构造都应该筹划将其全部工作的一小部分用于整理和重构,这项工作从久远来看是值得的。
16.2 维护注释:将注开释在代码附近

当您更改现有代码时,很大概会使某些现有注释失效。修改代码时很容易忘记更新注释,这将导致注释不再正确。不正确的注释会让读者感到沮丧,假如注释太多,读者就会开始猜疑全部的注释。荣幸的是,只要有一点规则和一些引导原则,就可以在不付出巨大努力的情况下更新注释。本节和以下各节提出了一些具体的技能。
确保注释得到更新的最佳方法是将它们放置在它们所形貌的代码附近,以便开辟人员在更改代码时可以或许看到它们。 注释离干系代码越远,正确更新它的大概性就越小。比方,方法接口注释的最佳位置是在代码文件中,就在方法体旁边。对方法的任何更改都将涉及这段代码,因此开辟人员大概会看到接口注释并在必要时更新它们。
对于像C和c++如许具有独立代码和头文件的语言,另一种替代方法是将接口注开释在.h文件中方法声明的旁边。然而,这是一个很长的路从代码;开辟人员在修改方法主体时不会看到这些注释,而且必要额外的工作来打开差异的文件并找到接口注释来更新它们。有些人大概以为接口注释应该放在头文件中,如许用户就可以学习怎样使用抽象,而不必检察代码文件。但是,用户不必要读代替码或头文件;他们应该从Doxygen或Javadoc等工具编译的文档中获取信息。别的,许多ide将提取并向用户表现文档,比方在键入方法名称时表现方法的文档。对于如许的工具,文档应该放在对开辟人员编写代码最方便的地方。
在编写实现注释时,不要将整个方法的全部注开释在方法的顶部。将它们睁开,将每个注释下推到最窄的范围,包括注释所引用的全部代码。比方,假如一个方法有三个紧张的阶段,不要在方法的顶部写一个注释来具体形貌全部的阶段。相反,为每个阶段编写一个单独的注释,并将该注释置于该阶段的第一行代码之上。另一方面,在一个方法的实现顶部有一个形貌团体战略的注释也是有帮助的,就像如许:
  1. //  We proceed in three phases://  Phase 1: Find feasible candidates//  Phase 2: Assign each candidate a score//  Phase 3: Choose the best, and remove it
复制代码
16.3 注释属于代码,而不是提交日志

在修改代码时,一个常见的错误是在源代码存储库的提交消息中放入关于更改的具体信息,而不是在代码中记录它。尽管将来可以通过扫描存储库日志来欣赏提交消息,但是必要这些信息的开辟人员不太大概想到要扫描存储库日志。纵然他们确实扫描日志,查找正确的日志消息也会很繁琐。
在编写提交消息时,问问本身将来开辟人员是否必要使用这些信息。假如是,那么在代码中记录这些信息。提交消息就是一个例子,它形貌了一个引起代码更改的玄妙问题。假如代码中没有对此举行记录,那么开辟人员大概稍后出现并撤消更改,而没有意识到他们重新创建了一个错误。假如您也想在提交消息中包罗此信息的副本,那很好,但最紧张的是在代码中获得它。这阐明确将 文档放在开辟人员最大概看到的地方的原则;提交日志很少在谁人地方。
16.4 保留注释:克制重复

使注释保持最新的第二种技能是克制重复。假如文档是重复的,开辟人员就很难找到并更新全部干系的副本。相反,只管只记录一次每个筹划决策。假如代码中有多个地方受到某个特定决策的影响,那么不要在每个地方重复文档。相反,找到最显着的地方放置文档。比方,假设有一个与变量干系的复杂举动,它会影响变量使用的几个差异位置。您可以在变量声明旁边的注释中记录该举动。假如开辟人员在明白使用该变量的代码时碰到困难,这是一个很天然的地方。
假如没有一个“显着的”地方来放置特定的文档,开辟人员可以找到它,那么创建一个designNotes文件,如第13.7节所述。大概,选择最好的地方,把文档放在那里。别的,在引用中心位置的其他地方添加简短的注释:“检察xyz中的注释以相识下面代码的表明。“假如引用因为主注释被移动或删除而变得过期,这种不一致性将是不问可知的,因为开辟人员不会在指定的地方找到注释;他们可以使用修订控制汗青记录来查找注释发生了什么,然后更新引用。相反,假如文档是重复的,而且一些副本没有得到更新,那么开辟人员就不会知道他们使用的是陈旧的信息。
假如信息已经在步调之外的某个地方记录了,不要在步调内部重复记录;只需参考外部文档。比方,假如您编写一个实现HTTP协议的类,那么就不必要在代码中形貌HTTP协议。在网上已经有许多关于这个文档的泉源;只需在您的代码中添加一个简短的注释,并为其中一个源添加一个URL。另一个例子是已经在用户手册中记录的特性。假设您正在编写一个实现下令聚集的步调,其中有一个方法负责实现每个下令。假如有形貌这些下令的用户手册,就不必要在代码中重复这些信息。相反,在每个下令方法的接口注释中包罗如下简短阐明:
  1. // Implements the Foo command; see the user manual for details.
复制代码
紧张的是读者可以很容易地找到全部必要的文档来明白您的代码,但这并不意味着您必须编写全部的文档。
不要在另一个模块中重新记录一个模块的筹划决策。比方,不要在一个方法调用之前加上注释来表明在被调用的方法中发生了什么。假如读者想知道,他们应该检察方法的接口注释。好的开辟工具通常会主动提供这些信息,比方,假如您选择了一个方法的名称大概将鼠标悬停在它上面,就会表现该方法的接口注释。只管让开辟人员容易地找到适当的文档,但不要重复文档。
16.5 维护注释:查抄差异

确保文档保持最新的一个好方法是,在将更改提交到修订控制体系之前花几分钟时间扫描提交的全部更改,确保每个更改都正确地反映在文档中。 这些预提交扫描还将检测其他几个问题,如不测地在体系中留下调试代码或未能修复TODO项。
16.6 更高级别的注释更容易维护

关于维护文档的末了一个想法:假如注释比代码更高级、更抽象,那么它们更容易维护。这些注释不反映代码的细节,因此它们不会受到代码的渺小更改的影响;只有团体举动的改变才会影响这些注释。固然,正如第13章所讨论的,有些注释确实必要具体和准确。但是一样平常来说,最有效的注释(它们不会简朴地重复代码)也是最容易维护的。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|深圳论坛-深圳人的网上家园  

GMT+8, 2020-6-6 06:42 , Processed in 0.132066 second(s), 29 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表