Ngắt dòng trước / sau toán tử [đóng]


28

Trong khi quy ước mã Java của Sun đề nghị đặt ngắt dòng trước toán tử, nhiều hướng dẫn khác không đồng ý với nó. Tôi không thấy bất kỳ ưu và nhược điểm rõ ràng nào, vậy có lợi thế nào khi sử dụng một trong những phong cách này so với phong cách khác không?

String longVarName = a + b + c + d +
          e + f;

đấu với

String longVarName = a + b + c + d
          + e + f;

Bạn có thể xin vui lòng gửi một ví dụ mã đơn giản hiển thị cả hai quy ước?
Michael

Trước tiên tôi sẽ cố gắng tránh tình huống này bằng cách sử dụng một cái gì đó như thế này: download.oracle.com/javase/1.4.2/docs/api/java/lang/ trộm
Công việc

Liên kết bị hỏng.
Florian F

Câu trả lời:


14

Tôi sẽ để nó trên một dòng và suy nghĩ về khả năng đọc về các tên biến và chức năng tiết lộ ý định.

Một khi nó trở nên lộn xộn, đã đến lúc tái cấu trúc :

  • đổi tên vars
  • giới thiệu vars / chức năng mới

Thí dụ

subtotal = price * (100 + tax_ratio) / 100`

so với

tax = price * tax_ratio / 100
subtotal = price + tax

2
Công thức bên trái là không chính xác. Nó nên là một price * (100 + tax_ratio) / 100hoặc chỉ price * (1 + tax_ratio), tùy thuộc vào việc tính tax_ratiobằng phần trăm hay phân số.
Rufflewind

4
Điều này không trả lời câu hỏi. Cần có luật chống lại những kiểu trả lời này.
Edward D'Souza

@ EdwardD'Souza Tôi cũng cảm thấy như vậy. Nhưng tại sao câu trả lời được chấp nhận?
Rudy Vissers

@RudyVissers câu trả lời giải quyết vấn đề ở mức độ sâu hơn. Nó giải quyết vấn đề cần ngắt dòng ngay từ đầu. Từ quan điểm đó, OP có thể coi đó là câu trả lời cho vấn đề của mình, nhưng vẫn không phù hợp với quan điểm của việc đây là một wiki cộng đồng.
Edward D'Souza

này, tôi không còn ở đây nữa nhưng thực sự rất đơn giản - nếu bạn thấy mình trong tình huống như vậy có lẽ bạn đã làm sai và bạn nên nghĩ về việc tái cấu trúc mã - hoặc nói cách khác, sau 15 năm lập trình tôi Đơn giản là đừng quan tâm đến những thứ như vậy nữa, điều tôi quan tâm thay vào đó là sự rõ ràng, đơn giản và giúp người khác dễ dàng giúp tôi
Kamil Tomšík

36

Tôi có thể tưởng tượng khả năng đọc là một đối số

result = longidentifier +
   short -
   alittlelonger -
   c;

đấu với

result = longidentifier
   + short
   - alittlelonger
   - c;

Trong ví dụ thứ hai, các toán tử được xếp hàng độc đáo và bạn có thể dễ dàng nhìn thấy dấu hiệu nào mà biến được đưa vào phương trình. Tôi nghĩ rằng điều này cũng có ý nghĩa đối với các toán tử nhị phân, nhưng với giằng, v.v., bạn chỉ nên làm bất cứ điều gì rõ ràng hơn.


4
Đối với các tình huống mà các toán tử là quan trọng (như các biểu thức toán học và như vậy) tôi sẽ chọn số hai, bởi vì, như bạn đã nói, nó dễ đọc hơn nhiều. Nhưng đối với các chuỗi tôi sẽ chọn các tùy chọn đầu tiên, vì các toán tử là "vô nghĩa". Họ không làm gì khác hơn là mang các chuỗi lại với nhau và vì các chuỗi là bit quan trọng, nên tôi thích các tùy chọn đầu tiên.
Niklas H

Cả hai trường hợp đều có công đức. Cả hai trường hợp tốt hơn là đặt tất cả trên một dòng rất dài! Sở thích của tôi là sử dụng một khung mở khi bắt đầu (mặc dù không cần thiết) và sau đó sắp xếp mọi thứ theo đó. Nó làm cho nó rõ ràng hơn nhiều.
quick_now

34

Tôi thường làm theo các hướng dẫn phong cách được sử dụng phổ biến nhất hoặc một công cụ tiêu chuẩn mã hóa nhất định. Lợi thế của việc sử dụng một kiểu được sử dụng phổ biến mang lại lợi ích khi bạn đang đọc mã của người khác hoặc tham gia vào một dự án nguồn mở nơi đặt ra các nguyên tắc về kiểu dáng.

Các phong cách phổ biến nhất mà tôi đã thấy là phong cách thứ hai trong câu hỏi. Xem dưới đây cho danh sách của họ:

Hướng dẫn về Phong cách của Google :

Khi một dòng bị hỏng tại một toán tử không gán, ngắt xuất hiện trước ký hiệu.

Công ước mã hóa mặt trời :

Phá vỡ trước một nhà điều hành

Toán tử kiểm tra Kiểu quấn Giá trị mặc định của kiểm tra là nl:

Toán tử phải ở trên một dòng mới


1
Cập nhật câu trả lời của tôi cho rõ ràng vì lợi ích + quy ước mã hóa của Sun.
trần nhà

google.github.io/styleguide/javaguide.html (liên kết trong câu trả lời bị hỏng)
Martin Pfeffer

10

Trong mã tôi có xu hướng đặt dấu ngắt sau toán tử:

foo = some_long_expression() +
      some_other_long_expression();

Ở đây, toán tử treo lủng lẳng ở cuối dòng là một đầu mối lớn cho người đọc rằng mã tiếp tục. Trong các ngôn ngữ không có bộ kết thúc câu lệnh, toán tử lơ lửng đó có thể đóng vai trò là đầu mối đủ cho trình biên dịch / trình thông dịch mà mã tiếp tục (nếu không tôi sẽ phải sử dụng một số cấu trúc dòng tiếp tục xấu xí).

Khi ghi lại biểu thức đó (nếu nó cần tài liệu), tôi có xu hướng đặt dấu ngắt trước toán tử.


Ít nhất một số ngôn ngữ (ví dụ Python) không lấy toán tử nhị phân theo dấu như gợi ý rằng dòng tiếp tục nhưng yêu cầu nhiều hơn. Lưu ý rằng các dòng mới bên trong parens thường không được tính, vì vậy bạn không cần một ký tự tiếp tục dòng rõ ràng (và dễ bị lỗi).

3

Miễn là bạn vẫn kiên định, thì biết rằng cũng không có lợi thế thực sự. Điều này đặc biệt quan trọng khi xem xét hợp nhất mã và khoảng trắng.


3

Tôi tin rằng dòng nên bắt đầu bằng biểu tượng cao nhất trong cây phân tích của câu lệnh bạn muốn ngắt. Nó làm nổi bật toán tử quan trọng nhất trong biểu thức. Đó là cùng một lý do tại sao bạn đặt một dòng khác ở đầu một dòng và không ở cuối dòng trước đó.

Trong ví dụ sau, quét lề trái, bạn thấy cấu trúc của câu lệnh dưới dạng OR của 3 biểu thức.

if (ch>='A' && ch<='Z'
    || ch>='a' && ch<='z'
    || ch>='0' && ch<='9')
{...}

Dưới đây, | | toán tử ít được làm nổi bật. Rõ ràng nó là một | | của biểu thức. Đặc biệt là nếu các dòng có độ dài khác nhau.

if (ch>='A' && ch<='Z' ||
    ch>='a' && ch<='z' ||
    ch>='0' && ch<='9')
{...}

Và chỉ để tham khảo, điều này là rất sai. | | toán tử không được tô sáng ở tất cả.

if ( ch>='A' && ch<='Z' || ch>='a'
     && ch<='z' || ch>='0' && ch<='9')
{...}

Tôi thậm chí thích đặt dấu phẩy ở đầu dòng, mặc dù tôi hiếm khi thấy điều đó. Tôi không làm điều đó trên mã chia sẻ.

var note:Object =
    { key: key
    , type: 'P'
    , text: someLongProcedureCallGettingTheUserInitials()
       + ": " + getTheTextThatWasTyped()
    };

2

Đối với các phương trình số học dài, tôi thường làm một trong hai điều.

để lại mọi thứ trên một dòng duy nhất:

foo = bar + baz - fizz + buzz + alpha - beta;

Tôi thường làm điều này cho các phương trình chỉ chứa phép cộng và phép trừ, tôi thấy rất dễ dàng để tạo một lỗi đánh máy với phép nhân và phép chia có thể làm rối loạn nghiêm trọng phạm vi của toán tử.

định dạng thứ hai tôi sử dụng là toán tử lũy tiến:

foo = bar;
foo += baz;
foo -= fizz;
foo += buzz;
foo /= alpha - beta;
foo *= spiff;

Tôi thấy không có lý do gì để rút ngắn nó thành một dòng duy nhất, trừ khi nó có thể được chứng minh để cải thiện hiệu suất một cách đáng chú ý. Ngoài ra, không có sự mơ hồ về những gì đang diễn ra ở đâu, và ít có cơ hội để đặt sai dấu ngoặc đơn cho các nhà khai thác /*nhà khai thác.


2

Đặt ký tự nối (hoặc bất kỳ toán tử nào) ở đầu dòng giúp cải thiện khả năng đọc. Chúng tôi quét mã bằng cách tập trung vào đầu mỗi dòng. Khi một dòng bắt đầu với một toán tử, người đọc có thể nói rằng dòng đó là sự tiếp nối của câu lệnh trước bằng cách quét một ký tự đó.

Các biểu thức toán học dài luôn được sắp chữ để mỗi dòng mới bắt đầu bằng một toán tử. Không có lý do gì mà mã không nên tuân theo quy ước này.


0

Để biểu thức trên một dòng và nếu nó trở nên quá dài, thì hãy chia nó thành các biểu thức nhỏ hơn:

days = ((year * months_per_year) + month) * days_per_month + day

trở thành:

months = year * months_per_year + month
days = months * days_per_month + day

Nếu điều này là không thể, thì tôi thấy nó dễ đọc hơn trước khi toán tử và toán tử bắt đầu ngay bên dưới nhiệm vụ trước đó (đặt nó bên dưới biến khiến tôi phải suy nghĩ và nhận lại, điều đó gây khó chịu vì mục tiêu là để làm cho mọi thứ dễ đọc hơn):

random = years * months_per_year 
         + month * days_per_month 
         + day * hours_per_day 
         + hour * minutes_per_hour 
         + minute * seconds_per_minute 
         + second

1
Câu trả lời này không thêm bất cứ điều gì mới vào những gì đã được nói.
Martijn Pieters
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.