寫出 Clean Code 的一些技巧&原則

介紹

編寫乾淨的程式碼是每個軟體開發人員的基本技能。乾淨的程式碼不僅使您的程式碼庫更易於維護和理解,而且還能促進團隊成員之間的協作。在這篇綜合文章中,我們將探討什麼是乾淨的程式碼、為什麼它很重要,並為您提供一組最佳實踐和原則來幫助您編寫乾淨且可維護的程式碼。

原文出處:https://dev.to/favourmark05/writing-clean-code-best-practices-and-principles-3amh

什麼是乾淨程式碼?

乾淨的程式碼是易於閱讀、易於理解且易於修改的程式碼。它是沒有不必要的複雜性、冗餘和混亂的程式碼。乾淨的程式碼遵循一組約定和最佳實踐,使其更加一致,使多個開發人員更容易無縫地處理同一個專案。

為什麼乾淨的程式碼很重要?

可讀性:乾淨的程式碼易於閱讀,這意味著任何人 - 包括未來的你 - 都可以快速理解它。這減少了掌握程式碼功能所需的時間,從而加快了開發和除錯速度。

可維護性:程式碼的讀取次數多於編寫次數。當您編寫乾淨的程式碼時,隨著時間的推移,維護和擴展應用程式將變得更加容易。這在軟體開發生命週期中至關重要,因為專案經常發展和成長。

協作:簡潔的程式碼鼓勵協作。當您的程式碼乾淨且組織良好時,其他團隊成員就可以有效地處理它。這使得劃分任務和同時處理程式碼庫的不同部分變得更容易。

減少錯誤:乾淨的程式碼可以減少引入錯誤的可能性。難以理解的程式碼在修改或增強過程中更容易出錯。

效率:乾淨的程式碼就是高效率的程式碼。它通常執行速度更快並且使用更少的資源,因為它避免了不必要的操作和複雜性。

現在我們了解了為什麼乾淨的程式碼很重要,讓我們深入研究一些最佳實踐和原則來幫助您編寫乾淨的程式碼。

編寫簡潔程式碼的最佳實踐和原則

有意義的變數和函數名稱

對變數、函數、類別和其他辨識碼使用描述性名稱。精心選擇的名稱可以傳達實體的目的,使程式碼更容易理解。避免使用單字母變數名或神秘的縮寫。

# Bad variable name

x = 5

# Good variable name

total_score = 5

保持函數和方法簡短

函數和方法應該簡潔並專注於單一任務。單一職責原則(SRP)指出,一個函數應該要做一件事,並且把它做好。較短的函數更容易理解、測試和維護。如果函數變得太長或太複雜,請考慮將其分解為更小、更易於管理的函數。

// Long and complex function

function processUserData(user) {

// Many lines of code...

}

// Refactored into smaller functions

function validateUserInput(userInput) {

// Validation logic...

}

function saveUserToDatabase(user) {

// Database operation...

}

評論和文件

謹慎使用評論,當你使用評論時,要讓它們變得有意義。程式碼應該盡可能不言自明。文件(例如內嵌註解和自述文件)可協助其他開發人員了解程式碼的目的和用法。記錄複雜的演算法、重要的決策和公共 API。

# Bad comment

x = x + 1 # Increment x

# Good comment

# Calculate the total score by incrementing x

total_score = x + 1

一致的格式和縮排

堅持一致的編碼風格和縮排。這使得程式碼庫看起來乾淨且有組織。大多數程式語言都有社群接受的編碼標準(例如,Python 的 PEP 8、JavaScript 的 eslint),您應該遵循。一致性也適用於命名約定、間距和程式碼結構。

// Inconsistent formatting

if(condition){

doSomething();

} else {

doSomethingElse();

}

// Consistent formatting

if (condition) {

doSomething();

} else {

doSomethingElse();

}

DRY(不要重複)原則

避免重複程式碼。重複的程式碼更難維護並增加不一致的風險。將通用功能提取到函數、方法或類別中以提高程式碼的可重複使用性。當您需要進行更改時,只需在一個地方進行即可。

假設您正在開發一個 JavaScript 應用程式來計算購物車中商品的總價。最初,您有兩個單獨的函數來計算每種商品類型的價格:一個用於計算一本書的價格,另一個用於計算筆記型電腦的價格。這是初始程式碼:

function calculateBookPrice(quantity, price) {

return quantity * price;

}

function calculateLaptopPrice(quantity, price) {

return quantity * price;

}

雖然這些函數有效,但它們違反了 DRY 原則,因為計算總價的邏輯對於不同的商品類型是重複的。如果您有更多的專案類型需要計算,您最終將重複此邏輯。為了遵循DRY原則,提高程式碼的可維護性,可以對程式碼進行如下重構:

function calculateItemPrice(quantity, price) {

return quantity * price;

}

const bookQuantity = 3;

const bookPrice = 25;

const laptopQuantity = 2;

const laptopPrice = 800;

const bookTotalPrice = calculateItemPrice(bookQuantity, bookPrice);

const laptopTotalPrice = calculateItemPrice(laptopQuantity, laptopPrice);

在此重構的程式碼中,我們有一個calculateItemPrice函數,它根據作為參數提供的數量和價格計算任何商品類型的總價。這遵循了 DRY 原則,因為計算邏輯不再重複。

現在,您可以通過使用適當的數量和價格值呼叫calculateItemPrice來輕鬆計算書籍、筆記本電腦或任何其他商品類型的總價。這種方法提高了程式碼的可重用性、可讀性和可維護性,同時降低了重複程式碼引起的錯誤風險。

使用有意義的空白

使用空格和換行符正確設置程式碼格式。這增強了可讀性。使用空格來分隔程式碼的邏輯部分。格式良好的程式碼更容易瀏覽,減少讀者的認知負擔。

// Poor use of whitespace

const sum=function(a,b){return a+b;}

// Improved use of whitespace

const sum = function (a, b) {

return a + b;

}

錯誤處理

優雅地處理錯誤。在程式碼中使用適當的 try-catch 塊或錯誤處理機制。這可以防止意外崩潰並為除錯提供有價值的訊息。不要抑制錯誤或在沒有正確響應的情況下簡單地記錄錯誤。

// Inadequate error handling

try {

result = divide(x, y);

} catch (error) {

console.error("An error occurred");

}

// Proper error handling

try {

result = divide(x, y);

} catch (error) {

if (error instanceof ZeroDivisionError) {

console.error("Division by zero error:", error.message);

} else if (error instanceof ValueError) {

console.error("Invalid input:", error.message);

} else {

console.error("An unexpected error occurred:", error.message);

}

}

測試

編寫單元測試來驗證程式碼的正確性。測試驅動開發 (TDD) 可以迫使您預先考慮邊緣情況和預期行為,從而幫助您編寫更清晰的程式碼。經過良好測試的程式碼更加可靠並且更容易重構。

// Example using JavaScript and the Jest testing framework

test('addition works correctly', () => {

expect(add(2, 3)).toBe(5);

expect(add(-1, 1)).toBe(0);

expect(add(0, 0)).toBe(0);

});

重構

定期重構你的程式碼。隨著需求的變化以及您對問題域的理解的加深,請相應地調整您的程式碼。隨著專案的發展,重構有助於保持乾淨的程式碼。必要時不要害怕重新存取和改進現有程式碼。

假設您有一個函數,可以計算購物車中具有固定折扣百分比的商品的總價:

function calculateTotalPrice(cartItems) {

let totalPrice = 0;

for (const item of cartItems) {

totalPrice += item.price;

}

return totalPrice - (totalPrice * 0.1); // Apply a 10% discount

}

最初,此函數計算總價並應用 10% 的固定折扣。然而,隨著專案的發展,您意識到您需要支持可變折扣。為了重構程式碼使其更加靈活,可以引入折扣參數:

function calculateTotalPrice(cartItems, discountPercentage) {

if (discountPercentage < 0 || discountPercentage > 100) {

throw new Error("Discount percentage must be between 0 and 100.");

}

let totalPrice = 0;

for (const item of cartItems) {

totalPrice += item.price;

}

const discountAmount = (totalPrice * discountPercentage) / 100;

return totalPrice - discountAmount;

}

在這段重構的程式碼中:

我們在calculateTotalPrice函數中新增了discountPercentage參數,讓您在呼叫函數時指定折扣百分比。

我們對discountPercentage 參數進行驗證,以確保其落在有效範圍內(0 到100%)。如果不在範圍內,我們會拋出錯誤。

折扣計算現在基於提供的discountPercentage,使功能更加靈活,能夠適應不斷變化的需求。

通過這種方式重構程式碼,你提高了它的靈活性和可維護性。您可以輕鬆地調整該函數來處理不同的折扣場景,而無需重寫整個邏輯。這證明了隨著專案的發展和需求的變化定期進行程式碼重構的重要性。

版本控制

使用 Git 等版本控制系統來跟踪程式碼更改。這使您可以與團隊成員有效協作,在必要時恢復到以前的版本,並維護專案開發的清晰歷史記錄。 Git 提供了程式碼審查、分支和合併工具,促進協作和程式碼整潔。

結論

編寫乾淨的程式碼不僅僅是一套規則,更是一種心態和紀律。它是關於建立易於閱讀、維護和擴展的軟體。通過遵循這些最佳實踐和原則,您可以成為一名更熟練的開發人員,生成高質量的程式碼。投入時間仔細檢查其他工程師的程式碼庫,特別是在開源專案中,可能是一種啟發性的體驗。通過這種探索,您將獲得對不同編碼風格和策略的寶貴見解。這種接觸使您能夠提煉出編寫原始、可持續程式碼庫的精髓。請記住,乾淨的程式碼是一個持續的旅程,通過練習,它會成為第二天性,從而實現更高效、更愉快的軟體開發。

[an error occurred while processing the directive]