Clean Code #3: Viết và Tối ưu Điều Kiện (P2)
Trong phần 2 của bài viết về việc viết các điều kiện trong lập trình, chúng ta sẽ cùng tìm hiểu về cách làm sạch và tối ưu mã nguồn, giúp cho việc bảo trì và đọc mã trở nên dễ dàng hơn.
7. Tránh Số Ma Thuật (Magic Numbers)
🔴 Ví dụ Kém:
java
if(age > 18) {
// Thực hiện hành động
}
if(status == 2) {
// Thực hiện hành động
}
🟢 Ví dụ Sạch:
java
const int teenager = 16;
if(age > teenager) {
// Thực hiện hành động
}
if(status == Status.Active) {
// Thực hiện hành động
}
Sử dụng số ma thuật không cung cấp ngữ cảnh rõ ràng và có thể gây nhầm lẫn cho người đọc. Thay vào đó, hãy sử dụng hằng số với tên rõ ràng hoặc enum
để tránh lỗi và tăng cường ý nghĩa mã nguồn. Điều này sẽ làm rõ ý định của bạn hơn và giúp code trở nên dễ duy trì hơn.
8. Điều Kiện Phức Tạp
🔴 Ví dụ Kém:
java
if(car.Year > 2020 && (car.Make == "Mazda" || car.Make == "BMW") && car.Odometer > 100000 && (car.Vin.StartWith("V2") || car.Vin.StartWith("IA3"))) {
// Thực hiện hành động
}
a. Sử dụng Biến Trung Gian
🟢 Ví dụ Sạch:
java
const int MinRetirementAge = 55;
const int MinPensionEmploymentYears = 10;
bool eligibleForPension = employee.Age > MinRetirementAge
&& employee.YearsEmployed > MinPensionEmploymentYears
&& employee.IsRetired;
b. Đóng Gói Qua Function/Method
🟢 Ví dụ Sạch:
java
if(ValidFileRequest(fileExtension, isActiveFile, isAdmin)) {
// Thực hiện hành động
}
bool ValidFileRequest(String fileExtension, bool isActiveFile, bool isAdmin) {
return (validFileType(fileExtension) && userIsAllowedToViewFile(isActiveFile, isAdmin));
}
Việc sử dụng các hàm với tên rõ ràng giúp người đọc dễ dàng hiểu được mục đích của đoạn mã mà không cần phải phân tích quá nhiều.
9. Ưu Tiên Đa Hình Hơn Enum Cho Hành Vi
🔴 Ví dụ Kém:
java
void LoginUser(User user) {
switch(User.status) {
case Status.active:
// Logic cho người dùng hoạt động
break;
case Status.inActive:
// Logic cho người dùng không hoạt động
break;
case Status.locked:
// Logic cho người dùng bị khóa
break;
}
}
🟢 Ví dụ Sạch:
java
void LoginUser(User user) {
user.Login();
}
Sử dụng đa hình giúp loại bỏ độ phức tạp và cải thiện khả năng mở rộng trong việc triển khai logic hành vi khác nhau cho các trạng thái khác nhau của người dùng.
10. Sử Dụng Cách Thức Khai Báo Nếu Có Thể
🔴 Ví dụ Kém:
java
List<User> matchingUsers = new List<User>();
forEach(var user in users) {
if(user.AccountBalance < minimumAccountBalance && user.Status == Status.Active) {
matchingUsers.add(user);
}
}
return matchingUsers;
🟢 Ví dụ Sạch:
java
return users.Where(u => u.AccountBalance < minimumAccountBalance && u.Status == Status.Active);
Cách tiếp cận khai báo giúp giảm thiểu mã và làm cho mã dễ đọc và dễ hiểu hơn.
11. Ưu Tiên Điều Kiện Ngắn Gọn
🔴 Ví dụ Kém:
java
if(userStatus == UserStatus.loggedIn) {
// Thực hiện logic cho logged in
} else if (...) {
// Thực hiện logic khác
}
🟢 Ví dụ Sạch:
java
if(userStatus == UserStatus.tutorial) {
AppState.isUserLoggedIn = false;
return;
}
// Các điều kiện khác
Việc sắp xếp các điều kiện ngắn gọn lên trước giúp người đọc dễ dàng hơn trong việc tìm hiểu và xử lý logic.
12. Phương Pháp Dựa Trên Bảng
🔴 Ví dụ Kém:
java
if(goldPrice < 20) {
return 3.4560;
} else if (...) {
}
🟢 Ví dụ Sạch:
Bảng Lạm Phát:
InflationRateId | MaximumPriceGold | Rate |
---|---|---|
1 | 20 | 3.4660 |
2 | 30 | 4.2050 |
java
return Repository.GetInflationRate(goldPrice);
Sử dụng phương pháp dựa trên bảng giúp mã dễ hiểu hơn và giảm thiểu việc thay đổi mã mỗi khi có thay đổi dữ liệu.
Kết Luận:
Viết mã sạch không chỉ giúp cho việc bảo trì mã dễ dàng hơn mà còn tăng cường khả năng đọc hiểu cho người khác. Hãy tránh sử dụng các số ma thuật, đơn giản hóa các điều kiện phức tạp và tận dụng sức mạnh của đa hình và phương pháp khai báo. Cảm ơn bạn đã theo dõi bài viết này. Nếu bạn thấy hữu ích, hãy để lại đánh giá và hẹn gặp lại trong phần tiếp theo! 🚀
source: viblo