写点什么

如何使用编程规则和指南

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

评论

发布
暂无评论

TE数字化共创之路 | 这场旅程,从数字化共创平台开始

明道云

超新概念出炉,JDK17的封闭类使用解析

知识浅谈

8月月更

Java技术专家成长路线总结(思维导图)

程序猿阿宇

Java java程序员 大厂面试 秋招 大厂面经

知乎疯传,吹爆阿里P7《K8s+Jenkins》的技术手册

程序知音

Java 编程 程序员 后端技术 #k8s

废除“网络君主制”,认识 Usenet ~

掘金安东尼

前端 网络 8月月更

STM32入门开发 编写DS18B20温度传感器驱动(读取环境温度、支持级联)

DS小龙哥

8月月更

千万级学生管理系统的考试试卷存储方案

张立奎

【云原生】Spring Cloud Alibaba 之 Feign 远程调用 实战

Bug终结者

分布式 微服务 云原生 8月月更

史上最全499道Java面试题:JVM+分布式+算法+锁+MQ+微服务+数据库

冉然学Java

Java 数据库 面试 算法 多线程

【LeetCode】检查数组是否存在有效划分Java题解

Albert

LeetCode 8月月更

PyCharm 2022.2 发布了,支持最新 Python 3.11 和 PyScript 框架!

Python猫

史上最全的Java并发系列之Java中的线程池

自然

线程池 并发 8月月更

Kubernetes宕机切换源码分析

黄继承

源码分析 kubelet Kubernetes 集群 宕机

MySQL 原理与优化:意向锁,IS,IX

老崔说架构

应用系统日志打印规范实践之道

陈俊

日志 规范

JSON 基本使用

兮动人

json

React Server Components 介绍 亮点

HullQin

CSS JavaScript html 前端 8月月更

SpringCloud OpenFeign 请求重试

程序知音

Java spring 程序员 微服务 SpringCloud

开源一夏|OpenHarmony视频播放器

坚果

开源 OpenHarmony 8月月更

Vue讲解系列- - -Nginx和Postman讲解

叶秋学长

Vue 8月月更

Go-Excelize API源码阅读(九)——SetSheetBackground(sheet, picture string)

Regan Yue

Go 开源 源码解读 8月日更 8月月更

3-6月面经总结,200多页真题笔记和详解(含核心考点及6家大厂)

程序猿阿宇

Java java程序员 大厂面试 秋招 大厂面经

大逆不道,从天界偷下来的算法修仙秘籍竟然传到你手上~~(结尾有彩蛋)

武师叔

数据结构与算法 有趣的技术知识 复杂度分析 签约计划第三季 8月月更

五分钟搞定YAML

俞凡

云原生 yaml

C++运算符重载(五)之关系运算符重载

CtrlX

c c++ C# 重载 8月月更

美团二面:如何解决 bin log 与 redo log 的一致性问题

飞天小牛肉

签约计划第三季

体验家辛济云:CEM不是MarTech,不仅要“从0到1”,更要规避“从1到0”

B Impact

史上最全的Java并发系列之Java中的锁的使用和实现介绍(二)

自然

多线程 并发 8月月更

如何正确理解Java领域中的多线程模型,主要用来解决什么问题?

PivotalCloud

计算机网络知识点全面总结(一篇全懂)

C++后台开发

网络编程 计算机网络 网络协议 底层原理 C/C++开发

95后跳槽阿里网晒工资条:多亏面试前补了这个,真香

程序猿阿宇

Java java程序员 大厂面试 大厂面经 内推

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