热门标签 | 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



推荐阅读
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • ccFlow新增属性:流程发起限制条件优化与扩展
    在ccFlow最新版本中,新增了流程发起限制条件的优化与扩展功能。这一改进不仅增强了系统的灵活性和安全性,还为开发者提供了更加精细的控制选项,确保流程启动时的数据准确性和合规性。通过合理配置这些限制条件,可以有效避免因不当操作导致的数据混乱和流程错误,提升整体业务流程的管理水平。 ... [详细]
  • 如何撰写适应变化的高效代码:策略与实践
    编写高质量且适应变化的代码是每位程序员的追求。优质代码的关键在于其可维护性和可扩展性。本文将从面向对象编程的角度出发,探讨实现这一目标的具体策略与实践方法,帮助开发者提升代码效率和灵活性。 ... [详细]
  • 利用爬虫技术抓取数据,结合Fiddler与Postman在Chrome中的应用优化提交流程
    本文探讨了如何利用爬虫技术抓取目标网站的数据,并结合Fiddler和Postman工具在Chrome浏览器中的应用,优化数据提交流程。通过详细的抓包分析和模拟提交,有效提升了数据抓取的效率和准确性。此外,文章还介绍了如何使用这些工具进行调试和优化,为开发者提供了实用的操作指南。 ... [详细]
  • 利用ZFS和Gluster实现分布式存储系统的高效迁移与应用
    本文探讨了在Ubuntu 18.04系统中利用ZFS和Gluster文件系统实现分布式存储系统的高效迁移与应用。通过详细的技术分析和实践案例,展示了这两种文件系统在数据迁移、高可用性和性能优化方面的优势,为分布式存储系统的部署和管理提供了宝贵的参考。 ... [详细]
  • 在《Cocos2d-x学习笔记:基础概念解析与内存管理机制深入探讨》中,详细介绍了Cocos2d-x的基础概念,并深入分析了其内存管理机制。特别是针对Boost库引入的智能指针管理方法进行了详细的讲解,例如在处理鱼的运动过程中,可以通过编写自定义函数来动态计算角度变化,利用CallFunc回调机制实现高效的游戏逻辑控制。此外,文章还探讨了如何通过智能指针优化资源管理和避免内存泄漏,为开发者提供了实用的编程技巧和最佳实践。 ... [详细]
  • 如何将TS文件转换为M3U8直播流:HLS与M3U8格式详解
    在视频传输领域,MP4虽然常见,但在直播场景中直接使用MP4格式存在诸多问题。例如,MP4文件的头部信息(如ftyp、moov)较大,导致初始加载时间较长,影响用户体验。相比之下,HLS(HTTP Live Streaming)协议及其M3U8格式更具优势。HLS通过将视频切分成多个小片段,并生成一个M3U8播放列表文件,实现低延迟和高稳定性。本文详细介绍了如何将TS文件转换为M3U8直播流,包括技术原理和具体操作步骤,帮助读者更好地理解和应用这一技术。 ... [详细]
  • 本文详细解析了Java类加载系统的父子委托机制。在Java程序中,.java源代码文件编译后会生成对应的.class字节码文件,这些字节码文件需要通过类加载器(ClassLoader)进行加载。ClassLoader采用双亲委派模型,确保类的加载过程既高效又安全,避免了类的重复加载和潜在的安全风险。该机制在Java虚拟机中扮演着至关重要的角色,确保了类加载的一致性和可靠性。 ... [详细]
  • 在ElasticStack日志监控系统中,Logstash编码插件自5.0版本起进行了重大改进。插件被独立拆分为gem包,每个插件可以单独进行更新和维护,无需依赖Logstash的整体升级。这不仅提高了系统的灵活性和可维护性,还简化了插件的管理和部署过程。本文将详细介绍这些编码插件的功能、配置方法,并通过实际生产环境中的应用案例,展示其在日志处理和监控中的高效性和可靠性。 ... [详细]
  • 使用 ListView 浏览安卓系统中的回收站文件 ... [详细]
  • 深入解析CAS机制:全面替代传统锁的底层原理与应用
    本文深入探讨了CAS(Compare-and-Swap)机制,分析了其作为传统锁的替代方案在并发控制中的优势与原理。CAS通过原子操作确保数据的一致性,避免了传统锁带来的性能瓶颈和死锁问题。文章详细解析了CAS的工作机制,并结合实际应用场景,展示了其在高并发环境下的高效性和可靠性。 ... [详细]
  • 本文深入探讨了NoSQL数据库的四大主要类型:键值对存储、文档存储、列式存储和图数据库。NoSQL(Not Only SQL)是指一系列非关系型数据库系统,它们不依赖于固定模式的数据存储方式,能够灵活处理大规模、高并发的数据需求。键值对存储适用于简单的数据结构;文档存储支持复杂的数据对象;列式存储优化了大数据量的读写性能;而图数据库则擅长处理复杂的关系网络。每种类型的NoSQL数据库都有其独特的优势和应用场景,本文将详细分析它们的特点及应用实例。 ... [详细]
  • 在最近的WWDC17大会上,苹果公司宣布了多项重要更新,其中一项是macOS High Sierra 10.13 Final的正式发布。这一版本经过优化,显著提升了系统的稳定性和响应速度,为用户在任何Mac设备上提供了更加流畅的使用体验。本文将详细介绍如何在Windows系统中利用VMware虚拟机软件安装并运行macOS High Sierra 10.13 Final,帮助用户在非苹果硬件上体验这一先进操作系统。 ... [详细]
  • 卓盟科技:动态资源加载技术的兼容性优化与升级 | Android 开发者案例分享
    随着游戏内容日益复杂,资源加载过程已不仅仅是简单的进度显示,而是连接玩家与开发者的桥梁。玩家对快速加载的需求越来越高,这意味着开发者需要不断优化和提升动态资源加载技术的兼容性和性能。卓盟科技通过一系列的技术创新,不仅提高了加载速度,还确保了不同设备和系统的兼容性,为用户提供更加流畅的游戏体验。 ... [详细]
  • 如何撰写初级和高级前端开发者的专业简历
    如何撰写初级和高级前端开发者的专业简历 ... [详细]
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社区 版权所有