代码复杂度的识别信号与简化之道

本文探讨了识别代码复杂度的多种信号,包括需要添加hack来维持功能、其他开发者频繁询问代码逻辑、害怕修改代码等。多位开发者分享了他们的观察,如方法参数列表失控、编译缓慢、依赖关系复杂等,提供了实用的代码质量评估视角。

代码复杂度的线索

以下是一些表明你的代码可能过于复杂的线索:

  • 你需要添加“hack”来让功能继续工作
  • 其他开发者不断询问你某部分代码的工作原理
  • 其他开发者不断误用你的代码,导致bug
  • 有经验的开发者阅读一行代码需要超过一瞬间的时间
  • 你害怕修改这部分代码
  • 管理层认真考虑雇佣多个开发者来负责单个类或文件
  • 很难想出如何添加新功能
  • 开发者经常争论这部分代码应该如何实现
  • 人们经常对这部分代码做出完全无意义的修改,你只能在代码审查时或在更改已提交后发现

这些是我能立即想到的。还有其他的吗?

-Max

评论

Andrew Pennebaker 说: 2011年11月17日下午12:14

  • 代码与其他代码配合不佳(API弱或没有API)
  • 每个函数似乎都需要自定义输入类型
  • 编译或解释速度慢
  • 项目需要多种编程语言
  • 很难将项目与其依赖项解耦或切换到替代库
  • 开发者讨论从头重写整个项目

回复

Max Kanat-Alexander 说: 2011年11月17日晚上9:12 是的,这些很好!虽然我不会说缓慢的解释/编译或需要多种语言必然是复杂度的指标。有些语言就是有慢的编译器,有些项目就是很大,有时你必须使用多个工具来完成工作。

-Max

John 说: 2011年11月17日下午12:30 “管理层认真考虑雇佣多个经理来管理负责单个类或文件的开发者”怎么样?

回复

Max Kanat-Alexander 说: 2011年11月17日晚上9:12 哈哈哈!

回复

Jerome 说: 2011年11月17日下午12:56 其他几个:

  • 你的方法参数列表随时间失控增长
  • 你觉得需要注释控制块的结束(我称之为’if’膨胀)
  • 编写一个好的覆盖测试需要的代码比你想要测试的方法还多

回复

Max Kanat-Alexander 说: 2011年11月17日晚上9:13 是的!这些相当好!虽然,就测试编写而言,我实际上发现测试比代码大是很常见的。我认为这可能更多是需求复杂度的问题,而不是代码复杂度的问题。

-Max

回复

Simon 说: 2011年11月17日下午5:32 依赖树看起来像这样? http://thedailywtf.com/Articles/Enterprise-Dependency-The-Next-Generation.aspx

回复

Max Kanat-Alexander 说: 2011年11月17日晚上9:13 哈哈哈!!确实是WTF!!

-Max

回复

Raghu 说: 2011年11月17日晚上9:54 读了上面Simon的评论后,我去了那个网站,发现了这个。 http://thedailywtf.com/Articles/Serious-String-Validation.aspx ~raghu

Palo 说: 2011年11月29日凌晨1:02 嗨Max,我真的很喜欢你的博客文章。去年我在开发一个用于从大数据集计算统计数据的批处理系统。为了添加新的业务规则,我必须检查和/或修改几个不相关的地方,包括spring beans、属性文件和其他东西,所有这些都很琐碎,但很容易出错(例如,有一个DB2/Oracle小数/整数问题,没有人第一次就做对)。所以我认为当一个系统很容易出错时,它就是复杂的(后果是“你害怕修改这部分代码”)

回复

Max Kanat-Alexander 说: 2011年11月29日凌晨1:16 嘿Palo!谢谢你的好话!是的,我同意,“太容易出错”是一个非常好的点。

-Max

回复

Srihari S 说: 2012年4月6日凌晨1:24 如果你的代码有味道,它就是复杂的。参考WIKI:代码味道。

Steve Bush 说: 2012年4月7日晚上11:36 我昨天从头到尾读了《代码简洁》!(电子书有“封面”吗?)。并且很享受!我想说大约50%我同意,剩下的50%我强烈同意!我想我可以挑剔几个点,(并期待在将来的某个时候这样做!),但总的来说,我大部分同意你的初始陈述,即无论它可能是什么,它都是一个开始!而且是一个非常可行的开始!

我不介意看到一个博客/课程/午餐系列,每个课时(或博客条目)提出一个规则或定律进行讨论!那将是一个有趣的对话!

我有两个与编码点无关的评论要添加:

我从书中得到的一个全新东西是物理组织。每条定律、规则、事实、定义在出现时都被标识出来,然后当我到达结尾时,我得到了一个列出每一个的附录!这创造了整本书的绝妙回顾!我非常喜欢这一点,就像在最后5分钟内几乎在心理上重新阅读整本书一样!太棒了!

另一个无关但可能有趣的点是我阅读的方式:通过iPad iBooks应用。我读得非常非常多,但几乎总是通过网页浏览器。我注意到我阅读时几乎不断滚动;在iPad上,我的拇指让文本像自动提词器一样上升,以便我的眼睛始终保持大约相同的高度;在Mac上,我阅读时两个手指放在触控板上做同样的事情。但iBooks保持文本静止,我的眼睛从上到下移动。我不能说这是否更优越,只是觉得不同,并提醒我们自从那些纸做的东西,哦是的,书!以来已经走了很长的路!

一个幽默的愚蠢行为:我去了一次iBook的目录,它只在屏幕上显示到第2章。我花了整整五分钟试图显示剩余的章节。页面不会翻动!我几乎放弃并决定这是一个bug,当我意识到,目录可以滚动!!!!!!无论如何,你做得非常好,非常感谢!我很享受,我相信我的编程将来会从中受益!

Steve

————- “我们现在玩得很开心!”

Vidhyut 说: 2013年3月18日下午5:33 复杂的软件大多有大的依赖性。所以如果你不能将一个类从一个项目重用到另一个项目,这是一个信号,表明你有一个紧密耦合的复杂系统。

Mike W. 说: 2017年9月21日晚上9:35 这个怎么样:

回复

Max Kanat-Alexander 说: 2017年9月24日晚上11:15 信不信由你,我曾经认识一个人,他用这个特定的术语自豪地、有意地描述他的系统设计,好像它是一个应该保留的合法设计选择。

回复

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计