Tôi nên đặt dòng mới trước hoặc sau toán tử nhị phân? [đóng cửa]


11

Khi bạn ở trong Python hoặc Javascript, bạn phải luôn đặt các toán tử nhị phân ở cuối dòng trước đó, để ngăn chặn các dòng mới chấm dứt mã của bạn sớm; nó giúp bạn bắt lỗi.

Nhưng trong C hoặc C ++, đây không phải là vấn đề, vì vậy tôi tự hỏi:

Có lý do nào để tôi thích phiên bản thứ hai hơn phiên bản thứ nhất không?

return lots_of_text
       + 1;

đấu với

return lots_of_text +
       1;

(Ví dụ: một trong số chúng có giúp ngăn ngừa các loại lỗi khác không? Hay một trong số chúng được coi là dễ đọc hơn?)


Không, bạn không nên làm điều đó trong Python, chủ yếu là vì không có hiệu ứng mà bạn cho là nó có. Một toán tử trailing không gây ra sự tiếp tục dòng; dấu gạch chéo ngược hoặc có dấu ngoặc đơn, dấu ngoặc hoặc dấu ngoặc không được làm rõ.

@delnan: Tôi (rất cẩn thận) không bao giờ nói rằng nó gây ra sự tiếp tục dòng. Tôi biết bạn vẫn cần bao gồm các nhân vật nhóm. Tôi đã nói rằng nó giúp ngăn ngừa lỗi với dòng kết thúc sớm, điều đó xảy ra, bằng cách cho bạn một lỗi.
dùng541686

Tôi hiểu, nhưng nó cũng không làm điều đó. Ít nhất là tôi chưa bao giờ thấy điều đó xảy ra (và tôi tuân thủ nghiêm ngặt quy tắc của PEP 8 về việc đặt dòng mới sau các nhà khai thác) và tôi không thể tưởng tượng mã không bị tước quyền hợp lệ với dòng mới trước nhà điều hành nhưng không phải sau nhà điều hành. Ví dụ: mã như trong đoạn mã đầu tiên của bạn cũng có lỗi (do thụt lề). Có ai không thêm thụt lề khi tách một dòng?

@delnan: Thật sự rất dễ dàng để vô tình làm hỏng vết lõm với trình soạn thảo văn bản của bạn, ví dụ như khi chỉnh sửa hàng loạt hoặc thực hiện lựa chọn hình chữ nhật. Và nếu / khi điều đó xảy ra trong quá trình bảo trì, bạn sẽ không gặp lỗi trong trường hợp đầu tiên và nó sẽ âm thầm trượt theo bạn, nhưng bạn sẽ gặp một lỗi rất hay trong trường hợp thứ hai.
dùng541686

4
Không chắc chắn tại sao điều này đã bị hạ cấp. Có vẻ như một câu hỏi phong cách mã hóa hợp lý.
Stuart Marks

Câu trả lời:


18

Như bạn có thể thấy từ các câu trả lời, không có sự đồng thuận về vấn đề này. Trừ khi bạn làm việc theo nhóm, hãy sử dụng những gì bạn thấy thoải mái hơn.


Tôi thích chèn một dòng mới trước khi các nhà khai thác.

Bất cứ khi nào tôi phải ngắt dòng, tôi thường đặt tối đa một thuật ngữ có cùng "cấp độ" trên một dòng:

Định luật hấp dẫn của Newton trong Python:

force = (
    gravitational_constant
    * mass_1
    * mass_2
    / (distance * distance)
)

So sánh điều này với:

force = (
    gravitational_constant *
    mass_1 *
    mass_2 /
    (distance * distance)
)

Tôi muốn biết rằng tôi "chia theo bình phương khoảng cách", tôi không muốn biết rằng "khối lượng được chia", bởi vì đó không phải là cách tôi nghĩ về các biểu thức toán học.

Hơn nữa, tôi thường muốn biết trước tiên, những gì tôi đang làm (toán tử), trước khi tôi quan tâm đến những gì tôi làm với (toán hạng).

Hoặc xem xét câu lệnh SQL phức tạp này:

WHERE
  a = 1
  AND b = 2
  AND c = 3
  AND ( -- or put the OR on one line together with the AND
    d = 3 
    OR e = 1)
  AND x = 5

Điều này cho phép tôi xem các điều kiện riêng lẻ được kết nối rất dễ dàng, chỉ bằng cách lướt qua từ trên xuống dưới mà không cần phải đọc từng dòng cho đến khi kết thúc để tìm toán tử trái ngược với:

WHERE
  a = 1 AND
  b = 2 AND
  c = 3 AND
  ( 
    d = 3 OR
    e = 1) AND
  x = 5

Tôi nghĩ về cái trước theo nghĩa " Xlà đúng", sau đó tôi sửa đổi điều đó bằng cách nói: " điều này cũng đúng" mà tôi cảm thấy tự nhiên hơn so với cách khác. Hơn nữa, tôi thấy việc phân tích trực quan đầu tiên dễ dàng hơn nhiều.

Hoặc một ví dụ về PHP:

$text = "lorem ipsum"
      . "dolor sit amet, "
      . "consectetur adipisicing elit, "
      . "sed do eiusmod tempor";

Một lần nữa, tôi chỉ có thể đọc lướt theo chiều dọc để thấy tôi chỉ đơn giản là ghép văn bản, bởi vì hầu hết thời gian tôi cảm thấy rằng tôi không thực sự quan tâm những gì bên trong chuỗi / điều kiện.

Tất nhiên, tôi sẽ không áp dụng phong cách này vô điều kiện. Nếu đặt dòng mới sau khi một nhà điều hành dường như có ý nghĩa hơn đối với tôi, tôi sẽ làm như vậy, nhưng tôi không thể nghĩ ra một ví dụ tại thời điểm này.


Đã thêm dấu ngoặc đơn bị thiếu vào ví dụ đầu tiên.
kevin cline

1
+1: hoàn toàn chính xác; toán học luôn được sắp chữ sao cho các dòng tiếp tục bắt đầu bằng một toán tử.
kevin cline

+1 cho cùng một lý do bạn mô tả, nhưng ví dụ PHP của bạn trông khá kỳ lạ đối với tôi. Không phải những concats chỉ là ., phải không .=?
Izkata

@Izkata oh vâng, bạn đúng rồi. Cảm ơn. kevin: Các dấu ngoặc đơn là chính xác;) Tôi chỉ căn chỉnh chúng vớiforce
phant0m

11

Tôi hầu như luôn luôn ngắt dòng trước các toán tử nhị phân để làm rõ cho người đọc mã rằng đây là sự tiếp nối của một biểu thức chứ không phải là câu lệnh tiếp theo. Điều này rất quan trọng nếu câu lệnh tiếp theo thường được thụt lề. Ví dụ, hãy xem xét một nếu tuyên bố rằng có một biểu thức điều kiện phức tạp:

if (first_part_of_condition &&
    second_part_of_condition) {
    statement_within_then_part;
}

Phần thứ hai của biểu thức điều kiện dễ bị nhầm lẫn với câu đầu tiên của phần sau đó. Điều này có thể khá khó hiểu nếu phần đầu tiên của điều kiện dài và && kết thúc ở bên phải. So sánh điều này với sự thay thế:

if (first_part_of_condition
    && second_part_of_condition) {
    statement_within_then_part;
}

Điều này có vẻ hơi kỳ lạ nhưng nó làm cho khá rõ ràng rằng phần thứ hai của điều kiện không phải là khởi đầu của một tuyên bố.

Tôi cũng làm điều này trong các bối cảnh khác nhưng câu lệnh if là quan trọng nhất, vì vết lõm là mơ hồ. Tất nhiên, người ta có thể thay đổi vị trí thụt hoặc nẹp, nhưng điều này cũng có vẻ kỳ lạ.

tl; dr đầu bên trái của dòng có ý nghĩa quan trọng hơn đối với việc đọc hiểu nhanh, do đó, đặt toán tử ở đầu bên trái là một dấu hiệu nổi bật hơn rằng đây là biểu thức tiếp tục, không phải là một tuyên bố.


Suy nghĩ thú vị nhưng tôi vẫn thấy điều này khá khó hiểu (đặc biệt là khi được thực hiện +-cũng có thể được hiểu là các toán tử tiền tố đơn nguyên). Giải pháp thông thường để làm cho các dòng tiếp tục nổi bật là thụt lề chúng nhiều hơn (tức là theo hai cấp độ).
Konrad Rudolph

"Phần thứ hai của biểu thức điều kiện dễ bị nhầm lẫn với câu lệnh đầu tiên của phần sau đó.": Điều này không xảy ra nếu bạn căn chỉnh "{" và "}" theo chiều dọc (cùng một cột) để bắt đầu và kết thúc của khối nổi bật rõ ràng hơn.
Giorgio

8

Tôi luôn luôn sử dụng đầu tiên. Bạn muốn nó rõ ràng những gì bạn đang làm với 1 đó. Nếu tôi thấy điều đó và có một bức tường văn bản ở trên thì tôi sẽ không biết chuyện gì đang xảy ra cho đến khi sử dụng 1.

'+' Ở bên cạnh 1 cho thấy rõ ràng rằng ở mức tối thiểu tôi đang làm gì đó với câu hỏi 1 thay vì đi ra ngoài "Tôi hoàn toàn nằm trong mã của bạn ..." không có lý do rõ ràng.


biệt phái ...........
James

7

Tôi cảm thấy rằng nó giúp đọc hiểu rất nhiều khi một dòng chỉ ra rằng câu lệnh tiếp tục ở dòng tiếp theo bằng cách có toán tử nhị phân ở cuối, và do đó khiến cho câu lệnh không đầy đủ. Dấu chấm phẩy bị thiếu không đủ để tôi hiểu ngay điều đó.

Đây có thể chỉ đơn giản là một câu hỏi về thói quen nhưng trừ khi bạn chỉ làm việc trong các ngôn ngữ yêu cầu dấu chấm phẩy (mà tôi thấy khá phi thực tế với tính phổ biến của các tập lệnh shell, makefiles và ngôn ngữ như Python), bạn cũng có thể không có thói quen đó.

EDIT: Giorgio đưa ra một điểm tuyệt vời trong các ý kiến: cách sử dụng này lặp lại dấu câu phổ biến , cả trong toán học và ngôn ngữ tự nhiên. Bạn sẽ viết

Tôi chìm,
do đó tôi bơi

Bạn sẽ không viết

Tôi chìm
, do đó tôi bơi


3
+1: Tôi cũng có xu hướng đọc dấu + ở cuối dòng dưới dạng dấu phẩy phân tách hai mục trong danh sách toán hạng. Vì lý do này, tôi thích đặt dấu + ở cuối dòng như tôi sẽ làm với dấu phẩy (tôi sẽ không bao giờ bắt đầu một dòng bằng dấu phẩy).
Giorgio

@Giorgio Điểm này tuyệt vời đến nỗi tôi đã đánh cắp nó cho câu trả lời của mình. Tôi mong bạn có thể tha thứ cho tôi.
Konrad Rudolph

Đi trước: Tôi cảm thấy vinh dự. ;-)
Giorgio

7
Mã không phải là tiếng Anh và tôi nghĩ rằng đó là một sự tương tự sai khi sử dụng các quy tắc cú pháp tiếng Anh như một cách để biện minh cho các quy ước mã hóa. Tôi không thích kiểu toán tử kéo dài, nhưng tôi thừa nhận Konrad có một điểm hay về các ngôn ngữ như Python.
M. Dudley

3
Trong sắp chữ toán học, ngắt dòng luôn luôn trước một toán tử, không bao giờ sau. Trong ví dụ prosaic, toán tử là "do đó". Trong văn xuôi tiếng Anh, dấu phẩy về cơ bản là dấu hiệu hơi thở.
kevin cline
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.