好/坏代码实例解读:图文并茂说明

我曾经在某处读到过一句话,基本上有以下内容:

现代世界许多人的生活都依赖于软件,例如控制大型商用客机飞行系统的软件,但软件开发领域大多不受监管。任何人都可以成为自学成才的软件开发人员,并且没有像其他高风险职业(例如摩天大楼或神经外科)那样的认证或严格要求。这是一个危险的不受监管的领域,因为根据具体情况,几行不良代码就可能导致生命损失。

我似乎记得这是在某种主流出版物上。我猜,这篇文章的主题是“当心坏代码,它会杀死你,哦,但等等,它是看不见的,所以没关系!对于读者来说,这无疑是一个令人欣慰的信息,你不觉得吗?回想起来,这篇文章似乎只是试图耸人听闻,在越来越多的飞机、火车和自动驾驶汽车中潜伏着“坏代码”的存在,从而增加读者群。

那么,作为外行,什么是“Bad Code”呢?

作为一个每天花大约 5 小时编写、审查和重构代码(意思是,以更简洁和可用的方式重写)的人,我知道什么是代码(以及什么是坏代码,相信你我!我有时会忽视这样一个事实,即许多人对代码是什么没有概念。

对于这些人,我对“您是一名程序员,您是做什么的”这个问题提供以下答案:

我建造了小门口的微小组件,它们以各种方式和各种配置打开和关闭。当门口打开时,电子可以通过,当门口关闭时,电子被阻挡。由于门口太小,无法手工建造,我必须用我的电脑来建造它们。根据我在电脑中输入的单词,它会代表我构建各种类型的小门。

毫无疑问,正如上面的答案所说,软件开发人员 / 编码人员 / 程序员实际上是在构建具有物理存在的东西,但太小而看不到(但是,可以将其设想为组件或一组小门口)。这本身就已经够疯狂了,但如果你至少能想象到这一点,你已经对 “编码” 有了概念上的理解,那么恭喜你!但回到本节标题中的问题 — 什么是“代码”?

按照我们的小门口的微小集合的类比,我会说糟糕的代码意味着你有太多的门口,以不必要的重复复杂的方式排列。

由于这很难用门口的类比来形象化或进一步解释,因此在这一点上,我想提供另一个类比,如下所述。

为我制作一个旋钮转动器!

假设我们想构建一个旋钮转动器。一个可以旋转的旋钮,它反过来会旋转远程位置的另一个旋钮。产品要求如下所示。转动一个旋钮,一段距离外的另一个旋钮也会转动:

dce8989dbed017b9f3f25a1f091fa776.jpeg

这就是我们需要的系统 — 一个转动另一个旋钮的旋钮。

Bad Code 只考虑手头的问题,并提出最简单的解决方案 — 一个旋钮和一个旋钮转动器,由半柔性杆连接。Bad Code 在这个早期阶段赢得了 Occam’s razor 奖。好的代码乍一看似乎有点矫枉过正,它使用了一条橡胶带和 2 个轮子。

8a9426174f51273bdb17b0288e2b1e38.jpeg

要求变更!旋钮将被重新定位!

正如开发周期中经常发生的那样,在某个时候,客户需求会发生变化。在我们这里的类比中,客户现在想要一个旋钮转动器,它可以将另一个位于原始旋钮前方和侧面的旋钮旋转,如下所示:

24f22eb08fb47b73710b4a0701c4de7d.jpeg

坏代码需要添加一些 jerry-rigged 组件,使整个系统更加不稳定,容易出现故障。当有新需求时,好的代码只需要稍作调整,只需使用更长的橡胶带即可解决此问题。

dc9f023344919059cd1977842753dd97.jpeg

要求变更!旋钮需要转动得慢一点!

最后,我们的客户决定他们希望旋钮以不同的速率转动。小转动输入旋钮应导致连接的旋钮大转动。

鉴于这一新要求,不良代码需要向系统添加更多组件,使其更加复杂。另一方面,好的代码也只需要稍微调整一下,在连接的旋钮侧使用一个更大的轮子:

e4248393da9f73c837f852437f06e240.jpeg

两个插件和一根形状有趣的杆?谁在维护你,坏代码?

类比后记:那又怎样?

如上所示,当需求简单时,好的代码通常看起来有点矫枉过正,但当客户需求发生变化时(就像他们总是这样做一样),那么它就会真正闪耀。换句话说,它可以很好地扩展和变化。另一方面,糟糕的代码看起来很简单,对于简单的问题来说很好,但当系统发生变化或复杂性增加时,它就会成为一场噩梦。

但也许你在想,“嗯,上面概述的两个系统都达到了相同的结果——旋钮转动器在任何一种情况下都能成功工作。

这是真的 — 对于单独编码或业余项目来说很好。上帝知道我已经写了数万行糟糕的代码(就我而言是普通 JS),但没关系,因为我从来不需要维护代码或以任何方式添加代码。代码有效,我部署了它,并且从未回头。

然而,专业编码本质上是一项协作努力,无论您编写什么代码,无论是现在还是将来,其他编码人员无疑都会不断阅读和编辑。如果代码尽可能易于理解,这些编码人员将拥有更轻松、更高效的工作日。

  1. 这是我们的旋钮旋转器,它由 2 个轮子和一条皮带组成”,或者
  2. 这是固定连杆的插件,这是连杆,你必须把它的一端放进另一个插件的一个小孔里……”

作为一名初级开发人员,更愿意听到哪一个?:)

常见问答(FAQ)

1.什么是好代码?

好代码通常指可读性高、逻辑清晰、易于维护和扩展的代码。它遵循编码规范,减少复杂度,使得其他开发者能够轻松理解和修改。

2.什么是坏代码?

坏代码往往结构混乱、命名不清晰、不易维护,并且缺乏注释或逻辑不直观。这类代码可能完成功能,但后续修改或调试困难,增加开发成本。

3.好代码与坏代码的区别是什么?

好代码通常具备清晰的逻辑结构、简洁的代码量和可读性强的命名,而坏代码则可能包含冗长的代码、不合理的结构或不规范的命名,使代码难以理解和修改。

4.为什么好代码重要?

好代码减少了出错率,提高了开发和维护的效率,使团队成员更容易协作和扩展功能,降低项目长期维护的成本。

5.非程序员如何判断代码的好坏?

非程序员可以从代码的结构、注释和命名来看。一段代码如果结构清晰、注释明确且变量命名合理,则往往是好代码;反之则可能是坏代码。

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

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

相关文章

python爬虫——Selenium的基本使用

目录 一、Selenium的介绍 二、环境准备 1.安装Selenium 2.安装WebDriver 三、元素定位 1.常用定位元素的方法 2. 通过指定方式定位元素 四、窗口操作 1.最大化浏览器窗口 2.设置浏览器窗口大小 3.切换窗口或标签页 切换回主窗口 4. 关闭窗口 关闭当前窗口 关闭所…

Mkdm的51单片机学习日记:实时时钟DS1302

15.2 SPI时序初步认识 单片机常用的通信协议有三种:SPI,UART,I2C SPI:Serial Peripheral Interface 串行外围设备接口,是一种全双工,同步的通信总线 常用于单片机与EEPROM,FLASH,…

如何使用JMeter进行性能测试的保姆级教程

性能测试是确保网站在用户访问高峰时保持稳定和快速响应的关键环节。作为初学者,选择合适的工具尤为重要。JMeter 是一个强大的开源性能测试工具,可以帮助我们轻松模拟多用户场景,测试网站的稳定性与性能。本教程将引导你通过一个简单的登录场…

w~自动驾驶合集6

我自己的原文哦~ https://blog.51cto.com/whaosoft/12286744 #自动驾驶的技术发展路线 端到端自动驾驶 Recent Advancements in End-to-End Autonomous Driving using Deep Learning: A SurveyEnd-to-end Autonomous Driving: Challenges and Frontiers 在线高精地图 HDMa…

数据结构 - 散列表,初探

今天我们继续学习新的数据结构-散列表。 01定义 我们先来了解一些常见概念名词解释。 散列:散列表的实现叫做散列,是一种实现以常数级时间复杂度执行查找、插入和删除的技术; 散列值:通过散列函数对输入值(key&…

前端零基础入门到上班:【Day2】开发环境VSCode安装

VSCode 安装教程:图文保姆教程 引言 在前端开发中,选择合适的代码编辑器是提高工作效率的重要一步。Visual Studio Code(简称 VSCode)作为一款强大的开源编辑器,因其简洁易用、功能强大、扩展性好而广受开发者喜爱。…

Python 协程详解----高性能爬虫

目录 1.基本概念 asyncio和async的关系 asyncio async & await关键字 协程基本语法 多任务协程返回值 案例1 协程在爬虫中的使用 aiohttp模块基本使用 协程案例-扒光一部小说需要多久? 操作数据库 异步redis 异步MySQL 案例2: 知识星球 | 深度连接…

Java篇图书管理系统

目录 前言 一. 图书管理系统的核心 二. 图书管理系统基本框架 2.1 book包 2.1.1 Book(书籍类) 2.1.2 Booklist (书架类) 2.2 user包 2.2.1 User类 2.2.2 Administrator(管理员类) 2.2.3 Visitor(用户类) 2.…

基于Python大数据的王者荣耀战队数据分析及可视化系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…

Mybatis-03.入门-配置SQL提示

一.配置SQL提示 目前的Springboot框架在mybatis程序中编写sql语句并没有给到任何的提示信息,这对于开发者而言是很不友好的。因此我们需要配置SQL提示。 配置SQL提示 这样再去写SQL语句就会有提示了。 但是会发现指定表名时并没有给出提示。这是因为&#xff1a…

【综述整理】2015年至2022年图像美学质量评估数据集【附下载链接】

文章目录 2012年-美学数据集AVA-25万-MOS1~10数据集介绍 2015年-移动设备拍摄CLIVE-1K-MOS1~5数据集介绍 2016年-美学数据集AADB-10K-MOS1~10综述摘要 2017年-美学数据集FLICKR-AES-MOS1~5数据集介绍 2018年-户外自然场景KonIQ-10K-MOS1~5数据集介绍标签MOS,1-5分 2…

信息安全工程师(72)网络安全风险评估概述

前言 网络安全风险评估是一项重要的技术任务,它涉及对网络系统、信息系统和网络基础设施的全面评估,以确定存在的安全风险和威胁,并量化其潜在影响以及可能的发生频率。 一、定义与目的 网络安全风险评估是指对网络系统中存在的潜在威胁和风险…

记一次:使用使用Dbeaver连接Clickhouse

前言:使用了navicat连接了clickhouse我感觉不太好用,就整理了一下dbeaver连接 0、使用Navicat连接clickhouse 测试连接 但是不能双击打开,可是使用命令页界面,右键命令页界面,然后可以用sql去测试 但是不太好用&#…

LeetCode_231. 2 的幂_java

1、题目 231. 2 的幂https://leetcode.cn/problems/power-of-two/ 给你一个整数 n,请你判断该整数是否是 2 的幂次方。如果是,返回 true ;否则,返回 false 。 如果存在一个整数 x 使得 n ,则认为 n 是 2 的幂次方…

6.1 特征值介绍

一、特征值和特征向量介绍 本章会开启线性代数的新内容。前面的第一部分是关于 A x b A\boldsymbol x\boldsymbol b Axb:平衡、均衡和稳定状态;现在的第二部分是关于变化的。时间会加入进来 —— 连续时间的微分方程 d u / d t A u \pmb{\textrm{d}…

CTF--Misc题型小结

(萌新笔记,多多关照,不足之处请及时提出。) 不定时更新~ 目录 密码学相关 文件类型判断 file命令 文件头类型 strings读取 隐写术 尺寸修改 文件头等缺失 EXIF隐写 thumbnail 隐写 文件分离&提取 binwalk foremo…

索引的使用和优化

索引就是一种快速查询和检索数据的数据结构,mysql中的索引结构有:B树和Hash。 索引的作用就相当于目录的作用,我么只需先去目录里面查找字的位置,然后回家诶翻到那一页就行了,这样查找非常快, 创建一个表结…

短视频矩阵系统源码开发优势,短视频矩阵系统oem部署

短视频矩阵系统就是在多个短视频平台上构建自己的内容生态,通过多平台、多账号、多内容的运营策略,实现品牌曝光、用户引流、产品销售等目的。短视频矩阵的核心在于通过矩阵式的布局,实现资源优化配置和利用,提升企业市场竞争力。…

.Net 8 Web API CRUD 操作

本次介绍分为3篇文章: 1:.Net 8 Web API CRUD 操作https://blog.csdn.net/hefeng_aspnet/article/details/143228383 2:在 .Net 8 API 中实现 Entity Framework 的 Code First 方法https://blog.csdn.net/hefeng_aspnet/article/details/1…

【C++干货篇】——类和对象的魅力(四)

【C干货篇】——类和对象的魅力(四) 1.取地址运算符的重载 1.1const 成员函数 将const修饰的成员函数称之为const成员函数,const修饰成员函数放到成员函数参数列表的后面。const实际修饰该成员函数隐含的this指针(this指向的对…