分享给前端初学者编写更好代码的 3 个技巧
sinye56 2024-10-27 14:04 11 浏览 0 评论
转载说明:原创不易,未经授权,谢绝任何形式的转载
作为初学者,您可能不会过多考虑代码风格。采用以下三个原则,可以立即提高您的代码质量。
在过去几个月中,我有机会指导一组才华横溢的新网页开发人员,他们参加了 TechLabs 的数字塑造者计划。
看到这个团队从零开始学习到最终发布应用程序的学习过程真是太有趣了。当我审查他们的代码时,它让我想起了自己作为开发者的头几年。特别是当您是自学的,没有任何正式的教育背景,您只会不停地尝试。您无法感知好的或坏的代码实践。您会对任何能够工作的东西感到高兴。
这让我想到了一个问题:“哪些编码原则是我希望早些时候就知道的?”这里就是它们!
您可以立即在编码实践中实施这些简单的提示。虽然简单,但它们对我的代码编写方式产生了很大的影响。
注意:尽管标题明确指出“前端开发人员”,但这些原则适用于编程的所有领域。
使用“提前返回”代替嵌套条件语句
在Web开发中,您会遇到很多需要检查特定条件是否满足的情况。
举个例子,假设您有一个API路由,用于验证请求并返回一个用户对象:
export const handler = async (req, res) => {
if (req.method === "POST" || req.method === "OPTIONS") {
const email = validateEmail(req.body.email);
if (email) {
const user = getUserByEmail(email);
if (user) {
return res.status(200).json({ user });
} else {
return res.status(404).json({ message: 'No user found' });
}
} else {
return res.status(422).json({ message: 'Missing email' });
}
} else {
return res.status(405).json({ message: 'Unsupported message' });
}
}
虽然这个函数中没有太多的逻辑封装,但它看起来已经有些杂乱无章了。具体来说,这段代码存在以下两个问题:
- 很难跟踪代码流程。我们需要从左到右而不是从上到下阅读代码(箭头反模式)。
- 很难找到每个 if 对应的 else 语句。它们被 if 语句的大体量隔开了。
改进这段代码的一个简单技巧是使用“提前返回”模式(Return-Early-Pattern)。“提前返回”模式会在不满足条件时终止函数的执行,以便函数的期望结果始终出现在最后。如果我们重新编写上面的 API 路由,它将如下所示:
export const handler = async (req, res) => {
if (req.method !== "POST" && !req.method !== "OPTIONS") {
return res.status(405).json({ message: 'Unsupported message' });
}
const email = validateEmail(req.body.email);
if (!email) {
return res.status(422).json({ message: 'Missing email' });
}
const user = getUserByEmail(email);
if (!user) {
return res.status(404).json({ message: 'No user found' });
}
return res.status(200).json({ user });
}
使用“提前返回”模式后,我们可以轻松地从上到下跟踪代码执行。由于我们假设一切顺利,只检查缺失的值,因此避免了嵌套太多条件。
最后,我们可以一眼看到函数的期望结果,它位于最底部。
2、为人类编写代码
归纳前一个提示的内容,我们得到了第二个原则:编写易于他人阅读而非机器的代码。
这听起来很平凡,但起初却让我彻底改变了思维方式。当我开始编程时,我总是把它看作是与计算机交流的一种方式。我们告诉计算机要做什么。但我们编写的代码是由同事阅读和理解的,而不是机器。
我们的同事是需要阅读和理解代码的人。最终,计算机将一切都转换为 0 和 1,并不关心可读性。让我们以 groupBy 函数为例:
const groupBy = (arr, groupFn) =>
arr.reduce(
(grouped, obj) => ({
...grouped,
[groupFn(obj)]: [...(grouped[groupFn(obj)] || []), obj],
}),
{}
);
我们清楚地展示了如何编写复杂的单行函数来执行简单的操作:对数组进行分组。
尽管这可能让您感觉更加专业,但对于任何需要审查代码的人来说,这确实会使事情更加难以理解。相比之下,考虑以下实现方式:
const groupBy = (arr, groupFn) => {
const grouped = {};
for (const obj of arr) {
const groupName = groupFn(obj);
if (!grouped[groupName]) {
grouped[groupName] = [];
}
grouped[groupName].push(obj);
}
return grouped;
};
我们可以从上到下阅读这段代码,并立即了解每行代码的作用。
尽管这可能看起来没有之前的实现方式那么酷炫,但是以后所有需要重新审查这段代码的人都会因为这种易于阅读的实现方式而感谢您。
将信息隐藏在函数背后
作为初级开发人员,改进代码风格的最后一个想法是将不相关的信息隐藏在函数背后。这也有助于提高代码的可读性。
如果您熟悉 React,Hooks 是这一原则的一个很好的例子:
import React, { useState, useEffect } from 'react';
function FriendListItem(props) {
const [isOnline, setIsOnline] = useState(null);
useEffect(() => {
function handleStatusChange(status) {
setIsOnline(status.isOnline);
}
ChatAPI.subscribeToFriendStatus(props.friend.id, handleStatusChange);
return () => {
ChatAPI.unsubscribeFromFriendStatus(props.friend.id, handleStatusChange);
};
});
return (
<li style={{ color: isOnline ? 'green' : 'black' }}>
{props.friend.name}
</li>
);
}
在这里,我们有一个组件,它输出一个带有动态状态颜色的列表项。虽然这段代码可以正常运行,但它封装了与 FriendListItem 组件的目的不直接相关的逻辑。
如果我们提取该逻辑并创建一个名为 useFriendStatus 的自定义 Hook,我们可以简化该组件,如下所示:
import React, { useState, useEffect } from 'react';
function FriendListItem(props) {
const isOnline = useFriendStatus(props.friend.id);
return (
<li style={{ color: isOnline ? 'green' : 'black' }}>
{props.friend.name}
</li>
);
}
这样做有两个好处:
- 我们可以重用 useFriendStatus 的逻辑。
- 我们将组件简化为其功能的实质内容。
更一般地说,隐藏信息的原则是将不相关的信息封装在抽象函数背后。
因此,我们不需要关心抽象函数内部发生了什么(实现细节)——我们可以更专注于它的目的,即函数的名称(问题域的级别)。
总结
我希望这些小技巧对您有所帮助!本质上,编写更好的代码通常只是让它更易于阅读和理解,无论是对于您自己还是对于其他人来说。
原文:https://konstantinmuenster.medium.com/3-tips-to-write-better-code-as-a-beginner-frontend-developer-ea0fe9b3492c
作者:Konstantin Münster
非直接翻译,有自行改编和添加部分,翻译水平有限,难免有疏漏,欢迎指正
相关推荐
- 程序员:JDK的安装与配置(完整版)_jdk的安装方法
-
对于Java程序员来说,jdk是必不陌生的一个词。但怎么安装配置jdk,对新手来说确实头疼的一件事情。我这里以jdk10为例,详细的说明讲解了jdk的安装和配置,如果有不明白的小伙伴可以评论区留言哦下...
- Linux中安装jdk并配置环境变量_linux jdk安装教程及环境变量配置
-
一、通过连接工具登录到Linux(我这里使用的Centos7.6版本)服务器连接工具有很多我就不一一介绍了今天使用比较常用的XShell工具登录成功如下:二、上传jdk安装包到Linux服务器jdk...
- 麒麟系统安装JAVA JDK教程_麒麟系统配置jdk
-
检查检查系统是否自带java在麒麟系统桌面空白处,右键“在终端打开”,打开shell对话框输入:java–version查看是否自带java及版本如图所示,系统自带OpenJDK,要先卸载自带JDK...
- 学习笔记-Linux JDK - 安装&配置
-
前提条件#检查是否存在JDKrpm-qa|grepjava#删除现存JDKyum-yremovejava*安装OracleJDK不分系统#进入安装文件目...
- Linux新手入门系列:Linux下jdk安装配置
-
本系列文章是把作者刚接触和学习Linux时候的实操记录分享出来,内容主要包括Linux入门的一些理论概念知识、Web程序、mysql数据库的简单安装部署,希望能够帮到一些初学者,少走一些弯路。注意:L...
- 测试员必备:Linux下安装JDK 1.8你必须知道的那些事
-
1.简介在Oracle收购Sun后,Java的一系列产品就被整合到Oracle官网中,打开官网乍眼一看也不知道去哪里下载,还得一个一个的摸索尝试,而且网上大多数都是一些Oracle收购Sun前,或者就...
- Linux 下安装JDK17_linux 安装jdk1.8 yum
-
一、安装环境操作系统:JDK版本:17二、安装步骤第一步:下载安装包下载Linux环境下的jdk1.8,请去官网(https://www.oracle.com/java/technologies/do...
- 在Ubuntu系统中安装JDK 17并配置环境变量教程
-
在Ubuntu系统上安装JDK17并配置环境变量是Java开发环境搭建的重要步骤。JDK17是Oracle提供的长期支持版本,广泛用于开发Java应用程序。以下是详细的步骤,帮助你在Ubuntu系...
- 如何在 Linux 上安装 Java_linux安装java的步骤
-
在桌面上拥抱Java应用程序,然后在所有桌面上运行它们。--SethKenlon(作者)无论你运行的是哪种操作系统,通常都有几种安装应用程序的方法。有时你可能会在应用程序商店中找到一个应用程序...
- Windows和Linux环境下的JDK安装教程
-
JavaDevelopmentKit(简称JDK),是Java开发的核心工具包,提供了Java应用程序的编译、运行和开发所需的各类工具和类库。它包括了JRE(JavaRuntimeEnviro...
- linux安装jdk_linux安装jdk软连接
-
JDK是啥就不用多介绍了哈,外行的人也不会进来看我的博文。依然记得读大学那会,第一次实验课就是在机房安装jdk,编写HelloWorld程序。时光飞逝啊,一下过了十多年了,挣了不少钱,买了跑车,娶了富...
- linux安装jdk,全局配置,不同用户不同jdk
-
jdk1.8安装包链接:https://pan.baidu.com/s/14qBrh6ZpLK04QS8ogCepwg提取码:09zs上传文件解压tar-zxvfjdk-8u152-linux-...
- 运维大神教你在linux下安装jdk8_linux安装jdk1.7
-
1.到官网下载适合自己机器的版本。楼主下载的是jdk-8u66-linux-i586.tar.gzhttp://www.oracle.com/technetwork/java/javase/downl...
- window和linux安装JDK1.8_linux 安装jdk1.8.tar
-
Windows安装JDK1.8的步骤:步骤1:下载JDK打开浏览器,找到JDK下载页面https://d.injdk.cn/download/oraclejdk/8在页面中找到并点击“下载...
- 最全的linux下安装JavaJDK的教程(图文详解)不会安装你来打我?
-
默认已经有了linux服务器,且有root账号首先检查一下是否已经安装过java的jdk任意位置输入命令:whichjava像我这个已经安装过了,就会提示在哪个位置,你的肯定是找不到。一般我们在...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- oracle忘记用户名密码 (59)
- oracle11gr2安装教程 (55)
- mybatis调用oracle存储过程 (67)
- oracle spool的用法 (57)
- oracle asm 磁盘管理 (67)
- 前端 设计模式 (64)
- 前端面试vue (56)
- linux格式化 (55)
- linux图形界面 (62)
- linux文件压缩 (75)
- Linux设置权限 (53)
- linux服务器配置 (62)
- mysql安装linux (71)
- linux启动命令 (59)
- 查看linux磁盘 (72)
- linux用户组 (74)
- linux多线程 (70)
- linux设备驱动 (53)
- linux自启动 (59)
- linux网络命令 (55)
- linux传文件 (60)
- linux打包文件 (58)
- linux查看数据库 (61)
- linux获取ip (64)
- linux进程通信 (63)