Redian新闻
>
这些代码,差点把我气出内伤!

这些代码,差点把我气出内伤!

公众号新闻

先问大家一个小问题:你觉得看别人代码累,还是自己写代码累?

我相信有很多朋友会说,当然是自己写代码累了,要思考逻辑、要动手敲键盘,身心俱疲啊;但是,如果你需要经常阅读别人的代码,尤其是烂代码,答案就不一定了。

因为自己写代码,逻辑是自己来梳理的,代码自己是熟悉的;但是看别人的代码,你就要去理解别人的代码逻辑,再加上烂代码的加持,可能很简单的逻辑,你都得看半天才能懂。所以很多大佬在面对前人的 “屎山” 项目时,宁愿自己重写,也不去读烂代码。

举个夸张的例子:让你实现 1 + 1 的求和。

自己写:

let sum = 1 + 1;

某烂代码可能是:

let a = {};
let b = {};

a.toString = function() {
  return 1;
};

b.valueOf = function() {
  return "1";
};

let sum = a + b;

把简单的逻辑搞复杂,便是绝大多数程序员的拿手好戏。

看了很多代码,其中有一些真的是让我哭笑不得。下面给大家分享一些代码片段出来,希望大家不要学习 。

1、过于抽象的命名

还记得咱们刚学编程的时候,变量的命名都是用的 abcdefg。

自学时这么写完全没问题,但是在实际项目中,如果还用过于抽象的命名,那就不太合适了。

比如下面这段,大家能看懂是什么意思么?

const [l, setL] = useState<boolean>(false);
const [d, setD] = useState<any>();

但如果稍微完善下命名呢?

const [loading, setLoading] = useState<boolean>(false);
const [data, setData] = useState<any>();

很多同学应该立刻能看懂了,一个是 “加载中” 的变量,一个是 “存储数据” 的变量。

最好的代码应该是不用写注释的,因为代码即注释 。如果你能把命名做到 “见名知义”,看代码的人会极度舒适。

2、有深度的代码

比如下面这段:

if (condition1) {
  // 逻辑 A
  if (condition2) {
    // 逻辑 B
    if (condition3) {
      // 逻辑 C
      if (condition4) {
        // 逻辑 D
      }
    }
  }
}

这里的深度有 2 重含义,一重是字面意思:代码一层嵌一层、深不见底;另外一重是指真的 “很有深度” —— 指让人看不懂。

阅读这段代码的感觉就像是你在一座巨大的迷宫里,每次转弯都要判断下是左还是右,最后你只会迷失方向。

如何改进呢?

最简单直接的方法就是使用早返回策略(early return):

if (!condition1) 
 // 逻辑 A
 return;
if (!condition2)
  // 逻辑 B
 return;
if (!condition3)
  // 逻辑 C
 return;
if (!condition4)
  // 逻辑 D
 return;

这样,你的代码就清晰了很多,阅读这种代码的感觉就像是走在了一条直路上,前方的路一目了然。

当然,还可以将一些逻辑抽象成独立函数来简化代码,或者使用设计模式来优化。

怎么判断一段代码是否过于复杂、应该优化了呢?这里提到一个概念:圈复杂度 ,这是一种量化代码复杂程度的概念。通常你代码中的 if else 分支越多,圈复杂度就越高,代码就越复杂。

企业中一般建议圈复杂度不要超过 10 - 15,我个人的编码习惯是一般不会在代码中出现 3 层以上的嵌套(除非必要)。

3、冗余代码

这是我遇到最多的问题!分为 3 种情况:

  1. 能用一行代码搞定,偏偏要写 10 行;
  2. 能用一个变量或函数搞定,偏偏每次都是复制粘贴重复写;
  3. 没有用到的代码,又不舍得删除。

举个例子,下面这段前端代码,大家觉得有什么问题?

<Spin spinning={!(currDownloadUrl || originPictureUrl || pictureUrl)}>
{type === DRAW_APP ? (
drawImg(image)
) : (
drawImg(currDownloadUrl || originPictureUrl || pictureUrl)
)}
</Spin>

第一眼看到这段代码时,我就发现了,判断 spinning(旋转)的代码逻辑比较复杂,包含了两个 || 逻辑。而下面的 drawImg 函数的参数中,又包含了这段一模一样的逻辑。这段判断,其实就是冗余代码,完全没必要写两遍!

调整过后的代码如下:

// 要展示的图片地址
const showPictureUrl = currDownloadUrl || originPictureUrl || pictureUrl;

直接定义一个通用变量,写上清晰的注释,其他地方要使用时就无需关注内部判断逻辑,看注释就行了。

这就是所谓的 DRY 原则(Don't Repeat Yourself) ,尽量避免代码冗余。如果你在多处写下相同的代码,那么当需要修改这段代码时,你就需要在所有这些地方都修改,漏一个地方就是一个 Bug。

还有,关于项目中没有用到的函数和变量,如果你近期没有使用计划,不妨就删除或者注释掉,别舍不得。利用好 Git 版本控制系统,只要你的代码提交信息写得好,要用到被删掉的历史代码时,去提交记录里找即可。

注意,如果是学习时写代码,多保留一些也是合理的。但企业项目中,项目代码精简凝练些会更好。


- EOF -

推荐阅读  点击标题可跳转

1、Google 有一个函数,20000 个变量……

2、员工每天“带薪如厕”3~6小时被解雇,官司一直打到高院

3、已刑拘!人大毕业生盗取大量学生信息建“颜值打分”网站


关注「程序员的那些事」加星标,不错过圈内事

点赞和在看就是最大的支持❤️

微信扫码关注该文公众号作者

戳这里提交新闻线索和高质量文章给我们。
相关阅读
假发仅 8670 行代码,Linux 内核第一版 (v0.01) 开源代码解读CVPR 2023 | 改动一行代码,PyTorch训练三倍提速,这些高级技术是关键抢流量“去实习差点把公司给注销了??”哈哈打工哪有不失误的!ChatGPT憋了两个月的大更新,差点把我拐跑了小米造车,憋个大招还是憋出内伤?AI芯片抢产能,这些代工厂纷纷涨价16岁男生身负命案嫌疑、在校内伤人,背后发生了什么?这14种病是气出来的,看完再也不敢生气 了!雷军写的代码又上热搜了!写了十多年代码,熬过无数通宵买房送黄金!楼市,卷出了内伤白玉、碧玉美饰,白似冰晶雪凝,绿得沁人心脾,设计灵气出众尺度太大了!日本学霸们毕业典礼穿这样,看完笑出内伤肖战白百何演姐弟恋,但这个情节差点把我气出个好歹!两年前因为它,我差点把老公赶出家门,现在却到处说,别买包包、它才是夏天zui值得的奢侈品!阿斯巴甜陷“可致癌”风波!这些代糖股涨疯了高温不敢出门遛狗?快来接收在热浪天气出门小贴士“为了省2块钱,我妈差点把我毒死......”知名健身博主发帖,被渣男气出6颗子宫肌瘤?女人真的不能太憋屈晨游--我们是池子里最靓的仔,爱美丽的跑步,西瓜虫死了新疆人打个广告,把全国都笑出内伤飞碟原理,远在天边,近在眼前应届生成为“纽约都市丽人”,究竟要付出哪些代价?九剑一魂 - 第24回 汉胡同源 九剑一魂(三)改动一行代码,PyTorch训练三倍提速,这些「高级技术」是关键考公热最赚钱的一群人,卷到内伤10个解放双手实用在线工具,有些代码真的不用手写仅8670行代码,Linux内核第一版 (v0.01) 开源代码解读男子杀妻埋尸院内15年,仅判死缓:看完全程,我气血上涌...16岁男生校内伤人,还涉嫌杀害2名邻居、打伤母亲刚刚!澳币暴涨!创一年新高!澳洲华人及留学生:我气哭了不写代码,一句提示生成整个代码库,GPT-Engineer项目火了CVPR 2023 大牛演讲:改动一行代码,PyTorch训练三倍提速!这些技术是关键!不写代码,一句提示生成整个代码库,它在 GitHub 爆火
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。