11 月 19 - 20 日 Apache Pulsar 社区年度盛会来啦,立即报名! 了解详情
写点什么

专栏:代码之丑(五)——不受欢迎的大心脏

  • 2010-11-29
  • 本文字数:1262 字

    阅读完需:约 4 分钟

不知道为什么,初见它时,我想起了郭芙蓉的排山倒海:

复制代码
ColdRule *newRule = new ColdRule();
newRule->SetOID(oldRule->GetOID());
newRule->SetRegion(oldRule->GetRegion());
newRule->SetRebateRuleID(oldRule->GetRebateRuleID());
newRule->SetBeginCycle(oldRule->GetBeginCycle() + 1);
newRule->SetEndCycle(oldRule->GetEndCycle());
newRule->SetMainAcctAmount(oldRule->GetMainAcctAmount());
newRule->SetGiftAcctAmount(oldRule->GetGiftAcctAmoun t());
newRule->SetValidDays(0);
newRule->SetGiftAcct(oldRule->GetGiftAcct());
rules->Add(newRule);

就在我以为这一片代码就是完成给一个变量设值的时候,突然,在那个不起眼的角落里,这个变量得到了应用:它被加到了 rules 里面。什么叫峰回路转,这就是。

既然它给了我们这么有趣的体验,必然先杀后快。下面重构了这个函数:

复制代码
ColdRule* CreateNewRule(ColdRule& oldRule) {
ColdRule *newRule = new ColdRule();
newRule->SetOID(oldRule.GetOID());
newRule->SetRegion(oldRule.GetRegion());
newRule->SetRebateRuleID(oldRule.GetRebateRuleID());
newRule->SetBeginCycle(oldRule.GetBeginCycle() + 1);
newRule->SetEndCycle(oldRule.GetEndCycle());
newRule->SetMainAcctAmount(oldRule.GetMainAcctAmount());
newRule->SetGiftAcctAmount(oldRule.GetGiftAcctAmount());
newRule->SetValidDays(0);
newRule->SetGiftAcct(oldRule.GetGiftAcct());
return newRule;
}
rules->Add(CreateNewRule(*oldRule));

把这一堆设值操作提取了出来,整个函数看上去一下子就清爽了。不是因为代码变少了,而是因为代码按照它职责进行了划分:创建的归创建,加入的归加入。之前的代码之所以让我不安,多重职责是罪魁祸首。一旦把这个函数提取出来,做完这步操作,我们就不难发现这个函数应该成为 CodeRule 类的一部分。篇幅所限,就不再继续了。

谈论干净代码时,我们总会说,函数应该只做一件事。函数做的事越多,就会越冗长,也就越难发现不同函数内存在的相似之处。为了一个问题,要在不同的地方改来改去也就难以避免了。但面对长长的函数,还是有人无动于衷,继续往里塞着“新”代码。

即便大家都认同了函数应该只做一件事,但多大的一件事算是一件事呢!不同的人心里有不同的标准。有人甚至认为一个功能就是一件事。于是,代码会越来越刺激。想写干净代码,就别怕事小。哪怕一个函数只有一行,只要它能完整的表达一件事。在干净代码的世界里,大心脏是不受喜欢的。

接下来,我需要用历经沧桑的口吻告诉你,这么跌宕起伏的代码也只不过是一个更大函数的一个部分。此刻,浮现在我脑海里的是层峦叠嶂的山峰。

作者简介:

郑晔,ThoughtWorks 公司咨询师,拥有多年企业级软件开发经验,热衷于探索各种程序设计语言在真实软件开发中所能发挥的威力,致力于探寻合理的软件开发方式,加入 ThoughtWorks 公司后,投入到敏捷开发方法的实践之中,为其他公司提供敏捷开发方法方面的咨询服务。他的 blog 是梦想风暴

查看原文:代码之丑(五)

2010-11-29 02:064912
用户头像

发布了 22 篇内容, 共 13.0 次阅读, 收获喜欢 48 次。

关注

评论

发布
暂无评论
发现更多内容

Hi.com嗨币软件系统开发资料

区块链:从根儿上解决2%的人拥有80%的财富全球社会问题

CECBC

【带你手撸Spring】没有哪个框架开发,能离开 Spring 的 FactoryBean!

小傅哥

spring 小傅哥 代理对象 FactoryBean Bean作用域

已拿阿里P7+意向书!总结480页,超24W字2021最新一线大厂Java高级架构师面试题

Java架构追梦

Java 阿里巴巴 架构 面试

“区块链贸易融资生态”应用案例发布

CECBC

Linux内核移植

学神来啦

云计算 Linux 运维 运维自动化

测试开发之网络篇-网络路由

禅道项目管理

网络

字节跳动异构场景下的高可用建设实践

Java

DGTT矿机软件开发|DGTT矿机系统APP开发

Python 没有函数重载?如何用装饰器实现函数重载?

华为云开发者联盟

Python 装饰器 命名空间 函数 函数重载

ASL公链软件开发|ASL公链系统APP开发

watt挖矿软件开发|watt挖矿APP系统开发

DMD钻石币质押软件系统开发内容

党建百年•融云献礼,重磅发布党建全场景通信解决方案

融云 RongCloud

2021金三银四Android大厂面试题来袭!附赠复习资料

欢喜学安卓

android 程序员 面试 移动开发

2021谈一下当下最合适的Android架构,附小技巧

欢喜学安卓

android 程序员 面试 移动开发

乐视界APP开发|乐视界软件系统开发

视赏家短视频系统软件开发详情

环球旅游积分GTC系统开发内容

Pano Flutter SDK 设计经验与实践浅谈

拍乐云Pano

解析对偶理论与对偶单纯性法

华为云开发者联盟

模型 对偶理论 对偶单纯性法 对偶 线性规划

店讯APP开发|店讯系统软件开发

字节跳动这份面试题,你能打几分

Java 面试

JAVA九种排序算法详解(上)

加百利

Java 数组 排序 7月日更

从零开始学习3D可视化之事件的常用方法

森友小锘

大前端 可视化 3D可视化 数字孪生 事件

Android性能优化之启动优化实战篇!分享面经

欢喜学安卓

android 程序员 面试 移动开发

简单使用HTML集成OnlyOffice

一个需求

onlyoffice

百度搜索稳定性问题分析的故事(上)

百度Geek说

Android性能优化总结,超详细

欢喜学安卓

android 程序员 面试 移动开发

专栏:代码之丑(五)——不受欢迎的大心脏_Java_郑晔_InfoQ精选文章