Agentic AI、具身智能、强化学习框架、端侧大模型……来QCon上海站,感受AI的未来! 了解详情
写点什么

如何使用编程规则和指南

作者:Ben Linders

  • 2024-12-20
    北京
  • 本文字数:1919 字

    阅读完需:约 6 分钟

如何使用编程规则和指南

根据 Arne Mertz 的说法,使用编程规则和指南有助于开发人员协同工作,因为它们可以产生更一致、更好的代码。然而,如果使用不当,则会产生相反的结果——代码难以阅读,或者以次优甚至错误的方式解决问题。


Arne Mertz 在 NDC Tech Town 发表了关于编程规则和指南的演讲。


Mertz 解释了规则和指南之间的区别:


规则或多或少是绝对的。无论规则应用在哪里,都必须遵守,违反规则通常是不可接受的。

指南是一种最佳实践或合理的默认做法——我们可能有产生分歧的理由,但这没关系。


了解这种差异是很重要的,因为将指南解释或陈述为规则会导致开发人员破坏代码,而不是破坏指南本身,Mertz 认为:


指南的本质是,在某些情况下,它们并不适用,并且在这种情况下,试图坚持应用它们往往会导致代码变繁琐、可读性变差,甚至导致完全的错误。


Mertz 说,对于开发人员来说,严格的规则似乎更方便。编译器对其接受的内容非常严格。我们有太多复杂的问题需要解决,盲目遵循一套规则会让我们负担过重。


在他的演讲中,Mertz 探讨了一些规则和指南。他解释了“不要使用异常”(“don’t use exceptions”)规则的由来:


近二十年来,我看到“不要使用异常”规则(或指南)在各种情况下出现。当你追溯它的起源时,你会发现它是来自谷歌风格指南,其中说到“我们不使用异常”。


Mertz 表示,这种微小的差异非常重要,因为它表明谷歌不使用异常。该风格指南阐述了原因;这并不是因为异常被认为是不好的,而是因为在谷歌,有很多代码在编写时并没有考虑异常。对这样的代码库引入异常会带来引入未定义行为的风险,并且需要重新编写其现有代码库的大部分内容,正如 Mertz 所解释的那样:


Mertz 说道:“谷歌是出于必要才采用了这一指南的,而且,据我从在谷歌工作过的人那里了解到的情况看,并不是所有地方都遵循了这一指南。”。


Mertz 表示,在项目中应用这一指南时,指出它的起源以及它是针对旧的大型项目这一事实可能会导致该指南被弃用;当然,除非到那时,这个有问题的项目也已经发展了多年,并且没有考虑异常,而引入异常到这些项目中会导致与谷歌采用该指南同样的问题,他补充道。


Mertz 探索的另一条规则是“每个函数都应有一个返回(return)语句”。该规则是几组指南和规则的一部分,例如 MISRA C 和 MISRA C++ 规则。正如 Mertz 所解释的那样,制定这一规则的原因各不相同:


一些人认为长函数的可读性更高,但反驳的观点是首先应该缩短函数。在像 C 这样的语言中,过早返回可能会意外忽略资源清理,这样是很糟糕的。


Mertz 提到,当你将 C++ 与 RAII 类一起使用,该论点并不适用,因为编译器能通过析构函数来保障资源的清理。


InfoQ 就遵循编程规则和指南可能产生的影响采访了 Arne Mertz。

InfoQ:你对“不要使用异常”的指南有什么看法?


Arne Mertz:异常是 C++ 语言报告错误的核心特性。不经常使用异常会导致过多地使用错误返回码和输出参数,从而使代码变得更难阅读和推理。像 std::expected 这样的现代库解决方案可以在一定程度上缓解这些问题,但我从未见过它们被用于因谷歌指南而避免异常的项目中。


我推测,尤其是在 21 世纪初,谷歌作为一家软件公司是一个时髦的榜样,所以人们都想要效仿他们。他们在完全不同的代码库中采用了这一指南,而没有质疑它的必要性。

InfoQ:遵循“每个函数都应该有一个返回语句”的规则会有什么影响?


Mertz:遵循该规则通常会导致“retVal”变量的某些变体,这些变体通常会被初始化为一个无意义的值,希望稍后能被赋值为实际的返回值。此外,我们经常看到用一个变量来跟踪我们是否在一条正确的道路上,或者跟踪一个深度嵌套的控制流。所有这些模式都会使代码变得更加复杂,并降低可读性。

作者介绍


Ben Linders 是一位来自荷兰的敏捷、精益、质量和持续改进方面的独立顾问。他著有《从敏捷回顾中获得价值(Getting Value out of Agile Retrospectives)》、《Waardevolle 敏捷回顾(Waardevolle Agile Retrospectives)》、《是什么推动了质量(What Drives Quality)》、《敏捷自我评估游戏(The Agile Self-assessment Game)》、《问题?什么问题?(Problem? What Problem?)》以及《持续改进(Continuous Improvement)》。并且是许多敏捷辅导工具的创建者,例如敏捷自我评估游戏。作为一名顾问、教练和培训师,他通过部署有效的软件开发和管理实践来帮助组织。他专注于持续改进、协作和沟通以及专业发展,为客户提供商业价值。Ben 是敏捷、精益和质量网络的活跃成员,也是一位经常演讲和写作的人。他在一个双语博客(荷兰语和英语) 中分享自己的经验,并在 InfoQ 担任敏捷方面的编辑。可以通过 @BenLinders 在推特上关注他。


查看原文链接:

https://www.infoq.com/news/2024/11/programming-rules-guidelines/

2024-12-20 08:049115

评论

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

零代码应用搭建规范建议

明道云

加速数字化转型,天翼云携手央国企积蓄发展新动能

天翼云开发者社区

小令动态丨令牌云2022年度盘点

令牌云数字身份

盘点2022

软件测试/测试开发 | 接口测试中,请求超时该怎么办?

测试人

软件测试 自动化测试 接口测试 测试开发

再获认可!天翼云荣获“行业应用实践优秀合作伙伴”授牌

天翼云开发者社区

厉害了!天翼云位列中国医疗云基础设施服务市场榜首

天翼云开发者社区

培训学习前端开发技术好吗?

小谷哥

丢掉丑陋的 toast,会动的 toast 更有趣!

岛上码农

flutter ios 安卓 移动端开发 跨平台开发

参加前端培训班哪个好

小谷哥

“天翼云杯”决赛收官!看看你pick的队伍战绩如何?

天翼云开发者社区

将混沌实验内建到持续交付过程中提升系统稳定性

QE_LAB

混沌工程 混沌测试 测试技术

web前端培训课程怎么选择

小谷哥

IM通讯协议专题学习(八):金蝶随手记团队的Protobuf应用实践(原理篇)

JackJiang

网络编程 即时通讯 protobuf im开发

大公司为什么禁止SpringBoot项目使用Tomcat?

程序员大彬

Java springboot

100万条数据解读2023银行APP用户体验升级方向

易观分析

金融 手机银行

高效学 C++|函数参数的引用传递和函数重载

TiAmo

c++ 编程语言、

视觉大模型训练和推理加速

百度Geek说

人工智能 深度学习 transform 企业号 1 月 PK 榜

大数据培训课程哪家比较好

小谷哥

到底卡在了哪里,2023年再撒谎网慢就说不过去了

Yestodorrow

架构 可观测性 网站性能

复习前端:JavaScript 字符串操作方法

devpoint

JavaScript 前端开发 字符串处理

扪心自问,我们在用户旅程的投入有多匮乏?

Yestodorrow

百度百舸 · AI 异构计算平台,加速自动驾驶模型迭代

百度Geek说

人工智能 自动驾驶 企业号 1 月 PK 榜

如何打造一支有战斗力的团队?

石云升

极客时间 1月月更 技术领导力实战笔记

基于 std::variant 的运行时多态

SkyFire

c++ 多态

不过是享受了互联网的十年红利期而已。

why技术

Java 程序员 大学生

如何减少网站卡顿的代码级别详细文章

Yestodorrow

重新思考边缘负载均衡

俞凡

架构 netflix 大厂实践

数据可视化图表系列解析——雷达图

Data 探险实验室

数据分析 可视化 数据可视化 图表 可视化数据

架构5作业

梁山伯

BSN祝全体技术工作者新春快乐!

BSN研习社

北京有哪些java培训中心

小谷哥

如何使用编程规则和指南_编程语言_InfoQ精选文章