代码的坏味道

本文探讨了重复代码的问题及解决方法,强调了通过重构将重复代码整合的重要性。文章介绍了如何利用小型函数来提高代码质量,包括函数分解的原则与实践案例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

代码的坏味道


1、重复的代码
首当其冲的是重复代码。如果在一个以上地点看到相同的程序结构,那么可以肯定,设法将其合二为一,程序会变得更好。

2、长函数
拥有短函数的对象会活的比较好、比较长。间接层所带来的全部利益-解释能力、共享能力、选择能力-都是由小型函数支持的。

应该积极分解函数,应该遵循这样一个原则:每当感觉需要以注释来说明什么的时候,我们就把需要说明的东西写到一个独立的函数中,并以其用途(而非实现手法)命名。

我们可以对一组或甚至短短一行代码做这件事,哪怕替换后的函数调用比函数本身还长,只要函数名称能够解释其用途,我们也该毫不犹豫地那么做。

关键不在于函数的长度,而在于函数“做什么”和“如何做”之间的语义距离。
内容概要:本文深入探讨了金属氢化物(MH)储氢系统在燃料电池汽车中的应用,通过建立吸收/释放氢气的动态模型和热交换模型,结合实验测试分析了不同反应条件下的性能表现。研究表明,低温环境有利于氢气吸收,高温则促进氢气释放;提高氢气流速和降低储氢材料体积分数能提升系统效率。论文还详细介绍了换热系统结构、动态性能数学模型、吸放氢特性仿真分析、热交换系统优化设计、系统控制策略优化以及工程验证与误差分析。此外,通过三维动态建模、换热结构对比分析、系统级性能优化等手段,进一步验证了金属氢化物储氢系统的关键性能特征,并提出了具体的优化设计方案。 适用人群:从事氢能技术研发的科研人员、工程师及相关领域的研究生。 使用场景及目标:①为储氢罐热管理设计提供理论依据;②推动车载储氢技术的发展;③为金属氢化物储氢系统的工程应用提供量化依据;④优化储氢系统的操作参数和结构设计。 其他说明:该研究不仅通过建模仿真全面验证了论文实验结论,还提出了具体的操作参数优化建议,如吸氢阶段维持25-30°C,氢气流速0.012g/s;放氢阶段快速升温至70-75°C,水速18-20g/min。同时,文章还强调了安全考虑,如最高工作压力限制在5bar以下,温度传感器冗余设计等。未来的研究方向包括多尺度建模、新型换热结构和智能控制等方面。
### 代码味道概述 代码味道是指程序中存在的某些结构上的缺陷,这些问题虽然不会阻止程序运行,但却会降低其可读性、可维护性和扩展性。通过识别并消除这些味道,可以显著提升代码质量。 #### 味道类型及改进方式 1. **过长的方法** 过长的方法通常包含了过多的责任和复杂的逻辑,这会使方法难以理解和测试[^1]。 #### 改进方式 - 将大方法拆分为多个小方法,每个方法只负责单一职责。 - 使用提取函数(Extract Method)技术来分离出独立的功能模块。 ```python def process_data(data): cleaned_data = clean_data(data) # 提取清洁数据功能 analyzed_data = analyze_data(cleaned_data) # 提取分析数据功能 return format_results(analyzed_data) # 提取格式化结果功能 def clean_data(data): ... def analyze_data(data): ... def format_results(data): ... ``` 2. **霰弹式修改** 霰弹式修改发生在每次变更需求时都需要在多个类中进行大量小改动的情况[^3]。这种模式不仅增加了开发成本,还容易遗漏重要部分。 #### 改进方式 - 应用移动方法(Move Method)、内联临时变量(Inline Temp)等重构手段集中相关行为到单个位置处理。 - 考虑引入抽象基类或者接口统一管理共同的行为特性。 3. **发散式变化** 发散式变化指的是当面对特定类型的改变时,需要同时调整同一类中的多处地方[^2]。这种情况表明该类承担了太多不同方面的责任。 #### 改进方式 - 利用提炼类(Extract Class)把不相关的属性与操作移除出去形成新的子组件。 - 对于复杂的数据模型考虑采用DTO(Data Transfer Object),减少原始对象负担。 4. **重复代码** 如果发现相似片段反复出现,则意味着存在潜在共享机制未被充分利用的机会。 #### 解决方案 - 合并重复条件片段(Consolidate Conditional Expression) - 创建通用工具库供项目其他区域调用 5. **循环语句滥用** 循环往往带来性能瓶颈以及嵌套层次加深的问题。 #### 处理建议 - 替代迭代器或流表达式简化流程控制 ```java List<String> names = people.stream() .map(Person::getName) .collect(Collectors.toList()); ``` 6. **过度耦合** 类之间依赖关系过于紧密,任何一方变动都会影响另一方正常运作。 #### 缓解措施 - 实施依赖注入(Dependency Injection),使服务提供者和服务使用者相互隔离. - 推荐遵循开闭原则(Open/Closed Principle) 7. **缺乏清晰命名** 不恰当的名字会让读者困惑不解,无法快速把握意图. #### 补救办法 - 更改含糊不清的术语为更具描述性的词语 - 确保名称能够反映实际用途而非实现细节
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值