2013-02-21 36 views
11

Tôi đang viết một số mã C++ và tôi muốn gọi hai chức năng (checkXDirtycheckYDirty) và trả lại true nếu trả lại true. Tôi cần phải đánh giá cả hai ngay cả khi một trả về true, vì vậy suy nghĩ đầu tiên của tôi là sử dụng(bool | bool) có an toàn không?

return checkXDirty() | checkYDirty(); 

Điều này có vẻ hơi lạ (bẩn, có lẽ). Điều này có luôn tạo ra kết quả chính xác trong C++ không? Điều gì về C, với loại _Bool? (Mã này có thể sẽ được điều chỉnh cho cả hai ngôn ngữ và tôi không muốn những điều bất ngờ khó chịu khi tôi chuyển mã).

+3

Okey, okey. Vâng, tôi sẽ nói rằng đây là ý tưởng tồi khi có các hàm 'isSomething()' với các hiệu ứng phụ. – Andrey

+0

@Andrey: Tốt. Thay vào đó, tôi sẽ đổi tên các hàm thành 'check ...'. – nneonneo

+2

@MitchWheat chúng có bitwise HOẶC chính xác để tránh đánh giá ngắn mạch. – juanchopanza

Trả lời

46

tôi cần phải đánh giá cả thậm chí nếu một trả về true, vì vậy suy nghĩ đầu tiên của tôi là sử dụng ...

Sau đó ngừng cố gắng để được khôn lanh và làm cho phù hợp với mã của bạn trong khi vài dòng càng tốt . Chỉ cần gọi cho cả hai chức năng và làm cho nó rõ ràng rằng họ cần phải được gọi là:

const bool x_dirty = is_x_dirty(); 
const bool y_dirty = is_y_dirty(); 
return x_dirty || y_dirty; 

Tiếp theo, đổi tên hoặc phá vỡ chức năng của bạn như is_xxx_dirty thực sự không nên sản xuất tác dụng phụ. Mã của bạn khó bảo trì hơn do kết quả là

+0

Tôi đổi tên chúng thành 'check * 'vì' is * 'gây hiểu nhầm. Cảm ơn. – nneonneo

+3

@nneonneo: Tôi sẽ nói điều đó vẫn còn gây hiểu lầm. Tôi sẽ không mong đợi một trong những chức năng đó để tạo ra các tác dụng phụ. –

+4

+1 Tôi đã từng thử cùng một bản hack với '|' và quên thứ tự đánh giá quan trọng đối với mã của tôi. –

8

Miễn là các giá trị không xác định, về mặt kỹ thuật, việc sử dụng các toán tử bitwise về mặt kỹ thuật là OK. Tuy nhiên, vì đó là vấn đề với tư cách là một thói quen mã hóa chung, thay vào đó tôi chỉ viết một hàm OR-inline nhỏ và cho phép trình biên dịch tối ưu hóa. Trình biên dịch là tốt tại tối ưu hóa, vì vậy, để cho nó.

return eitherOrBothTrue(checkXDirty(), checkYDirty()); 

Hoặc có lẽ, nếu bạn là táo bạo và dám đảm nhận thách thức trong việc giải thích các code để những người sẽ duy trì nó,

return !bothFalse(checkXDirty(), checkYDirty()); 

Hoặc bây giờ mà tôi đọc câu trả lời @EdS', có lẽ không kém phần tốt để chỉ lưu trữ các giá trị trong các biến, nhưng sau đó thêm const, như sau:

bool const xIsDirty = checkXDirty(); 
bool const yIsDirty = checkYDirty(); 
return xIsDirty || yIsDirty; 
Các vấn đề liên quan