Nhấn mạnh phủ định


13

Tôi chỉ đang viết một câu lệnh if với tên thuộc tính khá dài và gặp phải vấn đề này.

Giả sử chúng ta có một câu lệnh if như thế này:

if(_someViewModelNameThatIsLong.AnotherPropertyINeedToCheck == someValue &&
   !_someViewModelNameThatIsLong.ThisIsABooleanPropertyThatIsImportant)
{
    //Do something
}

Thuộc tính thứ hai thuộc loại boolean và không có nghĩa là có sự sắp xếp như

if(boleanValue == true)

Có cách nào tốt hơn để nhấn mạnh sự phủ định sau đó để đặt !phía trước. Đối với tôi có vẻ như điều này có thể dễ dàng bị giám sát khi đọc mã và có thể gây ra vấn đề với việc gỡ lỗi


7
Trích xuất điều kiện thành một phương thức với một tên có ý nghĩa.
Joachim Sauer

2
... hoặc gán giá trị phủ định cho một biến có tên có ý nghĩa và sử dụng nó trong điều kiện if thay thế.
Scrwtp

+1 những gì @JoachimSauer đã nói, nếu có thể, hãy đặt phương thức đó vào đối tượng đang được truy vấn .. Trong trường hợp này, toàn bộ điều kiện có thể được gói gọn bằng một phương thức trên_someViewModelNameThatIsLong
MattDavey

2
Một điều chung tôi thường làm là bao quanh phủ định với một khoảng trắng ở mỗi bên để làm cho nó rõ hơn. if( ! something)vsif(!something)
Svish

Nếu bạn đang nhấn mạnh phủ định, tại sao không sử dụng ... && model.Prop == false)? Cá nhân tôi rất hiếm khi sử dụng !, nó quá dễ bỏ qua.

Câu trả lời:


22
if(_someViewModelNameThatIsLong.NeedsMeToDoSomething(someValue))
{
    //Do something
}

Và sau đó, trong đối tượng mô hình xem

public bool NeedsMeToDoSomething(string someValue)
{
    return AnotherPropertyINeedToCheck == someValue &&
        !ThisIsABooleanPropertyThatIsImportant;
}

(giả sử someValue là một chuỗi và không được đối tượng mô hình biết đến)

Điều này không chỉ nhấn mạnh! toán tử, nhưng nó làm cho nó dễ đọc hơn nói chung. Bây giờ, trong phương thức gọi, tôi có thể thấy một điều kiện, được đặt tên tốt để mô tả điều kiện trong ngữ cảnh của đối tượng gọi. Và trong đối tượng mô hình, tôi có thể thấy điều đó có nghĩa gì trong ngữ cảnh của đối tượng mô hình.


1
+1, đây là một ứng dụng tốt của nguyên tắc chuyên gia thông tin .
MattDavey

1
Đáng lưu ý, someValuecó thể cần phải là một tham số cho NeedsMeToDoSomethingphương thức, tùy thuộc vào tình huống của bạn.
MattDavey

@MattDavey: Ồ, điểm tốt.
pdr

@pdr Có lẽ bạn nên tạo một thuộc tính cho mô hình khung nhìn đó với cùng boolean và sử dụng lại cờ đó ở nhiều nơi hơn. Tôi chắc chắn bạn sẽ thấy nó tiện dụng.
radu florescu

5

Đặt nó trong khối riêng nếu trước khi đánh giá các điều kiện ít quan trọng hơn. Không chỉ dễ đọc hơn nếu không có sự lộn xộn của các điều kiện khác, mà đó còn là điều kiện đầu tiên mà một lập trình viên sẽ đọc. Kết hợp điều này với ý tưởng đã được @scrwtp đề cập để gán cho một biến có tên có ý nghĩa và bạn nhận được:

var isValid = !_someViewModelNameThatIsLong.ThisIsABooleanPropertyThatIsImportant;
if( isValid ) 
{
    if( _someViewModelNameThatIsLong.AnotherPropertyINeedToCheck == someValue ) 
    {
        //Do something
    }
}

Nếu bạn đang lập trình bằng ngôn ngữ trình biên dịch, phần lớn các khối này được lồng vào nhau cuối cùng, miễn là bạn không chèn mã giữa bên ngoài nếu và bên trong nếu, vì vậy nó không ảnh hưởng đến hiệu suất trong các phần này các trường hợp.


2

Nếu bạn đang sử dụng C / C ++ thì bộ tiền xử lý có thể cung cấp khả năng đọc.

#define NOT !

if(_someViewModelNameThatIsLong.AnotherPropertyINeedToCheck == someValue &&
    NOT _someViewModelNameThatIsLong.ThisIsABooleanPropertyThatIsImportant)
{
    //Do something
}

hoặc có lẽ ... hàm không (x) {return! x; } // javascript
Alex

2
Toán tử trong C và C ++ Đã có từ đồng nghĩa chuẩn cho các toán tử khác nhau.
Joel

0

Tôi chỉ cần giải nén

`!_someViewModelNameThatIsLong.ThisIsABooleanPropertyThatIsImportant`

Trong một Phương thức trả về điều này. Nếu bạn đặt tên cho phương thức này là Not ThisIsABooleanPropertyThatIsImportant, bạn sẽ ổn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.