🚩 Problem
Một trong những dấu hiệu cho thấy code cần được “phòng thủ tốt hơn” là các khối điều kiện bị lặp lại.
Ví dụ:
if (a)
{
if (b)
{
isValid = true;
}
}
if (c)
{
if (b)
{
isValid = true;
}
}
Vấn đề ở đây là:
- Cùng một điều kiện
bđược kiểm tra nhiều lần, - Logic khó bảo trì, dễ sai nếu cần thay đổi,
- Và không thể hiện rõ ý định lập trình (intention).
✅ Solution — Hợp nhất điều kiện
Để cải thiện, ta có thể gom điều kiện lặp lại theo các cách khác nhau, tùy vào mức độ phức tạp của logic.
Cách 1: Di chuyển điều kiện chung ra ngoài
if (b)
{
if (a)
{
isValid = true;
}
if (c)
{
isValid = true;
}
}
Cách 2: Dùng toán tử logic OR (||)
if (b)
{
if (a || c)
{
isValid = true;
}
}
Cách 3: Biểu thức logic một dòng
isValid = (b && (a || c));
Ba cách trên đều thể hiện mục tiêu chung:
👉 Code dễ hiểu, giảm trùng lặp, và thể hiện rõ mối quan hệ giữa các điều kiện.
💻 Example
Giả sử bạn có logic xác thực người dùng trong hệ thống:
Old Way
private void AuthenticateUser()
{
bool isUserAuthenticated = true;
bool hasRequiredPermission = false;
bool hasValidSubscription = true;
bool isValidAccess = false;
// Cách cũ: kiểm tra riêng lẻ, lặp lại điều kiện
if (isUserAuthenticated)
{
if (hasRequiredPermission)
{
isValidAccess = true;
}
}
if (hasValidSubscription)
{
if (isUserAuthenticated)
{
isValidAccess = true;
}
}
Console.WriteLine($"Is User Valid Access (Old Way): {isValidAccess}");
}
Better Way – First Approach
private void AuthenticateUser_First_Approach()
{
bool isUserAuthenticated = true;
bool hasRequiredPermission = false;
bool hasValidSubscription = true;
bool isValidAccess = false;
if (isUserAuthenticated)
{
if (hasRequiredPermission)
{
isValidAccess = true;
}
if (hasValidSubscription)
{
isValidAccess = true;
}
}
Console.WriteLine($"Is User Valid Access (First Approach): {isValidAccess}");
}
Better Way – Second Approach
private void AuthenticateUser_Second_Approach()
{
bool isUserAuthenticated = true;
bool hasRequiredPermission = false;
bool hasValidSubscription = true;
bool isValidAccess = false;
if (isUserAuthenticated)
{
if (hasRequiredPermission || hasValidSubscription)
{
isValidAccess = true;
}
}
Console.WriteLine($"Is User Valid Access (Second Approach): {isValidAccess}");
}
Better Way – Third Approach (Best Practice)
private void AuthenticateUser_Third_Approach()
{
bool isUserAuthenticated = true;
bool hasRequiredPermission = false;
bool hasValidSubscription = true;
bool isValidAccess = (isUserAuthenticated && (hasRequiredPermission || hasValidSubscription));
Console.WriteLine($"Is User Valid Access (Third Approach): {isValidAccess}");
}
Demo
void Main()
{
AuthenticateUser();
AuthenticateUser_First_Approach();
AuthenticateUser_Second_Approach();
AuthenticateUser_Third_Approach();
}
💬 Kết luận
Việc hợp nhất điều kiện giúp:
- Loại bỏ trùng lặp logic
- Làm cho code gọn gàng và dễ đọc hơn
- Dễ kiểm thử và bảo trì
Đây là một phần quan trọng trong triết lý Defensive Programming:
“Đừng để code của bạn bị chính logic lặp lại tấn công.”
🔍 Khi nào nên hợp nhất điều kiện
- Khi cùng một điều kiện được kiểm tra ở nhiều nơi.
- Khi bạn thấy có mối quan hệ logic rõ ràng giữa các điều kiện.
- Khi muốn giảm số lượng nhánh
ifvà làm code phẳng hơn.