编写高质量可维护的代码:优雅命名

大家好,我是若川。今天分享一篇关于如何命名更优雅的文章。

点击下方卡片关注我、加个星标,或者查看源码等系列文章。学习源码整体架构系列、年度总结、JS基础系列

本文首发于政采云前端团队博客:编写高质量可维护的代码:优雅命名

https://www.zoo.team/article/good-name

前言

俗话说得好,万事开头难。而对于前端 coder 来说,每次新项目、新需求来的时候,我想大家最苦恼的往往就是如何去命名,无论是项目名称、页面的文件名称亦或是代码中的方法名称,对于我来说,但凡名字想好了以后,我觉得需求就已经写完一半了。

如何才能更好,更优雅的去解决这些命名问题呢?在这之前,先随我看一些不合适的命名示例吧。

不合适的命名

我们先来看一些例子:

  • 无意义的,抽象的,任何地方可以使用,谁都不知道你这里用的命名来源是谁

// bad
const data;
const info;
const tool;
  • 简称,单词的简称或者缩写很容易让人无法确定具体指代什么

// bad
const comp;
const crt_date;// good
const components;
const company;
const current_date;
  • 数字或者字母结尾的命名,让其他人无法获取这些之间的区别

// bad
const button1;
const button2;
const info1;// good
const importButton;
const userInfo;
  • 全局的地方不要用前置或后置下划线,前置下划线通常代表了私有变量

// bad
const _firstName_ = 'Zcy';
const firstName_ = 'Zcy';
const _firstName = 'Zcy';// good
const firstName = 'Zcy'

命名规则

如何让命名更简单呢,只要遵循一些规则规范,总能将复杂的事情拆分开来,变成一件简单的事情。

直白、有意义

想要让你的命名简单易懂,最简单的方式就是直白并且有意义,直接了当的在命名中体现出你这个命名的功能,或者描述,举个例子:

// bad
function getInfo(){};
function formatList(){};
const data = [];// good
function getUserInfo(){};
function formatNewsList(){};
const articleData = [];

如果在页面中定义了上面这样的变量,哪种写法可以让你在没有注释的情况下,就能快速了解原作者的书写意图呢?(当然,代码中还是需要一些必要注释的)。

所以在命名的时候,需要的就是直白、完备、有意义,让别人通过命名就能了解到这个名称(无论是变量、方法或者是样式名)背后的的含义,这样的命名就是高效的、易懂的。

遵从惯例、标准

习惯使用业界习惯的命名标识,或者是约定俗成的书写习惯。

  • id 当做数据标识命名,而不是 identifier

  • 例如布尔值命名类型,通常只有两个值类型:真,假,根据不同的使用场景,也可以有一些常用的命名方式

// 可见、状态等,可用 is+动词/形容词的方式
const isVisible;
const isLoading;// 配置,选项等类型,可以用 withXxx、hasXxx 来标识是否有某个属性等,enableXxx 来表示是否开启配置
const withTab;
const hasPlan;
const enableFilter;
  • 例如方法命名,也可以使用动词 + 名次类的组合命名方式,操作类方法 fetchXxx,getXxx,当需要根据某些属性获取数据时可用 ,getXxxByYxx 这类的命名,删除类方法 deleteXxx,格式化数据 formatXxx

// 数据获取方法
function getUserInfo(){};
function fetchSearchList(){};// 需要根据一些属性去获取数据
function getGoodsById(){};
function queryUserByName(){};// 删除数据
function deleteUser(){};
function removeGoodsItem(){};// 格式化数据
function formatDate(){};
function sortByDesc(){}

规范约束

团队如果用统一的命名规范,那就一定要遵守,例如文件名的命名是大写字母开头的驼峰写法,那你的命名就不能再修改为其他方式,在规范创建之初或者修订时可以提出修改意见并进行讨论,但如果已经确立的,就不要再。去自由的破坏规范。

当然也可以使用一些辅助手段帮助约束代码中的命名校验,例如在 Eslint 配置中加入 id-match 或者 camelcase,前者可以直接通过正则配置自己需要的命名规范,后者则是直接采用了驼峰命名的规范约束。

这里也举例介绍一下在 VsCodeEslint 的使用

  • 首选电脑全局安装 eslint

npm install eslint -g
  • VsCode  中安装 ESlint 插件并且启用

  • 在自己项目中,执行 eslint --init 命令来创建项目的 .eslintrc.js 文件,之后可以在 .eslintrc.js 文件中的 rules 规则添加上规范的约束条件来使用这个规则

module.exports = {"rules": {"id-match": ["error", "^[a-z]+([A-Z][a-z]+)*$"],"camelcase": ["error", {"properties": "always"}]}
}
  • 项目中如果碰到不符合规范的就会直接报错提示

命名规范推荐

上面简单介绍了一些命名的规则,那么具体到实际操作中,我们又有哪些较好的命名规范可以选择呢?下面根据不同的使用场景,也简单给大家介绍一些经常推荐使用的命名规范。

项目名称、文件名称

项目或者单文件的命名方面,常见规则:

  1. kebab-case:横短线命名,也叫串式命名法,小写字母的词组,中间加 - 拼接的方式,这种方式命名便于同类内容快速查找

// good
news-index;
news-list;
news-detail;
  1. camelcase:小驼峰命名,第一个单字以小写字母开始,第二个单字的首字母大写

// good
newsIndex;
newsList;
newsDetail;

JavaScript

  • 变量:常用小驼峰命名

// good
const userInfo;
const userAddressList;
const currentDate;
  • 全部使用大写字母,单词之间采用 _ 分割

// good 
const ITEM_LIST;
const PAGE_ITEM_LIST;
const DEFAULT_CONFIG;
  • 方法:小驼峰命名,并且推荐命名时添加一些动词类,可以帮助快速理解方法含义,例如以 handle 开头,中间 xxx 表示操作内容,show 表示具体操作, handlexxxxChangehandlexxxxShow,而比如数据获取可以用 get,fetch 这类

// 小驼峰命名
function getUserInfo(){};
function addSuplierInfo(){};// 添加一些操作类的辅助命名
function handleUserInfoChange(){};
function handleTitleClick(){};
function fetchPageData(){};
  • 类名:大驼峰命名

export class CommonLogo;
export class CartCenter;

css

BEM 规范

BEM 是一种命名 CSS 样式的命名方法和规范,全称 Block(块)、 Element(元素)、Modifier(修饰符) ,想必很多人都比较熟悉了。

Block:一般可以看做是独立具有实际意义的模块部分,例如 header,container,menu 等
Element:组成 Block 的一部分,没有具体的实际意义,一般也不独立使用,例如 menu item,list item,header title 等
Modifier:一般是块或者元素的修饰状态或者行为,例如 disabled,color,checked 等

BEM 的写法一般是 .block-name__element-name--modifier-name,其中 BlockElement 之间连接是通过 __ 双下划线,BlockElementModifier 之间是通过 -- 双中划线进行连接,当使用less或者 sass 语法编写 css 时,通过嵌套语法也能够很简洁的书写这部分样式。

<div class="head"><div class="head__title">标题<div class="head__title--disabled">置灰内容</div></div>
</div>
.head {background-color: #fff;&__title {font-size: 14px;color: #666;&--disabled: {color: #f00; }}
}

BEM 命名规范可以让样式的命名更加模块化,组件之间结构独立,减少了命名之间的冲突,有着不错的易读性、维护性等等,但可能会让项目中的样式命特别的长。

下面也有一些使用 BEM 命名规范的网站,有兴趣的可以去看看:

  • https://csswizardry.com/

  • https://mediatemple.net/

  • https://www.udemy.com/

常用 CSS 样式名称

这里引用一下掘金作者 冷石Boy 的 css 样式名称

包裹类: container, wrapper, outer, inner, box, header, footer, main, content, aside, page, p, block

状态类: primary, secondary, success, danger, warning, info, error, Link, light, dark, disabled, active, checked, loading

尺寸类: large, middle, small, bigger, smaller

组件类: card, list, picture, carousel, swiper, menu, navs, badge, hint, modal, dialog

位置类: first, last, current, prev, next, forward, back

文本类: title, desc, content, date, author, category,label,tag

人物类: avatar, name, age, post, intro

取名推荐工具

当然对于命名有困难选择症的朋友来说,可以推荐你们一个意想不到的网站 —— Codelf (https://unbug.github.io/codelf),一个帮你搜索 GithubGitLab 等网站中,你想查找的内容的不同命名。

并且这个网站支持 JavaScriptCSSHTMLJava 等多种语言的搜索,可以方便的过滤不需要的搜索类型。

Hover 搜索词后的操作,Search 会再以当前选词进行一次搜索,Repo 可以跳转这个词语的出处项目,Copy 当然就不说了,有兴趣的朋友都可以尝试一下。

总结

命名其实并不麻烦,遵循一些定好的规则规范,或者自己给自己定义好这个规范,然后进行直白、有意义的命名,那么之后的命名就只会成为你的一种习惯,而不再是困扰你的难题,也希望大家可以分享一些自己的命名规范或者技巧,共同讨论下吧。

参考文献

  • 故宫命名法:https://juejin.cn/post/6844903913892610061

  • 如何代码命名:https://www.cyningsun.com/07-04-2020/how-to-naming-things.html

最近组建了一个江西人的前端交流群,如果你也是江西人可以加我微信 ruochuan12 拉你进群。


················· 若川出品 ·················

今日话题

略。欢迎在下方留言~  欢迎分享、收藏、点赞、在看我的公众号文章~

一个愿景是帮助5年内前端人走向前列的公众号

可加我个人微信 ruochuan12,长期交流学习

推荐阅读

我在阿里招前端,我该怎么帮你?(现在还能加我进模拟面试群)

若川知乎问答:2年前端经验,做的项目没什么技术含量,怎么办?

点击方卡片关注我、加个星标,或者查看源码等系列文章。
学习源码整体架构系列、年度总结、JS基础系列

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

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

相关文章

powerpoint技巧_几乎每个PowerPoint都烂鸡蛋

powerpoint技巧Almost 20 years ago — 2001! — Seth Godin wrote an ebook called Really Bad Powerpoint (and how to avoid it). In that book he detailed all of the things that tend to go wrong in slide presentations.差不多20年前-2001年&#xff01; —塞斯戈丁(S…

认识mysql总结_从根上理解Mysql - 读后个人总结1-搜云库

初识 MySQL通信介绍MySQL 也是典型的 C / S 模型&#xff0c;分为客户端及服务端&#xff0c;服务端一般部署在远端服务器中&#xff0c;也可以部署至本地&#xff0c;然后客户端跟服务端通信则可以使用依赖网络的 TCP 长连接或 Unix-like 的系统下可以使用 Socket文件的形式通…

面试官问:你在项目中做过哪些安全防范措施?

大家好&#xff0c;我是若川。今天分享一篇安全相关的文章。点击下方卡片关注我、加个星标&#xff0c;或者查看源码等系列文章。学习源码整体架构系列、年度总结、JS基础系列如果你被面试官问到这个问题&#xff0c;不要急于描述自己遇到的问题以及如何处理的&#xff0c;你得…

消灭病毒_消灭遗产

消灭病毒The year was 1995, I was 10 years of age. The number 1 single in the UK was Think Twice by Celine Dion, and Batman Forever was the highest grossing movie across the pond in the States. Manchester United, unfortunately, won their 3rd Premier League …

logcat崩溃_使用logcat抓取Android崩溃日志

一、安装jdkJDK网上教程非常多&#xff0c;此处不再赘述。(好像不装也没关系&#xff0c;未实测)二、工具列表a) adb包(v.1.0.31版本或以上&#xff0c;下文提供下载地址)b) logcat.bat文件(下文制作)三、安装adb(二选一)a) 放到任意位置(推荐)因为adb…

基于 Ubuntu 16.04 LTS 的 KDE neon 到达维护周期

随着 KDE neon 在 Ubuntu 18.04 LTS 发布&#xff0c;开发团队已经决定 放弃维护基于 Ubuntu 16.04 LTS版本&#xff0c;大多数用户预警将希望升级到基于 Ubuntu LTS 的 KDE neno 新版本。“去年KDE neno 被重新定位到 Ubuntu bionic / 18.04上&#xff0c;并且升级已经基本顺利…

真诚推荐7个能助你成长的前端大佬

不得不说&#xff0c;如今比前些年学习资料多很多了。现在的前端公众号也挺多的&#xff0c;这里推荐几个前端大佬运营的公众号&#xff0c;都是聚焦前端垂直领域的优质公众号&#xff0c;关注这些公众号至少可以&#xff1a;1、了解现在前端技术发展情况和未来发展趋势&#x…

Silverlight学习笔记(3):Silverlight的界面布局

在上一篇中讲述了使用VS2010开发Silverlight的一些基础知识&#xff0c;并且讲述了Silverlight的部署和代码安全知识&#xff0c;这一篇主要是讲述如何在Silverlight中摆放界面元素。记得早年前我还在学习Java的时候&#xff0c;当时有两种开发Java SE的方法&#xff0c;一种是…

pov-inc_yourself劳自己-懒惰的设计师的POV和一些Figma

pov-incAre you ready and lazy enough (you will fully understand with continue reading this)? Coffee and tea next to you? Alright. This article is going to (not) kick you in your a**. It will be a bit of ‘lesson learned’, for sure a bit of FIGMA, and a …

Geary 0.13.0 发布,GNOME 3 Email 客户端应用

百度智能云 云生态狂欢季 热门云产品1折起>>> Geary 0.13.0 发布了&#xff0c;Geary 是一个电子邮件应用&#xff0c;用于 GNOME 3 桌面版本&#xff0c;它允许阅读、查找和发送电子&#xff0c;并提供简洁、现代化的界面。这是一个重要的新版本&#xff0c;具有许…

轻型本地服务器_一小时超轻型漂移机

轻型本地服务器Iwas introduced to the world of Hyper Light Drifter through a series of visions — titans ravage a broken city, a shallow sea is stained red by floating corpses, a skinny dog leads me into the yawning abyss of a pillar in the center of the se…

聊聊前端面试

大家好&#xff0c;我是若川。今天分享一篇面试相关的文章。点击下方卡片关注我、加个星标&#xff0c;或者查看源码等系列文章。学习源码整体架构系列、年度总结、JS基础系列最近 Zoom 国内又开放招聘了&#xff0c;我们组有了前端的 HC&#xff0c;所以我也参加了几场面试。合…

mysql读写分离和分布式_MySQL主从复制与读写分离

MySQL主从复制(Master-Slave)与读写分离(MySQL-Proxy)实践Mysql作为目前世界上使用最广泛的免费数据库&#xff0c;相信所有从事系统运维的工程师都一定接触过。但在实际的生产环境中&#xff0c;由单台Mysql作为独立的数据库是完全不能满足实际需求的&#xff0c;无论是在安全…

ux和ui_UI和UX设计师的10种软技能

ux和ui重点 (Top highlight)As designers, whether it be UI, UX, or Product Design, we tend to direct our focus and energy on developing and mastering tangible skills.作为设计师&#xff0c;无论是UI&#xff0c;UX还是产品设计&#xff0c;我们都将重点和精力放在开…

SQLServer中批量插入数据方式的性能对比 (转)

转自&#xff1a;http://www.cnblogs.com/wlb/archive/2010/03/02/1676136.html 昨天下午快下班的时候&#xff0c;无意中听到公司两位同事在探讨批量向数据库插入数据的性能优化问题&#xff0c;顿时来了兴趣&#xff0c;把自己的想法向两位同事说了一下&#xff0c;于是有了本…

VueConf China 2021 《Vue3生态进展-尤雨溪》 Reaction

大家好&#xff0c;我是若川。今天分享昨天Vueconf的一篇文章&#xff0c;来了解下Vue的生态进展。另外今晚7点&#xff0c;Vuebeijing社区邀请了尤大会在视频号直播&#xff0c;可以加我微信 ruochuan12&#xff0c;告诉观看地址提前预约。点击下方卡片关注我、加个星标&#…

Plsql运行mysql脚本_oracle中PLSQL语句

1.set autot off 禁止使用autotrace命令 set autot on 这个命令包括exp 和 stat(执行语句、生成explain plan、生成统计信息) set autot trace 不执行sql语句&#xff0c;但(生成explain plan、生成统计信息) set autot trace exp stat 与上句同 set autot trace st1.set autot…

2019年,你需要关注这些Node API和Web框架

对于Node.js框架和开源软件来说&#xff0c;2018年是非常有趣的一年。开发者社区讨论了企业赞助对开源项目的作用以及如何维护那些没有经济支持却有数百万人使用的项目。同样&#xff0c;安全问题也得到了极大关注&#xff0c;一些流行的Node/JS软件包被劫持&#xff0c;Github…

ai创造了哪些职业_关于创造职业的思考

ai创造了哪些职业When I was growing up, the idea of a creative career wasn’t an option.当我长大时&#xff0c;创意事业的想法不是一个选择。 I had enjoyed doodling, arts and crafts as a kid, so as I grew up, it was a natural transition into Photoshop and lat…

Windows Mobile,用C#更改网络连接(SSID、IP Address、Subnet Mask、Gatew... (转)

前几天在做一个改变PDA无线网络连接的SSID和IP的功能是发现了一个好东西OpenNETCF Framework使用OpenNETCF.Net包&#xff0c;实现了任意改变PDA无线网络连接的功能。并且不需要Reset PDA。现在正在做一个IP Manager For Windows Mobile的小程序。实现搜索当前网卡可见的SSID、…