《代码整洁之道》-大师眼中的整洁代码是什么样

news2024/11/26 19:43:15

几个月前写了一篇文章“如何写出难以维护的代码”,从中能大概了解到不好维护的代码是什么样,有哪些坏味道,那肯定有人会反问,难以维护的代码见的太多了,也知道长什么样,但是对于好维护的代码是什么样的比较模糊,带着这个问题,本人读完了世界软件开发大师马丁的《代码整洁之道》这本书,来了解下大师眼中的整洁代码画像是什么样的,相信能给你带来不一样的理解和感悟。





关于整洁代码,没有明确的定义,有多少程序员就有多少种定义。下面先看下几位大师是如何定义的。

C++语言发明者 Bjarne Stroustrup 提到:

代码应该优雅高效,代码逻辑应该直截了当,让缺陷难以隐藏尽量减少依赖关系,便于维护;按照某种分层策略完善错误处理,性能调到最优,不会让别人修改的更混乱整洁的代码只做一件事



《面向对象分析与设计》一书作者 Grad Booch 提到:

整洁的代码简单直接,如同散文一样优美从不隐藏设计者的意图,代码抽象干净利落,控制语句直截了当。



Eclipse 战略教父 Dave Thomas 这么定义:

整洁的代码应可由其他开发者阅读和增补,应当有单元测试和验收测试,使用有意义的命名,只提供一种而非多种做一件事的途径,只有尽量少的依赖关系,而且要明确地定义和提供清晰、尽量少的 API。



《修改代码的艺术》一书作者 Michael Feathers 定义:

整洁代码应该是特别在意代码的人才能写出来的,几乎没有改进的余地,作者各种情况都想到了,如果你想改进它,总会回到原点,总会赞叹写代码的人的专心和认真。



《极限编程实施》作者 Ron Jeffries 提出整洁代码:

能通过所有测试,没有重复代码,代码能体现设计理念,尽量减少类,方法以及函数。



综合以上几位大师对整洁代码的定义阐述,可以归纳总结一下整洁代码的画像:

1.体现设计理念,这个整洁代码特性在以上大师的定义里面多次提到了,Grady 提到整洁代码不会隐藏设计意图,Ron 提到整洁代码一看就知道采用了什么样的设计理念。体现设计理念看上去有点虚,但是实际上我认为是最重要的一点,所谓代码即设计,只要能回答代码为什么这么写,就说明你的代码有设计思想在里面,即便一行代码都能体现出设计理念,比如一个有意义的命名也是设计的一种表现。

2.没有重复代码,如果你两处代码相同或者大部分重复,说明代码不够整洁,同时说明代码没有去做好设计。消除重复代码意味着减少类和方法以及相关 API。

3.代码只做一件事,很多代码由于想做太多事,目的不明确,意图混乱,结果代码变得很糟糕,代码只做一件事,也称单一职责,这个几乎是很多软件设计里面经常提到的一个警句,这个原则看似很简单,但是实际上执行起来不是那么简单,或者说,一时坚持这个原则很容易,难的是一直坚持这个原则,如果始终能践行这个原则,代码整洁度能达到质的飞跃。

4.代码好阅读,关于阅读,Bjarne 用“优雅”来形容,优雅意味着优美雅致,所以在他看来,代码应该优美,给人以愉悦感,Grad 也提到代码应该像散文一样优美,让阅读的人看完一段想看下一段,能很明显的展现出解决问题的表达力和张力,阅读者会不停的发出“啊哈,应该这样来处理!”的感叹。反之,如果代码不好阅读,阅读者看完后还需要猜测所表达的意思,对所实现的功能持怀疑态度,甚至有心惊胆战的心理,会在心里不停的反问:"不会吧,这都可以在线上运行?”我们在修改代码或写新代码之前都要阅读周边代码,如果阅读代码很难,则写代码也会很难,据统计读代码和写代码时间比例是 10:1,编写代码的难度,取决于读周边代码的难度。要想干得快,要想早点做完,要想轻松写代码,先让代码易读吧。

5.代码好修改,Dave 提到整洁代码应该可以让其他开发者进行增补,也就是很容易进行功能的增加,毕竟很多系统代码都要不停的迭代更新,需要基于原代码进行增补,所以代码的易修改就显得格外的重要,试想如果一个开发者写的代码别人没法修改或者不敢改,那你说这隐患有多大。我们经常嘴巴提到的系统可维护性,实际上说的更具体点,更多的指的是代码的可修改方面。



将以上 5 点整洁代码的画像总结一句话:



体现设计理念,代码不重复,只做一件事,好阅读和修改!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2124569.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

无人机+激光雷达:探索新技术应用场景

无人机与激光雷达技术的结合,为众多领域带来了前所未有的应用可能性和创新解决方案。以下是对无人机激光雷达技术的新应用场景的探索: 一、测绘与地理信息 1. 高分辨率数字表面模型(DSM)和地形模型(DTM)&…

关于科研性单位(用电环境)选择工业级插排插座的建议

实验室是科学研究与实验的重要场所,实验环境将直接影响到实验各项数据和结果的可靠性以及实验人员的安全。这类科研建筑内部的设计结构复杂,且有着不同功能类型的区域。根据工作活动的性质来划分不同区域,如:科研通用区&#xff0…

【Unity基础】如何选择脚本编译方式Mono和IL2CPP?

Edit -> Project Settings -> Player 在 Unity 中,Scripting Backend 决定了项目的脚本编译方式,即如何将 C# 代码转换为可执行代码。Unity 提供了两种主要的 Scripting Backend 选项:Mono 和 IL2CPP。它们之间的区别影响了项目的性能、…

小宝宝的好伙伴Baby Buddy

好友 Eduna 前天半夜告诉我,Docker 的下载已经恢复,又可以愉快的玩耍了,大家赶紧去试试吧~ 什么是 Baby Buddy ? Baby Buddy 是宝宝的好伙伴!能帮助宝爸、宝妈、及护理人员跟踪宝宝的睡眠、喂食、换尿布、趴着的时间等…

【单片机开发】单片机常用开发工具

【前言】 在嵌入式系统领域,单片机(Microcontroller, MCU)作为核心组件,广泛应用于智能家居、工业控制、汽车电子等众多领域。而单片机开发工具,则是开发者们实现创意、解决问题的重要助手。本文主要讲述目前主流的单…

Raid 卡--磁盘阵列卡

Raid卡的核心功能在于将多个物理硬盘组合成一个逻辑单元,即Raid阵列。这种组合方式并非简单的硬盘叠加,而是通过特定的算法和技术手段,实现数据的分散存储与并行处理。根据不同的Raid级别(如Raid 0、1、5、6等)&#x…

某red书最新版x-s、x-s-common(下)

本文继续某red书参数逆向,接下来是x-s-common,x-s的逆向过程请转战某red书最新版x-s、x-s-common(上) x-s-common就比较好找了,直接搜索就可以了 成功断住: 这里要注意了,断点是断在第二个x-s…

使用Nignx打包前端项目

项目打包 我们开发用的脚手架其实就是一个微型服务器,用于:支撑开发环境、运行代理服务器等。 打包完的文件中不存在:.vue、.jsx、.less等文件,而是:html、css、js等。 打包后的文件,不再借助脚手架运行…

WireShark分析localhost包

文章目录 需要npcap。 java 需要配置Npcap,如果没有需要卸载重新安装 Npcap 是专为 Windows 开发的一款网络抓包 SDK,该 SDK 提供了被应用程序调用的库文件和系统驱动程序。通过 Npcap,我们可以得到原始(raw)网络数据&…

灵活的参数传递:使用*args和**kwargs让类实例像函数一样调用

在Python的世界里,我们经常会遇到需要让类实例表现得像函数的场景。这不仅可以增强代码的灵活性,还能提高其可读性和可维护性。 通过一些巧妙的技巧,我们可以模拟函数的行为,让类实例在调用时表现得如同内置函数一样自然。本文将…

【大模型专栏—入门篇】科研数据与显卡使用

大模型专栏介绍 😊你好,我是小航,一个正在变秃、变强的文艺倾年。 🔔本文为大模型专栏子篇,大模型专栏将持续更新,主要讲解大模型从入门到实战打怪升级。如有兴趣,欢迎您的阅读。 &#x1f4…

神经网络的可解释性理论及工具

1.可解释性分析简介 explainable AI:why,利用决策树 eg: interpretable AI:how 2.机器学习的可解释性 解释工具: 按输入对输出的贡献值。 然后把值sigmoid成0-1. 例子: 就是去计算,有你和没你…

统计上升四元组

🌈个人主页:Yui_ 🌈Linux专栏:Linux 🌈C语言笔记专栏:C语言笔记 🌈数据结构专栏:数据结构 🌈C专栏:C 文章目录 1. 题目描述2. 解释3. DP前缀和枚举 1. 题目描…

# CentOS7 设置mysql的 root 用户密码时,报错 ERROR 1819(HY000)...ERROR1193... 解决方法。

CentOS7 设置mysql的 root 用户密码时,报错 ERROR 1819(HY000)…ERROR1193… 解决方法。 一、错误描述: mysql ALTER USER rootlocalhost IDENTIFIED BY 123; ERROR 1819 (HY000) Your password does not satisfy the current policy requirementsERRO…

基于SC04B触摸芯片实现的触摸按键方案

基于SC04B触摸芯片实现的触摸按键方案 随着科技的不断进步,触摸按键技术已经广泛应用于各种电子设备中。SC04B作为一种常见的触摸感应芯片,以其高性能、低成本、高灵敏度和易于集成的特点,在触摸按键方案中备受青睐。 SC04B触摸芯片特点 SC…

数据结构--串的模式匹配算法

文章目录 串的模式匹配算法1.朴素算法(Brute-Force(BF)暴力算法)BF算法分析 2.KMP算法字符串的最长公共前后缀部分匹配表(前缀表)Next 串的模式匹配算法 查找子串(模式串)在主串中的位置的操作通常称为串的…

NET8 MAUIBlazor发布用于windows应用

1.打开 PowerShell 终端 , 命令行进入工程目录,以我的例子工程为例 DOS命令:cd 项目名 2.复制窗口里面的 Thumbprint 下的指纹码, 例如我这个是E18EF79CF31104139F16BD2089F4AB1898D381C2 3.配置项目生成设置, 双击项目名称或者直接编辑 ltyj.C2.Cilent.csproj 文件 添加下面…

C语言操作符详解(13)

文章目录 前言一、二进制和进制转换2进制转10进制10进制转2进制2进制转8进制2进制转16进制 二、原码、反码、补码三、移位操作符左移操作符右移操作符 四、位操作符&^~一道奇葩的面试题一道练习题再来一个练习题 五、逗号表达式六、结构成员访问操作符结构体结构的声明结构…

汇编调用C库函数—printf、scanf和Win32API

RadASM: ;右键 -> 生成依赖项 -> 生成自定义 -> masm .586 .model flat,stdcall option casemap:noneinclude msvcrt.inc include Kernel32.inc include User32.incincludelib msvcrt.lib includelib Kernel32.lib includelib User32.libscanf proto c :ptr,:vararg …

Java 的Swing 之JFrame快速入门

3、讲原件添加到当前窗口当中 //讲原件添加到当前窗口当中 this.add(btnlong); this.add(btnreset); this.add(usertext); this.add(passtext); this.add(username); this.add(password); this.setVisible(true); 4、对对应按钮设置动作监听 btnlong.addActionListene…