在軟體開發中,函數是任何應用程式的構建塊。它們是我們建構邏輯、封裝行為以及將複雜任務劃分為可管理部分的主要方式。
然而,並非所有函數都是一樣的。在《整潔程式碼》的第 3 章中,重點在於寫小任務、重點突出並做好一件事。
在本文中,我們將深入研究這些原則並探索如何在 JavaScript 中應用它們。
乾淨程式碼的一個核心原則是函數應該很小。
但是在這種情況下「小」代表什麼?作者主張函數通常只有幾行長。
這個想法是小函數更容易理解、測試和維護。
讓我們來看一個 JavaScript 範例:
// Bad Example: A large, unfocused function function processOrder(order) { applyDiscount(order); calculateShipping(order); calculateTax(order); generateInvoice(order); sendConfirmationEmail(order); updateInventory(order); }
這個函數雖然看似簡單,但作用太多。這些任務中的每一個都可以而且應該分解為自己的功能。
// Good Example: Small, focused functions function processOrder(order) { applyDiscount(order); calculateShipping(order); calculateTax(order); generateInvoice(order); sendConfirmationEmail(order); updateInventory(order); } function applyDiscount(order) { // Discount logic } function calculateShipping(order) { // Shipping calculation logic } function calculateTax(order) { // Tax calculation logic } function generateInvoice(order) { // Invoice generation logic } function sendConfirmationEmail(order) { // Email sending logic } function updateInventory(order) { // Inventory update logic }
在修改後的範例中,每個函數只做一件事情,使程式碼更易於閱讀和維護。
processOrder 函數現在充當高階協調器,而更小、更集中的函數則處理細節。
一個函數應該要做一件事並且把它做好。如果您發現自己正在編寫執行多個任務的函數,則表示您應該將其重構為更小的函數。
這是一個例子:
// Bad Example: A function doing multiple things function formatAndSendEmail(email, subject, message) { const formattedMessage = `<html><body>${message}</body></html>`; sendEmail(email, subject, formattedMessage); }
雖然這個函數看起來很簡潔,但它做了兩件事:格式化訊息和發送電子郵件。相反,將其分解:
// Good Example: Functions doing one thing function formatMessage(message) { return `<html><body>${message}</body></html>`; } function sendFormattedEmail(email, subject, message) { const formattedMessage = formatMessage(message); sendEmail(email, subject, formattedMessage); }
現在,每個函數都有一個職責,這使得程式碼更易於測試和重複使用。
formatMessage 函數可以獨立於電子郵件傳送邏輯進行測試。
函數應該最大限度地減少副作用,這意味著它們不應該以意想不到的方式改變系統的狀態。有副作用的函數可能更難調試和推理。
這是一個例子:
// Bad Example: A function with a side effect let globalCounter = 0; function incrementCounter() { globalCounter++; }
incrementCounter 函數會變更全域狀態,如果不仔細管理,可能會導致錯誤。
更好的方法是傳回一個新值並讓呼叫者決定如何處理它:
// Good Example: Avoiding side effects function incrementCounter(counter) { return counter + 1; } globalCounter = incrementCounter(globalCounter);
透過避免副作用,您可以讓您的函數更加可預測且更易於使用。
函數應該在單一抽象層級上運行。在同一函數中混合不同層級的細節可能會使其更難以理解。
例如:
// Bad Example: Mixed levels of abstraction function getUserData(userId) { const user = database.fetchUserById(userId); // Low-level return `${user.firstName} ${user.lastName} (${user.email})`; // High-level }
這裡,該函數將低階資料庫取得與使用者資料的高階格式化混合在一起。
最好將這些問題分開:
// Good Example: Single level of abstraction function getUser(userId) { return database.fetchUserById(userId); } function formatUserData(user) { return `${user.firstName} ${user.lastName} (${user.email})`; } const user = getUser(userId); const formattedUserData = formatUserData(user);
現在,每個函數都在單一抽象層級上運行,使程式碼更清晰且更易於維護。
編寫乾淨的函數是編寫可維護程式碼的基石。
透過保持函數較小、確保它們只做一件事、避免副作用以及維護單一抽象級別,您可以創建更易於閱讀、理解和維護的程式碼。
當您繼續磨練 JavaScript 技能時,請牢記乾淨程式碼中的這些原則,以編寫真正體現簡單性和清晰性藝術的函數。
以上是了解乾淨的程式碼:函數 ⚡的詳細內容。更多資訊請關注PHP中文網其他相關文章!