热门标签 | HotTags
当前位置:  开发笔记 > 程序员 > 正文

论坛累积计时代码ubb_“累积代码”气味

论坛累积计时代码ubb资料来源:Wikimedia在本文中,我们将讨论可以从源代码历史记录中识别出的代码中可能存在的问题。我们称这种“气味”累积代码。这

论坛累积计时代码ubb

资料来源: Wikimedia

在本文中,我们将讨论可以从源代码历史记录中识别出的代码中可能存在的问题。 我们称这种“气味” 累积代码 。 这篇文章中使用术语“ 累积代码”来描述主要通过添加而很少更改而对现有代码进行修改的代码。 本质上,每项更改都是将新代码添加到同一模块中,而重构本来是更好的选择。 通过添加新的代码段来引入新功能,这些代码段将更改或扩展现有代码的行为。

请注意,与其他代码气味不同 ,累积代码不是直接从代码中识别的,而是从源代码的历史中识别的。

如何检测累积的代码气味?

就像我们说的那样,只需查看版本控制系统中的代码历史记录就可以轻松检测到累积代码。 如果文件的历史记录遵循此模式,则可以将代码视为累积代码(或者至少有累积代码的味道):

Line, developer, commit date
101 dev1 2011/3/1
102 dev1 2011/3/1
...
133 dev1 2011/3/1
134 dev2 2013/6/7
135 dev2 2013/6/7
...
146 dev2 2013/6/7
147 devN 2017/12/16
148 devN 2017/12/16
...
149 devN 2017/12/16

在这种情况下,新提交只是添加,没有(或相对很少)删除/修改。 通常,随着新功能的出现,代码会不断发展。 演进不只是在现有代码中添加新代码。 随着我们更好地了解系统的工作方式,设计和体系结构决策也会发生变化,并且这些决策可能会更改代码的结构。 前面的示例表明,在过去的六年中,可能没有做出这样的决定,并且代码不断增长。 当系统扩展时,将修改代码,以便可以适应新代码。 肯·汤普森 ( Ken Thompson )的一句名言说: “我最富有成效的日子之一就是扔掉了1000行代码。”

请注意,提到的模式是一种指示或轻微的气味 ,表明我们的代码可能有问题。 显然,有一些代码遵循这样的模式,既灵活又干净。 例如,添加新方法的接口代码可以遵循这种模式,而不是累积的。

累积代码是一件坏事吗?

为了回答这个问题,我们必须考虑实际的累积代码指示什么。 累积代码表示违反了开放/关闭原则 。 开放/封闭原则指出“软件实体(类,模块,功能等)应为扩展而开放,但为修改而封闭”,因此,由于已将新功能与现有功能一起添加,因此该代码肯定不会因修改而封闭。功能,降低我们软件的灵活性。 通常,这是一堆if语句,它们覆盖新的情况或修改旧的情况。 这些添加可能是开发人员为快速完成任务所使用的难看的hack和快捷方式。 累积代码往往会使方法/函数和类变大,并且在大多数情况下,代码在多个位置重复,这降低了代码的简洁性。 因此,随着时间的流逝,代码的可维护性往往会降低,而新功能的实现则需要更长的时间。

如果我们退后一步,我们可以看到这些问题仅仅是更普遍问题的结果。 累积代码意味着维护代码的团队内部存在沟通问题 。 正如我们在上一节中看到的,每个开发人员都在不同的时间点添加了她的功能。 这清楚地表明,团队成员没有交流如何重组代码以采用新的变更,什么模式可能有用,新的变更是否修改了方法/功能/类/组件/模块的性质,并且应该分开(以符合“ 单一职责原则” ),或者更糟的是,新功能是否已经存在于系统中的其他位置。

由于缺乏沟通,实施新功能的开发人员未考虑重构代码,因为她担心会破坏已经起作用的内容。 这也称为对改变恐惧! 这不是罕见的情况,特别是如果代码库很旧并且测试套件可能不那么可靠(本文中有关此主题的更多信息 )甚至根本不存在。 因此,如果开发人员的新引入的更改破坏了现有功能,则他们将没有反馈。

累积代码也可能是团队始终以“消防模式”工作的结果。 在这种情况下,开发人员会尝试找到解决方案的最短路径来完成任务,然后他们最终会使用hack和快捷方式来添加完成任务所需的功能。 当然,当将来需要对这些黑客进行调试或扩展时,必须支付此解决方案的成本。 团队可以在有限的时间内(由于紧急情况)在消防模式下工作,但是当该模式成为默认模式时,这意味着代码库即将到期。 消防员开发人员可以在短期内将他们视为解决紧急问题的英雄,但是如果不支付所产生的技术债务,他们的做法将使代码库处于危险之中。

沟通问题的影响

通讯问题可能导致代码具有难以理解的巨大方法和类,大量重复以及晦涩的代码可能存在的所有问题。 没有团队成员对系统如何工作以及应如何扩展有相同的理解 。 因此,个人重新实现可能具有微小差异或没有差异而不是重新使用已经存在的功能的情况并不少见。 正如Martin Fowler“谁需要一名架构师?”中所述,对系统的共识与系统的体系结构高度相关

沟通对于团队(不仅是开发人员团队,还是整个团队)的成功至关重要。 在上一篇文章中 ,我们讨论了团队内部沟通的重要性以及它如何影响团队的绩效,从而影响团队的成功。 团队应该在沟通结构上投入大量资金。

如何通过代码改善沟通?

交流并不总是物理/语言甚至是同步的。 正如我们在本文中所讨论的,代码也是开发人员彼此交流解决方案的媒介。 当团队成员不在同一地点时,通过代码进行交流总是更具挑战性,需要付出额外的努力。 干净的代码可以改善沟通!

除了干净的代码外,理想情况下,应该有一些测试可以验证代码的行为,从而消除(或减少)对更改的恐惧。 测试是最好的交流方式(更多有关测试的信息 )。 一年前写过一段代码的开发人员可能忘记了一些极端情况,但测试却没有。 文档页面可能已过时,但测试不能。 测试不要说谎!

您的VCS为您提供了一个有趣的故事!

版本控制系统跟踪我们代码库中发生的一切。 通过看的提交,我们可以提取的信息,有关如何团队的工作方式了一些非常有用的片段(不,控制线不是开发者的工作效率的度量!)。 我们还可以看到随着新功能的出现或容量需求的变化,我们的系统一直在发展。

遗留系统有很多这样的历史,这总是令人兴奋的!

进一步阅读

  1. 谁需要建筑师? 马丁·福勒 ( Martin Fowler)
  2. 代码闻起来
  3. 开闭原则
  4. 单一责任原则
  5. 让代码说话!
  6. 团队文化的重要性
  7. 片状测试-一场永无止境的战争
  8. 首先测试

翻译自: https://hackernoon.com/cumulative-code-smell-6d5344646c46

论坛累积计时代码ubb



推荐阅读
  • 深入解析Serverless架构模式
    本文将详细介绍Serverless架构模式的核心概念、工作原理及其优势。通过对比传统架构,探讨Serverless如何简化应用开发与运维流程,并介绍当前主流的Serverless平台。 ... [详细]
  • 本文介绍了如何利用 Spring Boot 和 Groovy 构建一个灵活且可扩展的动态计算引擎,以满足钱包应用中类似余额宝功能的推广需求。我们将探讨不同的设计方案,并最终选择最适合的技术栈来实现这一目标。 ... [详细]
  • 本文详细解释了如何使用@IfProfileValue注解来检测Spring框架中的配置文件是否处于活动状态,并探讨其与@Profile和@activeProfiles的区别。 ... [详细]
  • 2018年3月31日,CSDN、火星财经联合中关村区块链产业联盟等机构举办的2018区块链技术及应用峰会(BTA)核心分会场圆满举行。多位业内顶尖专家深入探讨了区块链的核心技术原理及其在实际业务中的应用。 ... [详细]
  • 本文详细介绍了网络存储技术的基本概念、分类及应用场景。通过分析直连式存储(DAS)、网络附加存储(NAS)和存储区域网络(SAN)的特点,帮助读者理解不同存储方式的优势与局限性。 ... [详细]
  • Git管理工具SourceTree安装与使用指南
    本文详细介绍了Git管理工具SourceTree的安装、配置及团队协作方案,旨在帮助开发者更高效地进行版本控制和项目管理。 ... [详细]
  • 解决SVN图标显示异常问题的综合指南
    本文详细探讨了SVN图标无法正常显示的问题,并提供了多种有效的解决方案,涵盖不同环境下的具体操作步骤。通过本文,您将了解如何排查和修复这些常见的SVN图标显示故障。 ... [详细]
  • Netflix利用Druid实现高效实时数据分析
    本文探讨了全球领先的在线娱乐公司Netflix如何通过采用Apache Druid,实现了高效的数据采集、处理和实时分析,从而显著提升了用户体验和业务决策的准确性。文章详细介绍了Netflix在系统架构、数据摄取、管理和查询方面的实践,并展示了Druid在大规模数据处理中的卓越性能。 ... [详细]
  • Python处理Word文档的高效技巧
    本文详细介绍了如何使用Python处理Word文档,涵盖从基础操作到高级功能的各种技巧。我们将探讨如何生成文档、定义样式、提取表格数据以及处理超链接和图片等内容。 ... [详细]
  • Windows 7 64位系统下Redis的安装与PHP Redis扩展配置
    本文详细介绍了在Windows 7 64位操作系统中安装Redis以及配置PHP Redis扩展的方法,包括下载、安装和基本使用步骤。适合对Redis和PHP集成感兴趣的开发人员参考。 ... [详细]
  • 编写了几个500行左右代码的程序,但基本上解决问题还是面向过程的思维,如何从问题中抽象出类,形成类的划分和设计,从而用面向对象的思维解决问题?有这方面的入门好书吗?最好是结合几个具体的案例分析的 ... [详细]
  • Spring Boot单元测试中Redis连接失败的解决方案
    本文探讨了在Spring Boot项目中进行单元测试时遇到Redis连接问题的原因及解决方法,详细分析了配置文件加载路径不当导致的问题,并提供了有效的解决方案。 ... [详细]
  • 嵌入式开发环境搭建与文件传输指南
    本文详细介绍了如何为嵌入式应用开发搭建必要的软硬件环境,并提供了通过串口和网线两种方式将文件传输到开发板的具体步骤。适合Linux开发初学者参考。 ... [详细]
  • 本文将详细介绍多个流行的 Android 视频处理开源框架,包括 ijkplayer、FFmpeg、Vitamio、ExoPlayer 等。每个框架都有其独特的优势和应用场景,帮助开发者更高效地进行视频处理和播放。 ... [详细]
  • 从码农到创业者:我的职业转型之路
    在观察了众多同行的职业发展后,我决定分享自己的故事。本文探讨了为什么大多数程序员难以成为架构师,并阐述了我从一家外企离职后投身创业的心路历程。 ... [详细]
author-avatar
余杰20
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有