EP5: Defensive Programming: Loại bỏ biến cờ trung gian (Replace Boolean Flags with Clear Expressions)

🚩 Problem

Nhiều lập trình viên có thói quen sử dụng biến cờ (flag) để lưu trạng thái tạm thời trong suốt quá trình xử lý logic.
Ví dụ:

bool isEligible = false;

if (age > 18)
{
    if (hasValidID)
    {
        isEligible = true;
    }
}

Cách viết này hoạt động tốt, nhưng:

  • Làm code dài dòng và khó đọc,
  • Tạo biến trung gian không cần thiết,
  • Và khiến người đọc phải theo dõi thêm trạng thái thay vì chỉ nhìn logic điều kiện.

✅ Solution — Dùng biểu thức điều kiện trực tiếp

Thay vì khai báo và cập nhật biến cờ, hãy gán giá trị trực tiếp bằng biểu thức điều kiện:

bool isEligible = (age > 18 && hasValidID);

Cách viết này giúp:

  • Ngắn gọnrõ ràng hơn,
  • Dễ kiểm thửbảo trì,
  • Thể hiện rõ ý định logic chỉ trong một dòng duy nhất.

💻 Example

Old Way

private void CheckEligibility()
{
    int age = 25;
    bool hasValidID = true;
    bool isEligible = false;

    if (age > 18)
    {
        if (hasValidID)
        {
            isEligible = true;
        }
    }

    Console.WriteLine("Is eligible (old way): " + isEligible);
}

Better Way — Use Clear Expression

private void CheckEligibility_Better()
{
    int age = 25;
    bool hasValidID = true;

    bool isEligible = (age > 18 && hasValidID);

    Console.WriteLine("Is eligible (better way): " + isEligible);
}

Demo

void Main()
{
	CheckEligibility();
	CheckEligibility_Better();
}


🧩 Một ví dụ khác trong thực tế

Giả sử bạn đang kiểm tra xem khách hàng có đủ điều kiện để nhận ưu đãi đặc biệt hay không:

Old Way

private void CheckCustomerPromotion()
{
    bool isLoyalCustomer = true;
    bool hasActiveSubscription = false;
    bool eligibleForPromotion = false;

    if (isLoyalCustomer)
    {
        if (hasActiveSubscription)
        {
            eligibleForPromotion = true;
        }
    }

    Console.WriteLine("Eligible for promotion (old way): " + eligibleForPromotion);
}

Better Way

private void CheckCustomerPromotion_Better()
{
    bool isLoyalCustomer = true;
    bool hasActiveSubscription = false;

    bool eligibleForPromotion = (isLoyalCustomer && hasActiveSubscription);

    Console.WriteLine("Eligible for promotion (better way): " + eligibleForPromotion);
}


💬 Kết luận

Biến cờ (flag variables) thường là dấu hiệu cho thấy code đang mô phỏng quá trình xử lý thay vì biểu diễn logic.
Bằng cách thay thế chúng bằng biểu thức điều kiện rõ ràng, bạn giúp code:

  • Trực quan hơn 🧩
  • Giảm rủi ro sai sót 🔒
  • Và tuân theo nguyên tắc của Defensive Programming: “Đơn giản là an toàn nhất.”

💡 “Nếu bạn có thể nói điều đó bằng một câu, đừng viết cả một đoạn.”


🔍 Khi nào nên loại bỏ biến cờ

  • Khi biến chỉ được dùng một lần để lưu kết quả điều kiện.
  • Khi logic của bạn có thể biểu diễn ngắn gọn bằng một biểu thức boolean.
  • Khi muốn loại bỏ side-effect không cần thiết và tăng tính declarative (mô tả logic thay vì mô phỏng).