如何写出让同事骂娘的代码?教你20个小妙招

在 GitHub 上有一个项目,它描述了「最佳垃圾代码」的十九条关键准则。从变量命名到注释编写,这些准则将指导你写出最亮眼的烂代码。

为了保持与原 GitHub 项目一致的风格,下文没有进行转换。读者们可以以相反的角度来理解所有观点,这样就能完美避免写出垃圾代码。

项目地址:https://github.com/trekhleb/state-of-the-art-shitcode

当然,以下十九条垃圾代码书写准则并没有面面俱到,如果读者们发现有一些难以忍受的烂代码习惯,也可以发表你的看法。

💩 第一条:打字越少越好

如果我们键入的东西越少,那么就有越多的时间去思考代码逻辑等问题。如下所示,「Good」表示遵循该规则的示例,Bad 表示没遵循该规则的示例。

Good 👍🏻

let a = 42;

Bad 👎🏻

let age = 42;

💩 第二条:变量/函数混合命名风格

我们需要混合命名方法与变量,这样才能体现命名的多样性。

Good 👍🏻

let wWidth = 640;
let w_height = 480;

Bad 👎🏻

let windowWidth = 640;
let windowHeight = 480;

💩第三条:不要写注释

反正代码都看得懂,为什么要写注释?或者说,反正没人看我的代码,为什么要写注释?

Good 👍🏻

const cdr = 700;

Bad 👎🏻

More often comments should contain some ‘why’ and not some ‘what’. If the ‘what’ is not clear in the code, the code is probably too messy.

// The number of 700ms has been calculated empirically based on UX A/B test results.
// @see: <link to experiment or to related JIRA task or to something that explains number 700 in details>
const callbackDebounceRate = 700;

💩第四条:使用母语写注释

如果你违反了第三条规则,那么至少写注释需要用你的母语或者其它语言。如果你的母语是英语,那么你也算违反了这条规则。既然编程语言绝大多数都是用英文,那么为什么不用其它语言注释一下?

Good 👍🏻

// Закриваємо модальне віконечко при виникненні помилки.
toggleModal(false);

Bad 👎🏻

// Hide modal window on error.
toggleModal(false);

💩第五条:尽可能混合不同的格式

同样,为了代码的多样性,我们需要尽可能混合不同的格式,例如单引号或双引号。如果它们的语义相同,那就应该混用。

Good 👍🏻

let i = ['tomato', 'onion', 'mushrooms'];
let d = [ "ketchup", "mayonnaise" ];

Bad 👎🏻

let ingredients = ['tomato', 'onion', 'mushrooms'];
let dressings = ['ketchup', 'mayonnaise'];

💩第六条:尽可能把代码写成一行

如果一系列参数与方法都是一起实现的,那么代码也要写在一起。

Good 👍🏻

document.location.search.replace(/(^\?)/,'').split('&').reduce(function(o,n){n=n.split('=');o[n[0]]=n[1];return o},{})

Bad 👎🏻

document.location.search.replace(/(^\?)/, '').split('&').reduce((searchParams, keyValuePair) => {keyValuePair = keyValuePair.split('=');searchParams[keyValuePair[0]] = keyValuePair[1];return searchParams;},{}
)

💩第七条:发现错误要保持静默

当你发现某些错误时,其他人不需要了解它,因此不需要打印出日志或 Traceback。

Good 👍🏻

try {// Something unpredictable.
} catch (error) {// tss... 🤫
}

Bad 👎🏻

try {// Something unpredictable.
} catch (error) {setErrorMessage(error.message);// and/orlogError(error);
}

💩第八条:广泛使用全局变量

使用全局变量,是面向「全球化」不可或缺的部分。

Good 👍🏻

let x = 5;function square() {x = x ** 2;
}square(); // Now x is 25.

Bad 👎🏻

let x = 5;function square(num) {return num ** 2;
}x = square(x); // Now x is 25.

💩第九条:构建备用变量

以防万一,我们需要创建一些备用变量,在需要时随时调用它们。

Good 👍🏻

function sum(a, b, c) {const timeout = 1300;const result = a + b;return a + b;
}

Bad 👎🏻

function sum(a, b) {return a + b;
}

💩第十条:Type 使用需谨慎

一般不要指定变量类型或者经常做类型检查,无类型才是最好的类型。

Good 👍🏻

function sum(a, b) {return a + b;
}// Having untyped fun here.
const guessWhat = sum([], {}); // -> "[object Object]"
const guessWhatAgain = sum({}, []); // -> 0

Bad 👎🏻

function sum(a: number, b: number): ?number {// Covering the case when we don't do transpilation and/or Flow type checks in JS.if (typeof a !== 'number' && typeof b !== 'number') {return undefined;}return a + b;
}// This one should fail during the transpilation/compilation.
const guessWhat = sum([], {}); // -> undefined

💩第十一条:准备「Plan B」

你需要准备一些运行不到的代码(unreachable code),它们可以作为你的「Plan B」。

Good 👍🏻

function square(num) {if (typeof num === 'undefined') {return undefined;}else {return num ** 2;}return null; // This is my "Plan B".
}

Bad 👎🏻

function square(num) {if (typeof num === 'undefined') {return undefined;}return num ** 2;
}

💩第十二条:嵌套的三角法则

如果代码有一些嵌套结构,或者说缩进空行的结构,三角法则是最漂亮的。

Good 👍🏻

function someFunction() {if (condition1) {if (condition2) {asyncFunction(params, (result) => {if (result) {for (;;) {if (condition3) {}}}})}}
}

Bad 👎🏻

async function someFunction() {if (!condition1 || !condition2) {return;}const result = await asyncFunction(params);if (!result) {return;}for (;;) {if (condition3) {}}
}

💩第十三条:混合缩进

我们需要避免采用缩进,因为缩进会使复杂代码在编辑器中占用更多的空间。如果一定要采用缩进,那么就使用混合缩进策略。当然,这种策略在 Python 中是行不通的,因为它靠缩进来确定代码结构。

Good 👍🏻

const fruits = ['apple','orange', 'grape', 'pineapple'];const toppings = ['syrup', 'cream', 'jam', 'chocolate'];
const desserts = [];
fruits.forEach(fruit => {
toppings.forEach(topping => {desserts.push([
fruit,topping]);});})

Bad 👎🏻

const fruits = ['apple', 'orange', 'grape', 'pineapple'];
const toppings = ['syrup', 'cream', 'jam', 'chocolate'];
const desserts = [];fruits.forEach(fruit => {toppings.forEach(topping => {desserts.push([fruit, topping]); });
})

💩第十四条:不要锁住依赖项

每一次要安装新库时,更新已有的依赖项。为什么要维持之前的版本呢,我们需要时刻保持最新的第三方代码库。

Good 👍🏻

$ ls -lapackage.json

Bad 👎🏻

$ ls -lapackage.json
package-lock.json

💩第十五条:始终将布尔值命名为 flag

为同事留出空间来思考布尔值的含义

不错👍🏻

let flag = true;

不好👎🏻

let isDone = false;
let isEmpty = false;

💩第十六条:长函数比短函数好

不要将程序整体逻辑分割为一些代码块,要是 IDE 突然不行了,它找不到必要的文件或函数怎么办。因此把代码写在一个主体函数中,并且不再维护额外的函数导入或代码文件,那么这样的方法是最稳定的。

单个文件一万行代码是没问题的,单个函数一千行代码也是没问题的。

💩第十七条:代码不需要做特定测试

这些测试通常是重复且无意义的工作。

💩第十八条:尽量避免重复代码

按你的想法写代码,尤其是在小团队中,毕竟这是「自由」准则。

💩第十九条:构建新项目不需要 README 文档

在项目前期,我们可以暂时保持这种状态。

💩第二十条:保存不必要的代码

在写代码的过程中,经常会产生很多测试代码。这些代码也是非常重要的资料,因此不能删除掉,最多只能注释掉。

来源 | 机器之心 | Jack-Cui

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

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

相关文章

django根据时间(年月日)动态修改表名--方法二

方法一&#xff1a; 第一步&#xff1a;在models创建一个类&#xff0c;里边存放数据表中需要的字段&#xff0c;如下 class TemplateModel(models.Model):NowTime models.CharField(max_length5)name models.CharFiedld(max_length5)class Meta:abstract True # 基础类设…

每日一题 第三期 洛谷 国王游戏

[NOIP2012 提高组] 国王游戏 题目描述 恰逢 H 国国庆&#xff0c;国王邀请 n n n 位大臣来玩一个有奖游戏。首先&#xff0c;他让每个大臣在左、右手上面分别写下一个整数&#xff0c;国王自己也在左、右手上各写一个整数。然后&#xff0c;让这 n n n 位大臣排成一排&…

<video>标签相关属性

src&#xff1a;指定视频文件的URL。 autoplay&#xff1a;如果设置该属性&#xff0c;视频将在页面加载后自动播放。请注意&#xff0c;一些浏览器可能会因为用户体验的考虑而忽略此属性。 controls&#xff1a;添加此属性将在视频上显示播放、暂停和音量控制等标准控件。 …

C#制作软件时窗体的弹出与嵌入

文章目录 一、窗体的弹出二、窗体的嵌入 一、窗体的弹出 这里面我们以Windows窗体应用程序为例&#xff0c;这里面达到的效果如下&#xff1a; 点击指定按钮&#xff0c;弹出目标窗口。接下来我们看具体操作&#xff1a; 这是我们的主窗体&#xff1a; 接下来我们需要在这个…

Stable Diffusion 模型下载:Juggernaut(主宰、真实、幻想)

本文收录于《AI绘画从入门到精通》专栏&#xff0c;专栏总目录&#xff1a;点这里。 文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八 下载地址 模型介绍 该模型是一个真实模型&#xff0c;并且具有幻想和创意色彩。 作者述&#xff1a;我选取了…

Oracle Linux 8.9 安装 Postman

Oracle Linux 8.9 安装 Postman 1. 安装 Postman2. 启动 Postman 1. 安装 Postman Install epel, sudo dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm sudo dnf upgraderefer: https://snapcraft.io/docs/installing-snap-on-red-hat…

RabbitMQ备份交换机与优先级队列

1. 备份交换机 备份交换机可以理解为 RabbitMQ 中交换机的“备胎”&#xff0c;当我们为某一个交换机声明一个对应的备份交换机时&#xff0c;就是为它创建一个备胎&#xff0c;当交换机接收到一条不可路由消息时&#xff0c;将会把这条消息转发到备份交换机中&#xff0c;由备…

1. 用两种方式在springboot项目中实现适配器模式

文章目录 用两种方式在springboot项目中实现适配器模式1. 场景2. 方式1&#xff0c;通过实现类定义类型字段实现2.1 创建接口2.2 创建mysql实现类2.3 创建oracle实现类2.4 创建接口,在接口中注入service集合&#xff0c;根据每个实现类中定义的dbType进行匹配后进行调用2.5 测试…

幼猫咬不动猫粮该怎么办?

亲爱的猫友们&#xff0c;遇到幼猫咬不动猫粮的情况&#xff0c;是不是很让人着急呢&#xff1f;别担心&#xff0c;让我们一起来探讨一下解决这个问题的方法。&#x1f431;&#x1f35a; 首先&#xff0c;我们得理解幼猫的牙齿和消化系统发育还不够成熟&#xff0c;所以咬不动…

算法刷题day30:递归

目录 引言一、有序分数二、正则问题三、带分数四、约数之和 引言 本篇文章主要讲了递归的一些题型&#xff0c;递归也是一种思想&#xff0c;主要是在各种题中显现这种思想&#xff0c;你必须要脑子里能够清楚它大概的一种路线是怎样的&#xff0c;或者说要抽象出来它的功能是…

Arduino ESP8266 SSD1306 硬件I2C+LittleFS存储GBK字库实现中文显示

Arduino ESP8266 SSD1306 硬件I2C+LittleFS存储GBK字库实现中文显示 📍相关篇《Arduino esp8266 软件I2C SSD1306 +LittleFS存储GBK字库实现中文显示》 🌼显示效果: ✨将部分函数重构,和上面相关篇的软件I2C通讯相关接口函数移植过来,除了汉字显示采用自己写的API函数外…

使用 ReclaiMe Pro 恢复任意文件系统(Win/Linux/MacOS)

天津鸿萌科贸发展有限公司是 ReclaiMe Pro 数据恢复软件授权代理商。 ReclaiMe Pro 是一个通用工具包&#xff0c;几乎可以用于从所有文件系统&#xff08;从 Windows 系列文件系统、Linux 和 MacOS&#xff09;中恢复数据。此外&#xff0c;考虑到数据恢复工作的具体情况&…

如何实现Git Push之后自动部署到服务器?

在平时个人开发的过程中是不是有这样的烦恼&#xff1a; 项目开发完成&#xff0c;Push之后 登录服务器&#xff0c;手动git pull&#xff0c;然后运行部署命令 这真的很烦诶&#xff01; 那么能不能Git push之后&#xff0c;远端服务器自动 Git pull 然后运行部署命令呢&a…

2023行政区域

几乎所有业务系统&#xff0c;都会涉及行政区域。国家统计局 官网上公开了所有的区域编码&#xff0c;一年一更新。但只能在线查看&#xff0c;没有提供完整数据库下载的连接。为此&#xff0c;我编写了一个简陋的 python 脚本&#xff0c;抓取了近几年的数据&#xff0c;供大家…

ctf杂项总结

1.文件无法打开 1.1.文件拓展名损坏/错误导致 方法&#xff1a; 1.使用kali当中的file命令查看&#xff0c;之后修改为正确的后缀即可 2.通过16进制编辑器打开查看文件头 3.文件头残缺/错误&#xff0c;可以先使用kail当中的file命令查看它的类型&#xff0c;之后再通过 16…

C# EPPlus导出dataset----Excel2绘制图像

一、生成折线图方法 /// <summary> ///生成折线图 /// </summary> /// <param name="worksheet">sheet页数据 </param> /// <param name="colcount">总列数</param> /// &l…

(每日持续更新)jdk api之StreamCorruptedException基础、应用、实战

博主18年的互联网软件开发经验&#xff0c;从一名程序员小白逐步成为了一名架构师&#xff0c;我想通过平台将经验分享给大家&#xff0c;因此博主每天会在各个大牛网站点赞量超高的博客等寻找该技术栈的资料结合自己的经验&#xff0c;晚上进行用心精简、整理、总结、定稿&…

vue-vben-admin的编译运行

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 更多nbcio-boot功能请看演示系统RuoYi-Nbcio亿事达企业管理平台 gitee源代码地址 后端代码&#xff1a;…

变量的本质和命名规则

变量的本质 内存:计算机中存储数据的地方&#xff0c;相当于一个空间变量本质:是程序在内存中申请的一块用来存放数据的小空间 变量命名规则与规范 规则: 不能用关键字 关键字:有特殊含义的字符&#xff0c;JavaScript 内置的一些英语词汇。例如:let、var、if、for等>只…

Jenkins入门指南:自动化构建与部署的艺术

概要&#xff1a; 本篇博客旨在为新手提供一个全面、易懂的Jenkins入门指南。我们将从Jenkins的基本概念讲起&#xff0c;逐步深入到安装、配置、以及如何使用Jenkins来自动化软件的构建、测试和部署过程。内容将涉及Jenkins的核心功能&#xff0c;插件管理&#xff0c;以及与…