JavaScript整潔代碼-函數(shù)參數(shù)和副作用
函數(shù)是JavaScript程序的重要組成部分,用于將代碼分成可重用的塊。因此,為了擁有整潔的JavaScript代碼,我們需要具有易于理解的函數(shù)。
本文將介紹優(yōu)質(zhì)函數(shù)的更多屬性,包括標志參數(shù),二元和三元函數(shù)以及副作用。
標志參數(shù)
布爾參數(shù)應(yīng)謹慎使用。它使函數(shù)簽名更加復(fù)雜,并告訴我們函數(shù)不僅做一件事(具有多個路徑)。
二元函數(shù)
二元函數(shù)比采用較少參數(shù)的函數(shù)更難理解。但有些時候使用二元函數(shù)是有道理的。例如,如果有一個保存笛卡爾坐標的對象,那么它應(yīng)該有2個參數(shù)。
例如,可以創(chuàng)建一個帶有構(gòu)造函數(shù)的類,該構(gòu)造函數(shù)有2個參數(shù),如下所示:
- class Point {
- constructor(x, y) {
- this.x = x;
- this.y = y;
- }
- }const point = new Point(1, 2);
用其他方式定義它幾乎是不可能的。
但是,我們必須要意識到,與使用較少參數(shù)的函數(shù)相比,二元函數(shù)需要更多的時間和精力。
三元函數(shù)
具有3個參數(shù)的函數(shù)要花費大量時間和精力才能理解具有2個參數(shù)的函數(shù)。
如果存在2個或更少的參數(shù),則有更多的參數(shù)組合可供考慮。
將參數(shù)合并為對象
如果一個函數(shù)含有多個參數(shù),應(yīng)該考慮將它們合并為對象。
如果參數(shù)之間有關(guān)聯(lián),則更應(yīng)該這樣做。例如,以下函數(shù)含有許多參數(shù):
- const describeFruit = (color,name, size, price, numSeeds, type) => {
- return `${fruitName} is ${fruitColor}.It's ${fruitSize}. It costs ${price}. It has ${numSeeds}. The type if ${type}`;
- }
6個參數(shù)可能太多,可以通過傳入一個對象來清理它:
- const describeFruit = (fruit)=> {
- return `${fruit.name} is${fruit.color}. It's ${fruit.size}. It costs ${fruit.price}. It has${fruit.numSeeds}. The type if ${fruit.type}`;
- }
如我們所見,它更加整潔,且無需擔心大量參數(shù)的傳遞。
由于函數(shù)較為短小,因此也更適合屏幕顯示。
5個參數(shù)可能是一個函數(shù)應(yīng)該包含的最大值。
來源:Pexels
動詞和關(guān)鍵詞
將動詞和關(guān)鍵字包含在函數(shù)名稱中不失為一個好主意,因為它們會執(zhí)行某些操作,這意味著名稱中的動詞是合理的。
另外,我們需要知道執(zhí)行操作的對象。這意味著必須添加一些關(guān)鍵字才能做到這一點。
例如,符合這一點的優(yōu)質(zhì)函數(shù)定義類似于:
- const copyArray = (array) =>[...array];
copyArray 名稱讓我們知道函數(shù)復(fù)制了一個數(shù)組。
它還讓我們知道要傳遞給函數(shù)的內(nèi)容,這顯然是一個數(shù)組。
無副作用
副作用是函數(shù)中的代碼會對函數(shù)外部的內(nèi)容進行更改。
這是很糟糕的,因為它會對函數(shù)之外的內(nèi)容進行隱藏更改。
我們應(yīng)該盡可能避免這種情況,因為這會造成一些出乎意料的事情,并且要花更多的時間進行測試,因為除了接受參數(shù),執(zhí)行操作并返回結(jié)果外,它還對必須考慮的函數(shù)之外的內(nèi)容進行了更改。
這意味著我們必須測試函數(shù)返回結(jié)果之外的內(nèi)容。
例如,如果有:
- let numFruits = 1;
- const addFruit = () => {
- numFruits++;
- }const removeFruit = () => {
- numFruits--;
- }
那么我們有2個具有副作用的函數(shù),因為它們都更改了各自函數(shù)外部的 numFruits變量。
編寫這些函數(shù)的更好方法是將它們編寫為純函數(shù)。純函數(shù)是在傳入相同參數(shù)的情況下返回相同內(nèi)容的函數(shù)。而且,它沒有副作用。
因此,純函數(shù)更易于測試,并且它們的行為也是可以預(yù)測的。
重寫上面的代碼,如下所示:
- let numFruits = 1;
- const addFruit = (numberOfFruits) => numberOfFruits + 1;
- const removeFruit = (numberOfFruits) => numberOfFruits - 1;numFruits = addFruit(numFruits);
- numFruits = removeFruit(numFruits);
現(xiàn)在,有2個函數(shù)來接收numFruits 參數(shù),并分別返回一個更大或更小的數(shù)字。
然后可以使用它們來更改函數(shù)外部的numFruits變量。
如我們所見,它們對 numFruits 不執(zhí)行任何操作,而是分別返回numberOfFruits參數(shù)加1或減1。
如果為它們編寫測試,則可以通過傳入輸入和檢查輸出是否是我們想要的內(nèi)容來輕松測試它們。這比將副作用賦予可能適用于測試代碼的變量要好得多。
來源:Pexels
標志參數(shù)應(yīng)最小化。他們告訴我們,該函數(shù)不僅完成一件事情,而且是函數(shù)簽名中的另一個參數(shù)。
使用較少參數(shù)的函數(shù)要優(yōu)于使用較多參數(shù)的函數(shù)。如果需要很多參數(shù),請考慮將它們合并成一個對象。
最后,若條件允許,應(yīng)盡量避免副作用。具有副作用的函數(shù)會執(zhí)行隱藏操作,并且很難對它進行測試。純函數(shù)不會產(chǎn)生副作用,因此更具可測試性和可預(yù)測性。