2016-03-04 61 views
1

爲避免將大量參數傳遞到函數中,Node/Javascript中推薦的模式的最佳做法是什麼?避免在JavaScript中傳遞大量參數的最佳做法

function create(firstName, lastName, address, phoneNumber, username, password, dateOfBirth, age) { 
    ... 
} 

它應該帶入一個對象嗎?

const input = { 
    firstName: 'John', 
    lastName: 'Doe', 
    ... 
}; 

function create(input) { 
} 

的對象似乎很容易出錯,因爲沒有關於它應該包含屬性和鍵值名的數量沒有驗證。

+0

對於您傳遞的參數數量沒有任何驗證。你可以定義一個函數,它不接受任何參數,並且仍然傳遞一些東西給它,請注意你有一個名爲'arguments'的默認對象,你仍然可以訪問這些「隱藏的」參數。根本沒有任何驗證,除了你在js中做的任何事情。 – scrappedcola

回答

1

一個對象似乎很容易出錯,因爲它不應該包含屬性 和密鑰。

我可以將一個函數和一個HTML元素傳遞給你的第一個函數;它可能會失敗。

它的核心是任何腳本語言的基本問題。知道你搞砸了一個函數的唯一方法通常是運行時錯誤。一旦編碼正確,那不是什麼問題。

請注意,像TypeScript這樣的語言對於希望在「編譯時」執行這種正確性的人很有幫助。

0

如果你喜歡你的例子,你可以使用Object.keys(input)訪問密鑰,然後你可以檢查長度或做額外的驗證。你可以看到,如果財產至少3個字符使用類似:

var keys = Object.keys(input); 
keys.every(function(key) { 
    return key.length > 3; 
}); 
1

它應該在的對象?

節點幾乎專用於Web服務器。在這種情況下,你的入口點是典型的req.body,一個對象。到底誰知道那個物體上有什麼?所以,你在服務器前面錯誤句柄:

function bindUser(postBody, callback) { 

    var user = {}; 

    if (!postBody.firstName) { 
     return callback(new Error("Missing firstName")); 
    } 
    user.firstName = postBody.firstName; 

    if (!postBody.lastName) { 
     return callback(new Error("Missing lastName")); 
    } 
    user.lastName = postBody.lastName; 

    if (!postBody.email) { 
     return callback(new Error("Missing email")); 
    } 
    user.email = postBody.email.toLowerCase(); 

    callback(null, user); 
} 

恭喜,你已經有了一個已知的對象,和你的未來調試具有一致的起點。現在您構建了執行一項特定任務的輔助函數,例如合併全名:

function combineName(firstName, lastName) { 
    return firstName + " " + lastName; 
} 
user.fullName = combineName(user.firstName, user.lastName); 

將您的錯誤處理集中在不完全包含的環境(即I/O和外部模塊)的位置。除此之外,保持你的功能小而特殊,他們不需要10個參數和大量的警衛。你將來的調試自我會感謝你。

所以專門解決這個問題:

什麼是節點/ JavaScript中的最佳實踐建議模式,以避免將大量的參數成函數?

設計你的應用程序,使函數不需要10個參數。

相關問題