写点什么

如何使用编程规则和指南

作者: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:049210

评论

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

三翼鸟,用两年开启下一个十年

脑极体

编译器优化丨Cache优化

华为云开发者联盟

后端 开发 华为云 12 月 PK 榜

白嫖GitHub Pages,轻松搭建个人博客

LigaAI

Hexo GitHub Pages 个人博客 个人网站 12 月 PK 榜

架构实战营模块1第1课 - 什么是架构,你理解对了么

净意

架构实战营

从React源码来学hooks是不是更香呢

goClient1992

React

星环科技数据中台解决方案,助力某政府机构建设新型智慧城市

星环科技

大数据培训程序员工作前景如何

小谷哥

java培训怎么学习才好?

小谷哥

雾霾对户外LED显示屏的考验

Dylan

LED LED显示屏 户外LED显示屏

一线大厂为什么面试必问分布式?

钟奕礼

Java 程序员 java面试 java编程

国内主流商业智能BI工具剖析

流量猫猫头

大数据

基于云原生的火山引擎边缘云应用与实践

火山引擎边缘云

分布式 云原生 边缘计算 节点 火山引擎边缘计算

SEAL 0.3 正式发布:国内首个全链路软件供应链安全管理平台

SEAL安全

安全 全链路 软件供应链 SEAL

刘德华在线演唱会,火山引擎边缘云助力打造极致视频直播体验

火山引擎边缘云

云原生 边缘计算 节点 火山引擎边缘计算

火山引擎DataTester揭秘:字节如何用A/B测试,解决增长问题的?

字节跳动数据平台

大数据 AB testing实战 12 月 PK 榜

技术内幕 | 阿里云EMR StarRocks 极速数据湖分析

StarRocks

#数据库

一张「有想法」的表单,玩出线上填表新花样

爱科技的水月

结合RocketMQ 源码,带你了解并发编程的三大神器

华为云开发者联盟

RocketMQ 开发 华为云 12 月 PK 榜

从React源码分析看useEffect

goClient1992

React

前端培训学习程序员如何提高解决问题的能力

小谷哥

大数据培训学习程序员还好找吗

小谷哥

【JUC】交换器Exchanger详解

JAVA旭阳

Java JUC

前端培训没有基础应该怎么学习

小谷哥

手把手教你成为荣耀开发者:账户结算操作指南

荣耀开发者服务平台

android 开发者 手机 荣耀 honor

BSN-DDC基础网络DDC SDK详细设计(七):数据解析

BSN研习社

BSN-DDC

解读数仓中的数据对象及相关关系

华为云开发者联盟

数据库 后端 华为云 数据对象 12 月 PK 榜

从React源码角度看useCallback,useMemo,useContext

goClient1992

React

在一次又一次的失败中,我总结了这份万字的《MySQL性能调优笔记》

钟奕礼

Java 程序员 java面试 java编程

云原生应用的最小特权原则

HummerCloud

k8s rbac 云原生安全

译文 | A poor man's API

API7.ai 技术团队

API APISIX RESTful API

【11.25-12.02】写作社区优秀技术博文回顾

InfoQ写作社区官方

热门活动

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