Cách dễ đọc nhất để định dạng dài nếu điều kiện? [đóng cửa]


43

ifĐiều kiện quanh co dài nên tránh nếu có thể, nhưng đôi khi tất cả chúng ta cuối cùng đã viết chúng. Ngay cả khi đó là một điều kiện rất đơn giản, các tuyên bố liên quan đôi khi chỉ đơn giản là rất dài dòng, vì vậy toàn bộ điều kiện kết thúc rất dài. Cách dễ nhất để định dạng những gì?

if (FoobarBaz::quxQuux(corge, grault) || !garply(waldo) || fred(plugh) !== xyzzy) {
    thud();
}

hoặc là

if (
    FoobarBaz::quxQuux(corge, grault)
 || !garply(waldo)
 || fred(plugh) !== xyzzy
) {
    thud();
}

hoặc là

if (FoobarBaz::quxQuux(corge, grault)
    || !garply(waldo)
    || fred(plugh) !== xyzzy) {
    thud();
}

hoặc là

thudable = FoobarBaz::quxQuux(corge, grault);
thudable ||= !garply(waldo);
thudable ||= fred(plugh) !== xyzzy;

if (thudable) {
    thud();
}

hoặc bất kỳ ưu tiên khác?

Câu trả lời:


30

Thông thường, một điều kiện dài nếu là dấu hiệu của mã cần tái cấu trúc, nhưng đôi khi bạn không thể tránh được. Trong những trường hợp đó, tôi thích cái đầu tiên:

if (bar || baz || quux) { ... }

Bởi vì bạn có thể nói những gì đang diễn ra với một dòng. Tuy nhiên, tôi muốn làm một cái gì đó như thế này, khi có thể:

function foo() {
  return bar || baz || quux;
}

if (foo()) { ... }

3
di chuyển sang một bên so với dọc không phải là gần như giới hạn của nó trong những ngày xưa tồi tệ ...
Bill

2
và đặt tên có ý nghĩa (doanh nghiệp) cho hàm để mọi người hiểu những gì đã được thử nghiệm ở đây.
Matthieu M.

19

Tôi thích giữ các toán tử ở cuối để chỉ ra sự tiếp tục:

if (the_function_being_called() != RETURNCODE_SUCCESS &&
    the_possibly_useful_recovery_strategy() == RETURNCODE_EPICFAIL &&
    this_user_has_elected_to_recieve_error_reports)
{
    report_error();
}

1
Tôi nghĩ rằng tôi thích cái này Tôi sử dụng rất nhiều dấu ngoặc đơn để đảm bảo tôi có thể hiểu thứ tự ưu tiên.
Jasarien

5
Tôi thích đặt các toán tử logic ở đầu dòng để khi đọc một dòng tôi có thể dễ dàng thấy nó là một phần của điều kiện và không chỉ là một dòng mã thông thường.

11

Tôi là một fan hâm mộ lớn của các tên biến có ý nghĩa:

const bool isInAStrangeCondition =
    FoobarBaz::quxQuux(corge, grault) ||
    !garply(waldo) ||
    fred(plugh) !== xyzzy;

if (isInAStrangeCondition) {
    thud();
}

Hoặc tái cấu trúc như một chức năng, như đã đề cập ở trên.


7

Tôi phá vỡ các biểu thức con lộn xộn hơn, hoặc tất cả chúng, dưới dạng các biến bool. Sau đó, logic boolean cấp cao nhất của câu lệnh 'if' có thể được làm rõ. Trong các loại công việc tôi làm, không phải lúc nào cũng có vài thứ ORed hoặc ANDed.

bool goodblah = some_mess < whatever;
bool frobnacious = messy_crud != junky_expression;
bool yetanother = long_winded_condition;

if (goodblah || (frobnacious && yetanother))   {
    ...
}

Điều này đặc biệt tốt trong trình gỡ lỗi, nơi tôi có thể xem tất cả các bool trước khi thực hiện 'nếu'.


Tôi cũng thích điều này, nhưng bạn sẽ mất một lợi ích: không còn có thể so sánh ngắn hạn đắt tiền nữa.

... Và bạn cần phải rất giỏi trong việc đặt tên cho hàng tấn biến số trong tất cả các ngày ...
cronvel

6

Tôi có xu hướng căn chỉnh các toán tử khi bắt đầu các dòng mới để tôi nhớ cách tôi kết hợp các thuật ngữ (cả logic dài và số học dài). Như thế này:

if (first_attempt(data) == SUCCESS
    || (reusable(data) && second_attempt(data) == SUCCESS)
    || (still_reusable(data) && third_attempt(data) == SUCCESS))
  return SUCCESS;

Điều này chỉ hoạt động nếu tôi thụt lề bởi 2 khoảng trắng hoặc đặt môi trường của tôi thành các biến vị ngữ đa dòng thụt lề nhiều hơn, nếu không, thật khó để biết vị từ kết thúc và mã hữu ích bắt đầu từ đâu.


0

Tôi là một fan hâm mộ của những điều sau đây:

if (really_long_expression && another_really_really_long_expression && 
            another_very_long_expression_OMG_id_it_long){
    bugs();
}

Bằng cách này, nó vẫn trông giống như một biểu thức if và không phải là một biểu thức bị phá vỡ nếu biểu thức. Việc thụt lề giúp hiển thị rằng đó là sự tiếp nối của dòng trước đó.

Bạn cũng có thể thụt lề cho đến khi dấu ngoặc mở ở cuối dòng trước để nó ở cuối biểu thức if như lẽ ra phải có.


1
Tôi thực sự thích phương thức bug () của bạn: D
Joe Phillips
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.