EP3: Defensive Programming: Hợp nhất điều kiện lặp lại (Condition Consolidation)

🚩 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,
  • 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 if và làm code phẳng hơn.