我写代码时的小倔强

2023-11-06 00:18
文章标签 代码 倔强

本文主要是介绍我写代码时的小倔强,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

分享自己写代码时的好习惯,让你的编程能力突飞猛进!

大家好,我是鱼皮,上回说到,很多同学在学编程时不注重代码质量,养成坏习惯的同时,失去了提升自己编程能力的机会。

还没读上篇文章的同学,请先阅读:劳资的代码会有问题 ?!

在文末我抛出了问题:

如何有意提升自己的代码质量呢?我根本就发现不了自己代码中的问题,以为已经写得很棒棒了,怎么办?

要解决这个问题其实非常简单,既然自己经验不足、或者是 “只缘身在此山中”,看不出来代码哪里写的不好,那就找其他朋友或有经验的程序员帮你看看代码,给出一些意见。

虽然每个正常的程序员都无法忍受自己写的代码被人说是辣鸡,但是虚心接受指正,并加以修改,的确能大大加深我们的印象,下次写代码时就会注意了。慢慢地,就养成了好习惯,不仅注重自己的代码质量,还会 “继承传统”,开始说别人写的代码辣鸡,从而帮助更多人改进。

但有一个很残酷的现实,谁这么好心帮我看代码呢?

我大学期间,虽然做过很多项目,写过很多代码,但是自己的代码基本都只给自己看。即使把大作业的代码交给老师,他们也根本不看代码,只看运行效果的,这也是上次提到的为什么大家越来越不注重代码质量的原因之一。而且实不相瞒,我也曾经求学长帮我看代码,但换位思考一下,如果不是和你关系非常好,谁闲的蛋疼免费去帮你看你写的辣鸡代码?

求人不得,只能求己。

一种方式就是把自己开发好的作品上线,让用户来使用它,从而帮你发现一些自己没注意到的 Bug 或功能问题,驱使你去仔细阅读和改进代码。还可以把自己的代码公开到 GitHub 等代码托管平台,允许其他同学阅读和指出问题。但是,这种方式过于硬核,前期需要耗费大量精力去做推广,否则根本没人用你的项目,也没人去看你的 GitHub!

比如我的 编程导航 项目已经开源 4 个多月了,文档编写非常用心,也做过一点推广,才收获了 600+ star,确实是很不容易。

编程导航开源项目

这几天我又大大地优化了下文档,并且将后端的代码也开源了!如果大家对前端、React、后端、Java、Spring Boot、腾讯云开发、公众号开发、文档站点生成等感兴趣,都欢迎大家的关注~

地址: https://github.com/liyupi/code-nav

(也可以点击文章下方阅读原文直达)

编程导航开源项目

回归正题,硬核的方式咱玩不了,那我就教大家人人都能轻松学会的一招,也是我自己一直坚持的编程习惯。

下面一起来看看我写代码时的 小倔强 吧,有效提高你的代码质量,编程能力突飞猛进!

我的编程习惯

就像之前说的,我们之所以发现不了代码中的问题,很大程度上是因为我们的编程态度是 “乐观” 的,相信视频教程、相信书本、相信编辑器,只要没报错,那就是对的。

但我写代码时,非常地 “悲观” 且倔强,我会细致入微地把自己写过的每一行代码都看作是病人,坚持认为他们是有问题的,甚至可以说是从鸡蛋里挑骨头!

有同学说了,你特么不就是在说废话么,这不就是仔细检查代码?或者说是防御性编程?

啥是防御性编程,可以看我的这篇文章:揭秘软件开发的达摩克利斯之剑

先别急,这和防御性编程可不一样,我有多倔,举个栗子你就明白了,下面请跟上我的思路~

我有多倔?

假如我写了这样一端前端代码,作用是获取某条狗的名字:

// 默认狗名
let name = '无名狗';
// 狗、狗信息、狗名称都存在
if (dog && dog.info && dog.info.name) {name = dog.info.name;
}

你觉得这段代码有问题么?

如果你觉得没有问题,那么很好,你很乐观。

无所谓了,我才不要你觉得,我很倔,我就偏偏觉得这段代码有问题,没问题我也得挑挑问题

嗯,代码逻辑好像没毛病,那硬要说有问题的话,代码量是不是有点多?

比如在获取狗名时,为了防止报错,要先判断狗是否存在,再判断狗的信息是否存在,最后才能取到狗名,好啰嗦啊。如果还要获取一堆其他的信息,这代码简直没法看了。

所以,我就开始思考,如何让这段代码更加精简,有没有更好的写法呢?

通过百度,我发现了一个牛逼的玩意儿,叫 可选链操作符?. ),允许读取对象深处的属性值,而不必明确验证链中的每个引用是否有效;在引用为空的情况下不会引起错误,会自动短路返回值。

于是,代码变成了这样:

// 默认狗名
let name = '无名狗';
// 狗、狗信息、狗名称都存在
if (dog?.info?.name) {name = dog.info.name;
}

已经比刚刚简化了不少,但我不满足,获取个狗名竟然要写 4 行代码?这肯定有问题啊!能不能再简化一下呢?

思考了一下,这次我凭着自己贼硬的基础知识储备,没有百度就想出了更精简的写法,使用 JavaScript 的三元运算符就行了,代码如下:

let name = dog?.info?.name ? dog.info.name : '无名氏';

怎么样,一行代码搞定!

下面给大家个机会,代码写成这样还有问题不?或者说,你看这行代码觉得舒服么?

反正我觉得不太行,我鱼某偏要从鸡蛋里挑骨头!

仔细看,我们发现 dog、info、name 这三个单词都重复出现了两遍,那有什么办法再精简一下呢?

再次打开搜索引擎,这次搜了半天都没找到优化的方法,那我干脆就去搜了 “JavaScript 小技巧”、“JavaScript 高级写法” 等关键词,终于找到了答案。

空值合并操作符?? ),当左侧的操作数为 null 或者 undefined 时,返回其右侧操作数,否则返回左侧操作数。

最终,代码缩成了这样:

let name = dog?.info?.name ?? '无名狗';

舒服多了吧!

这就是我写代码时的倔强,通过这次挑问题,起码帮助我学到了两个 JavaScript 操作符的用法,爽死了!

值得么?

那有同学说了:像你这样写代码,不累么?这么认真地去抠代码的细节,不会很花时间么?

小了,格局小了。

从这一次写代码来看,的确我花了更多的时间,代码能跑就行了,管那么多别的干啥呢?但从长远来看,这是学习的必经之路,通过自己思考去发现问题、解决问题,学到的知识可以说是深深地刻在了脑海里,以后再写类似的代码时,就能更轻松、规范和高效,省下的时间是无限的!

当然,抠细节也要看情况,如果你要开发的东西很紧急,肯定还是先以完成功能为主。但等后面有空了,一定要记得优化一下,否则你也算是为代码 “屎山” 贡献了自己的一份力量。

悲观编程还有什么其他的好处呢?

乐观编程时,我们往往是被动地发现问题,以为代码跑的很顺利,但却往往被别人来提 Bug,再被迫修改,心态会越来越差。

而悲观编程时,我们是自己主动找问题,主动去优化代码。当你通过思考、搜索和实践,将原本很复杂的代码化繁为简后,你会惊喜地发现:我去,原来代码还可以这样写!牛逼牛逼!

然后,你就会收获成就感,继续坚持这种习惯,不断进步。

这让我不禁想起了拼多多,早期没有给用户很高的预期,让他们觉得这是个多牛逼的产品。而是主动降低用户的预期,让大家都觉得这是个土味儿产品,后来再一次次地超出预期,最终走向成功。

找不到问题?

看到这里,大家应该理解我写代码时的倔强了。但一定会有同学表示,我没有这种敏锐的直觉,看不出自己代码中的问题咋办呢?

我自己有一些经验方法,大家可以尝试一下:

  1. 当你觉得有段代码写起来很麻烦时,多半有问题,不妨去搜索下有没有现成的组件,或者别人是怎么实现的。

  2. 当你重复写某段代码时,一定有问题,不妨把它抽象成函数或组件、或者用设计模式来优化。

  3. 当某段代码中写了大量的 If Else 时,一定有问题,试着重新梳理逻辑,减少条件和分支。

  4. 多关注开发工具的报黄和报红提示,通常能得到很多好的优化建议,尽早发现问题。

再给大家一道练习题,上面举的栗子是前端的,这次就举个 Java 的吧。

目标是获得所有狗的名字列表,老弟小阿巴写的代码如下:

// 获得所有狗的名字列表
List<Dog> dogList = new ArrayList<>();
List<String> dogNameList = new ArrayList<>();
if (dogList != null && dogList.size() > 0) {for (int i = 0; i < dogList.size(); i++) {Dog dog = dogList.get(i);if (dog != null) {dogNameList.add(dog.getName());}}
}
return dogNameList;

这段代码有问题么?如何优化呢?大家快来试试吧~

小提示,一行代码就可以实现同样的功能!欢迎在评论区交流。


好了以上就是本期分享,有帮助的话求个 赞 + 在看 ,希望让更多人学到。


往期推荐

网友炸锅,IE 不再,痛失挚爱!

在烧烤店约了一位阿里练习生

前端老弟第一次写后端,崩了!

这篇关于我写代码时的小倔强的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/353367

相关文章

使用Java将DOCX文档解析为Markdown文档的代码实现

《使用Java将DOCX文档解析为Markdown文档的代码实现》在现代文档处理中,Markdown(MD)因其简洁的语法和良好的可读性,逐渐成为开发者、技术写作者和内容创作者的首选格式,然而,许多文... 目录引言1. 工具和库介绍2. 安装依赖库3. 使用Apache POI解析DOCX文档4. 将解析

C++使用printf语句实现进制转换的示例代码

《C++使用printf语句实现进制转换的示例代码》在C语言中,printf函数可以直接实现部分进制转换功能,通过格式说明符(formatspecifier)快速输出不同进制的数值,下面给大家分享C+... 目录一、printf 原生支持的进制转换1. 十进制、八进制、十六进制转换2. 显示进制前缀3. 指

使用Python实现全能手机虚拟键盘的示例代码

《使用Python实现全能手机虚拟键盘的示例代码》在数字化办公时代,你是否遇到过这样的场景:会议室投影电脑突然键盘失灵、躺在沙发上想远程控制书房电脑、或者需要给长辈远程协助操作?今天我要分享的Pyth... 目录一、项目概述:不止于键盘的远程控制方案1.1 创新价值1.2 技术栈全景二、需求实现步骤一、需求

Java中Date、LocalDate、LocalDateTime、LocalTime、时间戳之间的相互转换代码

《Java中Date、LocalDate、LocalDateTime、LocalTime、时间戳之间的相互转换代码》:本文主要介绍Java中日期时间转换的多种方法,包括将Date转换为LocalD... 目录一、Date转LocalDateTime二、Date转LocalDate三、LocalDateTim

jupyter代码块没有运行图标的解决方案

《jupyter代码块没有运行图标的解决方案》:本文主要介绍jupyter代码块没有运行图标的解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录jupyter代码块没有运行图标的解决1.找到Jupyter notebook的系统配置文件2.这时候一般会搜索到

Python通过模块化开发优化代码的技巧分享

《Python通过模块化开发优化代码的技巧分享》模块化开发就是把代码拆成一个个“零件”,该封装封装,该拆分拆分,下面小编就来和大家简单聊聊python如何用模块化开发进行代码优化吧... 目录什么是模块化开发如何拆分代码改进版:拆分成模块让模块更强大:使用 __init__.py你一定会遇到的问题模www.

springboot循环依赖问题案例代码及解决办法

《springboot循环依赖问题案例代码及解决办法》在SpringBoot中,如果两个或多个Bean之间存在循环依赖(即BeanA依赖BeanB,而BeanB又依赖BeanA),会导致Spring的... 目录1. 什么是循环依赖?2. 循环依赖的场景案例3. 解决循环依赖的常见方法方法 1:使用 @La

使用C#代码在PDF文档中添加、删除和替换图片

《使用C#代码在PDF文档中添加、删除和替换图片》在当今数字化文档处理场景中,动态操作PDF文档中的图像已成为企业级应用开发的核心需求之一,本文将介绍如何在.NET平台使用C#代码在PDF文档中添加、... 目录引言用C#添加图片到PDF文档用C#删除PDF文档中的图片用C#替换PDF文档中的图片引言在当

C#使用SQLite进行大数据量高效处理的代码示例

《C#使用SQLite进行大数据量高效处理的代码示例》在软件开发中,高效处理大数据量是一个常见且具有挑战性的任务,SQLite因其零配置、嵌入式、跨平台的特性,成为许多开发者的首选数据库,本文将深入探... 目录前言准备工作数据实体核心技术批量插入:从乌龟到猎豹的蜕变分页查询:加载百万数据异步处理:拒绝界面

用js控制视频播放进度基本示例代码

《用js控制视频播放进度基本示例代码》写前端的时候,很多的时候是需要支持要网页视频播放的功能,下面这篇文章主要给大家介绍了关于用js控制视频播放进度的相关资料,文中通过代码介绍的非常详细,需要的朋友可... 目录前言html部分:JavaScript部分:注意:总结前言在javascript中控制视频播放