연산자 전후의 줄 바꿈 [닫힘]


29

Sun의 Java 코드 규칙에 따르면 연산자 앞에 줄 바꿈을 적용하는 것이 좋습니다. 명백한 장단점이 보이지 않으므로 이러한 스타일 중 하나를 다른 스타일보다 사용하면 이점이 있습니까?

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

vs

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

두 규칙을 모두 보여주는 간단한 코드 예제를 게시 할 수 있습니까?
Michael

먼저 다음과 같은 방법으로 상황을 피하려고합니다. download.oracle.com/javase/1.4.2/docs/api/java/lang/…
Job

링크가 끊어졌습니다.
Florian F

답변:


14

한 줄로 남겨두고 의도를 밝히는 변수 이름 (및 함수) 측면에서 가독성을 생각합니다.

지저분 해지면 리팩토링 할 시간입니다 .

  • 변수 이름 바꾸기
  • 새로운 변수 / 기능 소개

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

vs.

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

2
왼쪽의 수식이 잘못되었습니다. 퍼센트인지 분수 인지에 따라 price * (100 + tax_ratio) / 100또는 하나 여야합니다 . price * (1 + tax_ratio)tax_ratio
Rufflewind

4
이것은 질문에 대답하지 않습니다. 이러한 유형의 답변에 대한 법률이 있어야합니다.
Edward D' Souza

@ EdwardD'Souza 같은 느낌입니다. 그런데 왜 대답이 받아 들여졌습니까?
Rudy Vissers

@RudyVissers 답변은 더 깊은 수준에서 문제를 해결합니다. 처음부터 줄 바꿈이 필요한 문제를 해결합니다. 이러한 관점에서 OP는 자신의 문제에 대한 답변으로 간주 될 수 있지만 커뮤니티 위키라는 관점에서는 여전히 적절하지 않습니다.
Edward D' Souza

이봐, 난 더 이상 여기에 없지만 정말 간단합니다-그런 상황에서 자신을 발견하면 아마도 잘못하고 코드를 리팩토링하는 것에 대해 생각해야합니다. 더 이상 그런 것들에 대해 더 이상 신경 쓰지 않고, 내가 대신 돌봐야 할 것은 코드 명확성, 단순성 및 다른 사람들이 나를 쉽게 도울 수 있도록하는 것입니다
Kamil Tomšík

36

가독성이 논쟁이라고 상상할 수있다

result = longidentifier +
   short -
   alittlelonger -
   c;

result = longidentifier
   + short
   - alittlelonger
   - c;

두 번째 예에서 연산자는 잘 정렬되어 있으며 변수에 방정식에 입력되는 부호를 쉽게 확인할 수 있습니다. 나는 이것이 바이너리 연산자에도 의미가 있다고 생각하지만, 브레이싱 등을 사용하면 더 명확한 것을 수행해야합니다.


4
연산자가 중요한 상황 (수학 표현식 등)에서는 2 번을 선택합니다. 그러나 문자열의 경우 연산자가 "의미 없음"이므로 첫 번째 옵션을 선택합니다. 그들은 문자열을 모으는 것 외에는 아무것도하지 않으며 문자열이 중요한 비트이기 때문에 첫 번째 옵션을 선호합니다.
Niklas H

두 경우 모두 장점이 있습니다. 두 경우 모두 하나의 매우 긴 줄에 두는 것보다 낫습니다! 내가 선호하는 것은 시작에 여는 브래킷을 사용하고 (필요하지는 않지만) 그 아래에 모든 것이 정렬되도록하는 것입니다. 훨씬 더 분명합니다.
quick_now

35

나는 일반적으로 가장 일반적으로 사용되는 스타일 지침이나 특정 코딩 표준 도구를 따릅니다. 일반적으로 사용되는 스타일을 사용하면 다른 사람들의 코드를 읽거나 스타일 가이드 라인이 설정된 오픈 소스 프로젝트에 참여할 때 이점이 있습니다.

내가 본 가장 일반적인 스타일은 질문의 두 번째 스타일입니다. 그 목록은 아래를 참조하십시오.

Google 스타일 가이드 :

비 할당 연산자에서 줄이 끊어지면 기호 앞에 줄이 나타납니다.

선 코딩 컨벤션 :

운영자 전에 휴식

Checkstyle Operator Wrap check기본값 은 nl입니다.

운영자는 새로운 줄에 있어야합니다


2
명확성을 위해 Sun의 코딩 규칙에 대한 답변이 업데이트되었습니다.
ceilfors


10

코드에서 나는 연산자 다음에 휴식을 취하는 경향이 있습니다.

foo = some_long_expression() +
      some_other_long_expression();

여기서 줄 끝에 매달려있는 연산자는 코드가 계속된다는 독자의 큰 실마리입니다. 명령문 종결자가없는 언어에서 댕글 링 연산자는 코드가 계속된다는 컴파일러 / 인터프리터의 충분한 단서 역할을 할 수 있습니다 (그렇지 않으면 추악한 연속 행 구성을 사용해야 함).

그 표현을 문서화 할 때 (문서가 필요한 경우) 연산자 앞에 나누기를하는 경향이 있습니다.


적어도 일부 언어 (예 : Python)는 줄 바꿈이 계속되지만 더 필요하다는 힌트로 후행 이항 연산자를 사용하지 않습니다. parens 내부의 줄 바꿈은 일반적으로 계산되지 않으므로 명시 적이며 오류가 발생하기 쉬운 줄 연속 문자가 필요하지 않습니다.

3

일관성을 유지하는 한 실질적인 이점이 없다는 것을 알고 있어야합니다. 이것은 코드 병합 및 공백을 고려할 때 특히 중요합니다.


3

나는 줄을 당신이 깰 진술의 구문 분석 트리에서 가장 높은 기호로 시작해야한다고 생각합니다. 표현식에서 가장 중요한 연산자를 강조 표시합니다. 같은 줄을 이전 줄의 끝이 아닌 줄의 시작 부분에 넣는 것과 같은 이유입니다.

다음 예제에서 왼쪽 여백을 스캔하면 명령문의 구조가 3 개의 표현식의 OR로 표시됩니다.

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

아래는 || 연산자가 덜 강조 표시됩니다. 그것이 || 표현. 특히 선 길이가 다른 경우.

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

그리고 참고로, 이것은 매우 잘못되었습니다. || 연산자는 전혀 강조 표시되지 않습니다.

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

나는 그것을 거의 보지 않더라도 줄의 시작 부분에 쉼표를 넣는 것을 좋아합니다. 공유 코드에서는 그렇게하지 않습니다.

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

2

긴 산술 방정식의 경우 일반적으로 두 가지 중 하나를 수행합니다.

모든 것을 한 줄에 두십시오.

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

나는 일반적으로 덧셈과 뺄셈 포함하는 방정식에 대해이 작업을 수행합니다. 곱셈과 나눗셈을 사용하여 연산자의 범위를 심각하게 망칠 수있는 오타를 만드는 것이 매우 쉽다는 것을 알았 습니다.

내가 사용하는 두 번째 형식은 점진적 연산자입니다.

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

눈에 띄게 성능을 향상시키는 것으로 입증되지 않는 한 한 줄로 줄이려는 이유는 없습니다. 또한 어디에서 무슨 일이 일어나고 있는지 모호하지 않으며 /*연산자에 대한 괄호를 잘못 놓을 가능성이 적습니다 .


2

줄의 시작 부분에 연결 문자 (또는 연산자)를 배치하면 가독성이 향상됩니다. 각 줄의 시작 부분에 초점을 맞춰 코드를 스캔합니다. 행이 연산자로 시작하면 독자는 해당 문자를 스캔하여 행이 이전 명령문의 연속임을 알 수 있습니다.

긴 수학적 표현식은 항상 조판되어 각 새 줄이 연산자로 시작합니다. 코드가이 규칙을 따라야하는 이유는 없습니다.


0

표현식을 한 줄에두고 너무 길면 더 작은 표현식으로 나눕니다.

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

된다 :

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

이것이 가능하지 않다면 연산자보다 먼저 읽기 쉽고, 연산자를 이전 할당 바로 아래에서 시작하도록하십시오 (변수 아래에 넣으면 생각하고 최근에 만들어야합니다. 글을 읽기 쉽게 만드는 것입니다) :

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

1
이 답변은 이미 말한 것에 새로운 것을 추가하지 않습니다.
Martijn Pieters
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.