作為編程初學者,提高代碼技能可能是你的首要任務之一。
但如何提升往往是初學者面臨的首要難題雀久,哪些技術(shù)最值得學習,哪些技術(shù)能幫你更快的寫出優(yōu)秀的代碼朱监?
技術(shù)方向的選擇岸啡、具體的學習路線可能無法通過一篇文章就能說清楚原叮,更多的需要根據(jù)愛好赫编、目的、市場需求等多方面去了解決策奋隶。
但是下文中擂送,將毫無保留的帶你掌握無數(shù)大神程序員多年工作總結(jié)的寶貴經(jīng)驗,有助于你少走彎路寫出更優(yōu)秀的代碼唯欣,提升編程效率嘹吨。
甚至很多在職多年的程序員也無法全部掌握,都是通過血與淚的踩坑才逐漸意識到境氢。
1. 寫代碼前先做好計劃
項目需求下來后蟀拷,第一要點就是溝通確認清楚需求,做好構(gòu)思萍聊,把可能出現(xiàn)的細節(jié)問題溝通清楚问芬,避免后期返工。
寫代碼前寿桨,先把思路理清此衅,整理好邏輯結(jié)構(gòu)。
基礎級的計劃:
要輸入和輸出什么數(shù)據(jù)亭螟?
預期結(jié)果是什么挡鞍?
流程中涉及哪些步驟?
需要哪些數(shù)據(jù)結(jié)構(gòu)预烙?
是否有需要考慮的邊緣情況墨微?(例如某個值不能超出一定的范圍、字符串不能為空之類)
事先通過上面的方法過一遍邏輯可能花不了你多少時間扁掸,但可以幫你避免不少事后產(chǎn)生問題帶來的煩惱翘县。
進階級的計劃:
詳細的了解分析待解決的需求與問題。(根據(jù)需求大致規(guī)劃細節(jié)后也糊,在進一步與產(chǎn)品經(jīng)理溝通細節(jié)問題)
可以提前做個草稿模擬大致的代碼結(jié)構(gòu)炼蹦。
仔細思考好每段代碼用來實現(xiàn)什么效果。
繪制流程圖狸剃、泳道圖等圖標來幫助可視化的呈現(xiàn)整體邏輯掐隐。
代碼編寫完根據(jù)擬定的流程重新審視一遍代碼。
做好代碼注釋,便于其他人理解邏輯虑省。
如果流程復雜且時間充裕匿刮,也可以根據(jù)上面的方法試一試。
2. 使用有意義的變量與函數(shù)名稱
變量與函數(shù)的命名一直是程序員日常工作中的一大難題探颈。
但是一個易于閱讀與理解的名稱還是十分必要的熟丸。
應當根據(jù)當前變量與函數(shù)所代表的功能設置對應的英文名稱。
優(yōu)化前:
let x, y, z;
function f() {
// 省略具體函數(shù)功能
}
上方的例子往往很難理解x伪节,y光羞,z,f()具體代表什么怀大,甚至你自己過一段時間再來回顧都難以理解纱兑。
優(yōu)化后:
let firstName, lastName;
function printFullName(firstName, secondName) {
// 省略具體函數(shù)功能
}
優(yōu)化后,就能很容易的理解這段代碼是讓你輸入姓氏與名稱化借,然后通過函數(shù)最終輸出完成的姓名潜慎。
下面是幾種最常用的命名規(guī)則:
駝峰法:將單詞拼接在一起,除第一個單詞外蓖康,每個單詞都以大寫字母開頭铐炫。(例如: firstName, lastName蒜焊, printFullName)
Pascal法:與駝峰法類似倒信,但第一個單詞也是大寫的。(例如:FirstName山涡, LastName堤结, PrintFullName)
蛇型法:所有單詞都是小寫,但是通過下劃線分隔鸭丛。(例如:first_name竞穷、last_name、print_full_name)
Kebab法:類似蛇型法鳞溉,但是通過橫線作為分隔瘾带。(例如:first-name、last-name熟菲、print-full-name)
一個項目最好只選擇一種命名法看政,并保持下去。
當變量或函數(shù)所表示的意義較為復雜時抄罕,最好在聲明的時候在旁邊通過注釋解釋清楚具體細節(jié)允蚣。
let firstName; // firstName 名稱 (不允許超過4個字)
let lastName; // lastName 姓氏
// 根據(jù)輸入的姓氏與名稱拼接,并顯示在頁面中
function printFullName(firstName, secondName) {
}
命名的一些小技巧:
符合描述呆贿,貼合對應的變量與函數(shù)嚷兔。
盡量避免單個字母的名稱森渐,除非是大眾化認知的名稱,例如for循環(huán)中命名i作為索引冒晰。
易于記憶與拼寫同衣,盡量簡潔。
整個項目同類命名盡量一致壶运,但要避免同一作用域內(nèi)重復聲明導致覆蓋耐齐。
3. 編寫模塊化函數(shù)
作為程序員日常難以避免與函數(shù)打交道。函數(shù)有助于將一個復雜需求拆分成多個小部分蒋情,單獨管理埠况。
優(yōu)質(zhì)的函數(shù)有助于測試、調(diào)試和復用恕出。同時還能提升代碼可讀性询枚,每個函數(shù)的作用目的都是明確的。
優(yōu)化前:
function multiplySquaredNumbers(x, y) {
let xSquared = x * x;
let ySquared = y * y;
return xSquared * ySquared;
}
console.log(multiplySquaredNumbers(5, 6)); //最終輸出 360
上方的函數(shù)針對兩個參數(shù)的平方值進行相乘浙巫,試想一下我們是不是可以將求平方值再次封裝成一個函數(shù)?
優(yōu)化后:
function multiplySquaredNumbers(num1, num2) {
return Math.pow(num1, 2) * Math.pow(num2, 2);
}
console.log(multiplySquaredNumbers(2, 3));
這是使用了JavaScript提供的Math.pow()函數(shù)替代原本的平方值獲取刷后,我們可以再試試自己來實現(xiàn)這個求平方值的函數(shù)的畴。
動動手:
function square(num) {
return num * num;
}
function multiplySquaredNumbers(num1, num2) {
return square(num1) * square(num2);
}
console.log(multiplySquaredNumbers(5, 6));
此時我們通過生成square()函數(shù),將求平方值這個小需求封裝起來尝胆,方便調(diào)試與復用丧裁。
當然日常編程過程中,可根據(jù)需求自行拆分函數(shù)含衔,同時我們也應該盡量使用代碼底層已經(jīng)幫我們聲明好的函數(shù)煎娇。例如上例中的Math.pow()贪染,盡量避免重復造輪子缓呛。
編寫函數(shù)我們還要注意:
使用規(guī)范的命名。
避免函數(shù)產(chǎn)生副作用杭隙。(例如將數(shù)組作為參數(shù)傳入票髓,最后調(diào)整了數(shù)組順序蜗细,導致其他地方使用時產(chǎn)生循序錯誤問題。在命名函數(shù)時要定義好適用范圍,如果本身就是為了調(diào)整順序的函數(shù)那是正確的善玫,如果是作為過濾數(shù)據(jù)的函數(shù)結(jié)果變更了順序或渤,那就回產(chǎn)生問題)
考慮好參數(shù),避免過多不必要的參數(shù)
上面的例子只是基礎的演示,如何寫出更優(yōu)質(zhì)的函數(shù)還可以多了解一些《設計模式》相關(guān)知識池磁,結(jié)合使用能讓你的函數(shù)更具性能與通用性华临。
如果覺得教程文字太過于枯燥雅潭,也可以試試《JavaScript 函數(shù)式編程》這種游戲化函數(shù)式編程教學體驗核偿。
4. 適當使用數(shù)據(jù)結(jié)構(gòu)
數(shù)據(jù)結(jié)構(gòu)是將數(shù)據(jù)分組的最有效的辦法。
數(shù)據(jù)結(jié)構(gòu)有許多不同的類型,但最常見的是數(shù)組和對象振亮。
數(shù)組是數(shù)據(jù)列表。它們可用于存儲任何類型的數(shù)據(jù)褒搔,但數(shù)組中的每個項目必須具有相同的類型惧辈。
數(shù)組使用方括號聲明:
const arr = ['a', 'b', 'c'];
對象是使用鍵值來整理數(shù)據(jù)的集合念逞。鍵用于索引訪問值莱睁,這些值可以是任何類型的數(shù)據(jù)。
對象使用大括號聲明:
const obj = {
key1: 'value1',
key2: 'value2',
key3: 'value3',
};
適當?shù)氖褂脭?shù)據(jù)結(jié)構(gòu)琳彩,能提升代碼的可讀性與效率露乏。能幫助你更快速的獲取到所需要的對應的值驹止。
優(yōu)化前:
let dog1 = '小強';
let dog2 = '鹵蛋';
let dog3 = '臘腸';
let dog4 = '二蛋';
let dog5 = '狗勝';
優(yōu)化后:
const dogGroup = ['小強', '鹵蛋', '臘腸', '二蛋', '狗勝'];
優(yōu)化后臊恋,通過遍歷數(shù)組中的數(shù)據(jù)就能快速獲取小狗們的名稱抖仅,不需要在逐個調(diào)取變量厂画。
可以通過《JavaScript 基本數(shù)據(jù)結(jié)構(gòu)》欲虚,了解更多數(shù)據(jù)結(jié)構(gòu)相關(guān)知識欣喧。
5. 養(yǎng)成寫注釋的習慣
注釋是未執(zhí)行的代碼浅辙。
程序員可以通過寫注釋來幫助自己或者他人理解代碼的邏輯。
不同語言的注釋方式有所不同盛正,文中我們以JavaScript舉例严望。
// 表示單行注釋
/*
表示多行注釋
表示多行注釋
表示多行注釋
*/
好的注釋習慣有助于:
幫助自己或者他人更快的理解代碼邏輯與含義。
幫助自己留下代碼實現(xiàn)與修復記錄骨饿,便于后期理解览爵。
使用注釋的小幫手:
使用注釋來解釋您的代碼正在做什么以及為什么要這樣做蔚携。
使用注釋來記錄自己關(guān)于需要完成或修復的事情的筆記堕澄。
使用注釋來解釋復雜或不明顯的代碼枉证。
使用注釋來增強可讀性代碼。
在編寫代碼的時候就添加注釋肮砾,而不是過后吃环,因為往往沒有過后。
不要過度注釋您的代碼洋幻,保持剛需郁轻。
在評論中使用清晰簡潔的語言。
注釋內(nèi)容盡量說人話文留。
使用代碼使注釋保持最新好唯。如果您更改代碼,請更改注釋燥翅。
刪除過時的注釋骑篙。
由于篇幅過長,本文將分為上/下兩篇森书。
上篇更多介紹了編程基礎技巧靶端;
下篇則更側(cè)重于實戰(zhàn)中的應用。