編寫高質量可維護的代碼:優雅命名

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

點擊下方卡片關注我、加個星標,或者查看源碼等系列文章。學習源碼整體架構系列、年度總結、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.pswp.cn/news/275876.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/275876.shtml
英文地址,請注明出處:http://en.pswp.cn/news/275876.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

繼春晚不宕機后,百度云這次拿下攜程大單

今年春晚&#xff0c;百度和央視聯手發放高達9億現金紅包的消息&#xff0c;想必讓不少人替百度捏了把汗。根據統計&#xff0c;春晚期間&#xff0c;全球觀眾參與百度App紅包互動次數累計達到208億次&#xff0c;日活從1.6億沖上3億關口&#xff0c;這么大的瞬時流量沖擊是百度…

mysql int 11 java_mysql中int(11)列的大小(以字節為單位)是多少?

正如其他人所說&#xff0c;列可以存儲的最小/最大值以及以字節為單位的存儲量僅由類型而不是長度定義 .很多這些答案都說 (11) 部分僅影響顯示寬度&#xff0c;這不完全正確&#xff0c;但主要是 .int(2) 與 no zerofill specified 的定義將&#xff1a;仍然接受 100 的值輸出…

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;大家所說的hack&#xff0c;都是針對一臺主機&#xff0c;在獲得管理員權限后&#xff0c;就很是得意&#xff1b;其實&#xff0c;真正的hacker是占領整個內部網絡。針對內部網絡的hack方法比較多&#xff0c;但比較有效的方法非ARP欺騙、DNS欺騙莫屬了。…

面試官問:你在項目中做過哪些安全防范措施?

大家好&#xff0c;我是若川。今天分享一篇安全相關的文章。點擊下方卡片關注我、加個星標&#xff0c;或者查看源碼等系列文章。學習源碼整體架構系列、年度總結、JS基礎系列如果你被面試官問到這個問題&#xff0c;不要急于描述自己遇到的問題以及如何處理的&#xff0c;你得…

TCP/IP協議族之應用層協議(FTP、TFTP)

文件傳送協議FTP: File Transfer Protocol 是因特網上使用得最廣泛的文件傳送協議。提供交互式的訪問&#xff0c;允許客戶指明文件的類型與格式&#xff08;如指明是否使用ASCII碼&#xff09;&#xff0c;并允許文件具有存取權限&#xff08;如訪問文件的用戶必須經過授權&am…

消滅病毒_消滅遺產

消滅病毒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;具有許…

mysql表連接_mysql表連接

在數據庫中tableA連接tableB如下&#xff1a;tableA:a1  a21  12  23  24  3tableB:b1 b22  12  23  33  46  5笛卡爾積&#xff1a;select * from tableA, tableB.1  1  2  11  1  2  21  1  3  31  1  3  41  1  6  52…

輕型本地服務器_一小時超輕型漂移機

輕型本地服務器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…

baidu的服務器數據里面裝的都是垃圾!

baidu的服務器數據里面裝的都是垃圾&#xff01; 除了垃圾廣告一點價值沒有&#xff0c;能不能學學google。 國人天天喊支持國貨&#xff0c;但國貨很多垃圾&#xff0c;沒有人管理這些制造垃圾的人。 轉載于:https://www.cnblogs.com/helper/archive/2010/10/12/1848371.html

聊聊前端面試

大家好&#xff0c;我是若川。今天分享一篇面試相關的文章。點擊下方卡片關注我、加個星標&#xff0c;或者查看源碼等系列文章。學習源碼整體架構系列、年度總結、JS基礎系列最近 Zoom 國內又開放招聘了&#xff0c;我們組有了前端的 HC&#xff0c;所以我也參加了幾場面試。合…

成為自信的node.js開發者(一)

這個博客是我最近整理了過去的文章。 適合閱讀的同學 想更進一步深入理解node的同學&#xff0c;如果你已經稍微了解一點點node, 可以用node做一些小demo&#xff0c;并且想更深一步的了解&#xff0c;希望這篇文章可以幫助到你。 不太適合閱讀的同學 不太熟悉基本的javascript…

mysql讀寫分離和分布式_MySQL主從復制與讀寫分離

MySQL主從復制(Master-Slave)與讀寫分離(MySQL-Proxy)實踐Mysql作為目前世界上使用最廣泛的免費數據庫&#xff0c;相信所有從事系統運維的工程師都一定接觸過。但在實際的生產環境中&#xff0c;由單臺Mysql作為獨立的數據庫是完全不能滿足實際需求的&#xff0c;無論是在安全…