标签: 编程风格
重构指南
重构是一种规范化的技术,用于重构现有代码库,在不改变其外部行为的情况下改变其内部结构。其核心是一系列保持行为的小型转换。每个转换(称为“重构”)作用很小,但一系列这样的转换可以产生重大的重构。由于每次重构都很小,因此出错的可能性较小。每次重构后,系统都能保持完全工作状态,从而降低了系统在重构过程中严重损坏的可能性。
高质量软件值得付出代价吗?
软件开发项目中一个常见的争论是,是花时间提高软件质量,还是专注于发布更有价值的功能。通常,交付功能的压力主导着讨论,导致许多开发人员抱怨他们没有时间处理架构和代码质量。这场辩论是基于这样一个假设:提高质量也会增加成本,这是我们的共同经验。但与直觉相反的现实是,内部软件质量消除了减缓新功能开发速度的障碍,从而降低了增强软件的成本。
重构的工作流程
重构已经发展成为一种众所周知的技术,大多数软件开发团队至少声称都在定期进行重构。然而,许多团队并不了解重构可以使用的不同工作流程,因此错过了将重构有效地纳入其开发活动的机会。在本演示文稿中,我将探讨各种不同的工作流程。我希望它能鼓励团队将重构更深入地整合到他们的工作中,从而形成设计更好的代码库,使添加新功能变得更快、更容易。
Web 应用程序安全基础
现代 Web 开发面临着许多挑战,其中安全问题既非常重要,又常常被忽视。虽然威胁分析等技术越来越被认为是任何严肃开发的必要条件,但也有一些基本实践是每个开发人员都可以而且应该作为理所当然的事情来做的。
面向领域的 Observability
在我们软件系统中,Observability 一直很有价值,在这个云和微服务时代更是如此。然而,我们添加到系统中的 Observability 通常级别较低,技术性较强,而且似乎常常需要在代码库中充斥着对各种日志记录、检测和分析框架的粗糙、冗长的调用。本文介绍了一种模式,可以清理这种混乱,并允许我们以一种干净、可测试的方式添加与业务相关的 Observability。
重构访问外部服务的代码
当我编写处理外部服务的代码时,我发现将访问代码分离到单独的对象中很有价值。在这里,我将展示如何将一些凝固的代码重构为这种分离的常见模式。
要明确
通常,设计技术用于使系统更加灵活,但最终却变得更难使用。其中一个原因是,在设计中经常会忘记显式性。
使用元数据
您可以使用基于元数据的方法来消除繁琐的面向数据任务的痛苦。
何时创建类型
关于何时为值创建新的用户定义类型(或类)的指南。
命令查询分离
“命令查询分离”一词是由 Bertrand Meyer 在他的著作“面向对象软件构造”中提出的——这本书是面向对象早期最具影响力的面向对象书籍之一。(第一版是具有影响力的版本,第二版也不错,但你需要在健身房锻炼几个月才能举起它。)
组合正则表达式
编写可维护代码最强大的工具之一是将大型方法分解成命名良好的较小方法——Kent Beck 将这种技术称为组合方法模式。
设计耐力假说
精心设计软件值得付出努力吗?
不可测试
(这是对你的词典的补充。)
不可测试(形容词):不可测试的软件。
函数长度
在我的职业生涯中,我听到过很多关于函数应该有多长的争论。这是一个更重要的问题的代表——什么时候我们应该将代码封装在它自己的函数中?其中一些指南是基于长度的,例如函数的长度不应超过一个屏幕。有些是基于重用的——任何使用多次的代码都应该放在自己的函数中,但只使用一次的代码应该内联。然而,对我来说最有意义的论点是意图和实现的分离。如果你必须花力气去看一段代码来弄清楚它在做什么,那么你应该把它提取到一个函数中,并根据“什么”来命名这个函数。这样,当你再次阅读它时,函数的用途就会一目了然,而且大多数情况下,你不需要关心函数是如何实现其用途的——这就是函数的主体。
技术债务
软件系统容易积累障碍——内部质量的缺陷,使得修改和扩展系统变得比理想情况下更难。技术债务是由 Ward Cunningham 创造的一个比喻,它构建了如何处理这种障碍的思路,将其视为一种金融债务。添加新功能所需的额外努力就是偿还债务的利息。
测试驱动开发
测试驱动开发 (TDD) 是一种通过编写测试来指导软件开发的软件构建技术。它是由Kent Beck在 20 世纪 90 年代后期作为极限编程的一部分开发的。本质上,我们反复遵循三个简单的步骤
Yagni
Yagni 最初是一个首字母缩写词,代表“你不会需要它(You Aren't Gonna Need It)”。它是极限编程(Extreme Programming)中的一句口号,经常在敏捷软件团队中使用。它指的是,我们认为软件将来可能需要的某些功能,现在不应该构建,因为“你不会需要它”。