代码之丑
郑晔
开源项目 Moco 作者
19833 人已学习
新⼈⾸单¥59
登录后,你可以任选2讲全文学习
课程目录
已完结/共 24 讲
代码之丑
15
15
1.0x
00:00/00:00
登录|注册

03 | 重复代码:简单需求到处修改,怎么办?

你好,我是郑晔。
前面两讲,我们讨论了命名中的坏味道。今天,我们来讨论另外一个常见的坏味道:重复代码。
记得我刚开始工作的时候,有人开玩笑说,编程实际上就是 CVS(CVS 是当时流行的一个版本控制工具,相当于今天的 Git),也就是 Ctrl+C、Ctrl+V、Ctrl+S,或许你已经听出来了,这是在调侃很多程序员写程序依靠的是复制粘贴。
时至今日,很多初级程序员写代码依然规避不了复制粘贴,基本的做法就是把一段代码复制过来,改动几个地方,然后,跑一下没有太大问题就万事大吉了。殊不知,这种做法就是在给未来挖坑。
通常情况下,只要这些复制代码其中有一点逻辑要修改,就意味着所有复制粘贴的地方都要修改。所以,我们在实际的项目中,常常看见这样的情况:明明是一个简单的需求,你却需要改很多的地方,需要花费很长的时间,结果无论是项目经理,还是产品经理,对进度都很不满意。
更可怕的是,只要你少改了一处,就意味着留下一处潜在的问题。问题会在不经意间爆发出来,让人陷入难堪的境地。
复制粘贴是最容易产生重复代码的地方,所以,一个最直白的建议就是,不要使用复制粘贴。真正应该做的是,先提取出函数,然后,在需要的地方调用这个函数。
其实,复制粘贴的重复代码是相对容易发现的,但有一些代码是有类似的结构,这也是重复代码,有些人对这类坏味道却视而不见。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文通过幽默的案例和深入的技术分析,探讨了软件开发中常见的重复代码问题。作者首先描述了编程中常见的复制粘贴现象,强调了这种做法给未来留下的问题。重复代码不仅导致修改困难和耗时,还可能引发潜在的问题,给项目带来风险。文章通过实际代码示例展示了重复代码的结构特点,并提出了解决方案。作者强调了发现结构上的重复是解决重复代码问题的关键,提出了通过提取函数或接口来消除重复结构的方法。同时,还介绍了在支持函数式编程的语言中利用方法引用等特性来简化代码编写的技巧。总的来说,本文帮助读者深入理解了重复代码的危害以及解决方法,为软件开发人员提供了宝贵的经验和指导。文章强调了软件开发中的重要原则“不要重复自己”,并提醒程序员时刻保持对“重复”的敏感度,将各种重复降到最低。文章内容深入浅出,对读者快速了解重复代码问题及解决方法具有指导意义。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《代码之丑》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(18)

  • 最新
  • 精选
  • 醒了不起床
    自己总结重复代码过多的一些原因 1 代码结构不合理导致同一个实现散落各处由于初期代码结构设计不合理导致后续功能实现无法快速找到已有实现,或者找到了但是不好引用已有实现。改进:初期设计代码逻辑合理,对于不合理的地方要及时重构 防止演变成原因2 2 为了稳定性,不动老逻辑 拷贝一份。由于对于业务的不熟悉和对自己代码能力的不信任不敢重构导致。改进通过微重构进行多次迭代小改进慢慢优化 3 写的时候为了快 由于时间紧张或者能力问题无法识别出的坏代码。改进提升能力

    作者回复: 很好的补充

    2021-01-05
    2
    16
  • sfqqyq
    和别人共同协作开发的时候,有时候也挺纠结是不是和别人有重复的代码,如果有谁来修改的问题。

    作者回复: 在一个职业的队伍里,谁发现谁修改

    2021-01-07
    13
  • 桃子-夏勇杰
    郑老师,俗话说,天下文章一大抄,代码估计也是同理。但是,如果代码写好了,老程序员是不是可以反复利用自己写过的代码了,而慢慢地变得没有什么代码好写了呢?(有感于自己写文章,写来写去也没有什么特别新的洞见,最近学习也有类似的感觉,很多得到上的付费课程感觉都是东抄抄西抄抄)

    作者回复: 反复利用的代码,为什么不是去写一个程序库? 得到的课程是另外一个问题,你要是觉得雷同,说明你的见识涨了。

    2021-01-08
    10
  • 刘大明
    代码重复这个在项目中太常见了. 有些创建对象new 对象重复,这个时候我一般用工厂模式去解决 再就是很多if条件处理不同的逻辑,这种情况一般都用策略模式去解决 再就是实体之间的赋值,一般都用工具BeanUtils 或者 MapStruct

    作者回复: 对,很多问题是可以用设计模式和工具框架去解决的。

    2021-01-05
    7
  • adang
    1. 对于自己写的代码,重复写了多遍的,或者逻辑相似但是又不好直接引用的地方,发现后及时重构,如果项目时间紧迫来不及修改,会写好TODO,在下一次做修改或者闲暇的时候修改好; 2. 多人协作,对于别人的代码还是要考虑一下的,会和对方打个招呼再去改动。以前有位同事就很不喜欢别人改动他的代码,一次因为有人重构了他的代码引发了bug,他当场大发雷霆。同时他也不去改动别人的代码,即使逻辑一样他也会再写一遍,问其原因,回答要么是不知道,要么说抽象好的方法写的太复杂看不懂,不敢用。基于这样的原因,代码库里留存着很多重复的代码。

    作者回复: 我特别鼓励代码的集体所有,这样,就没有代码属于谁的说法了。不能透明沟通的人,不适合在团队中工作。

    2021-01-09
    3
    6
  • Aprelude
    如果这个runable传入之后有返回值这个怎么写

    作者回复: 如果有返回值,就用有返回值的,比如,Function

    2021-06-25
    4
    1
  • benxiong
    郑老师,我看到你有的方法参数加了 final 修饰,有的没有。我只知道 final 修饰一个对象,对象的引用不可修改,对象的值是可以改的。不知道这里加 final 的意义在哪里,希望老师能解惑一下,谢谢。

    作者回复: 我鼓励的做法是都加上 final 参数,如果没加,可能是漏了。后面讲到可变的数据时,提到了 final 的使用,你可以看一下。

    2021-01-27
    2
    1
  • Geek_3b1096
    原来我一直在犯结构重复

    作者回复: 意识到是改进的前提条件。

    2021-01-11
    1
  • Archer
    确实讲的很好,我在写代码的时候也经常纠结这些,全讲到了
    2021-01-05
    4
  • 李叶
    DRY不要重复自己,代码重复,结构重复,分支结构类似都是重复,学习抽象,分离关注点
    2021-03-25
    1
收起评论
显示
设置
留言
18
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部