Xem xét chức năng này, mà bạn có thể nghĩ đến như một bảng sự thật:Làm cách nào để tránh trạng thái boolean không thể thực hiện được trong C#?
public Foo doSomething(bool a, bool b) {
if (a && b) return doAB();
else if (a && !b) return doA();
else if (!a && b) return doB();
else if (!a && !b) return doNotANotB();
else throw new Exception("Well done, you defeated boolean logic!");
}
Trình biên dịch khăng khăng rằng else
khoản cuối cùng. Nhưng từ quan điểm của một bảng chân lý, đó là một trạng thái không thể.
Có, nó hoạt động, và có, tôi có thể sống với nó. Nhưng tôi tự hỏi nếu có một số cơ chế trong C# để tránh loại mã này, hoặc nếu tôi đã bỏ lỡ một cái gì đó hiển nhiên?
UPDATE:
Đối với điểm thưởng, và hoàn toàn ra khỏi tò mò, là có bất kỳ ngôn ngữ mà đối phó với các loại điều này khác nhau? Có lẽ nó không phải là một vấn đề ngôn ngữ, mà là một trong những trình biên dịch thông minh (nhưng các trường hợp cạnh sẽ phức tạp không tưởng tượng được).
Có, có tôi s cơ chế như vậy: chỉ cần thả điều kiện của 'if' cuối cùng. – dasblinkenlight
Rất đúng! Pun dự định. Nhưng nếu có thể, tôi muốn mã được "dễ đọc" hoặc "biểu cảm". Hãy ghi nhớ đây là một ví dụ đơn giản. Và trong 7 tháng, tôi sẽ gãi đầu khi tự hỏi mình đang nghĩ gì khi viết nó (vì thế ưu tiên cho mã biểu cảm). –
Nếu các hành động không liên quan đến eachother, tôi sẽ không sử dụng mẫu 'if/else if', mà thay vào đó hãy chọn bốn khối' if' riêng biệt sau khi ném ngoại lệ để thỏa mãn trình biên dịch. Tuy nhiên, trong hầu hết các trường hợp, có một hành động 'mặc định' phù hợp hoàn hảo với một 'else' trống. –