강제 코드 포맷의 장점과 단점


19

현재 개발자가 버전 제어 체크인에서 자동 코드 포맷터를 사용하도록 강요하는 곳에서 일하고 있습니다. 이 작업의 장단점에 대한 개발자 의견을 찾고 있습니다 ... 개발자가 도움이되거나 방해한다고 생각하는 방식. 필자의 구체적인 사례에는 Java / JSP가 포함되지만 질문은 모든 언어에 적용될 수 있다고 생각합니다.


JSP 자동 재 포맷? 여기에는 결과 출력을 매우 쉽게 끊거나 변경할 수있는 HTML / XML 코드 및 재 포맷이 포함됩니다.
edA-qa mort-ora-y

답변:


23

나는 이것을하는 것이 매우 중요 하다고 생각합니다 . 이유는 다음과 같습니다.

  • 소스 컨트롤 차이 실제 코드 변경 사항 표시 하고 공백 및 기타 중요하지 않은 형식 선택으로 인한 "차이 노이즈"를 제거합니다.
  • 모든 코드를 더 비슷하게 만들어 개발자가 코드 기반을 더 편안하게 페어링하고 공유 할 수 있습니다.

그렇게하면 모든 사람이 모든 코드를 체크인하는 것이 좋습니다. 한 사람이 전체 코드베이스를 다시 포맷 한 다음 모든 사람을 다시 체크인하여 서식을 설정하기위한 하나의 "거대한"변경 사항이 있습니다 (모두 무시 할 수 있음). 그 후 모든 diff는 실제 코드 diff입니다.

비트 단위로 수행하면 실제 코드 변경 사항과 서식 변경 내용이 혼합되어 변경 랜드에서 불필요하게 지저분해질 것입니다.


1
전 세계의 변화에 ​​총알을 물리는 것이 실제로 가장 좋은 방법입니다. 그것을 끝내고 아무도 그것에 대해 다시 걱정할 필요가 없습니다.
Patrick Hughes

스타일 규칙을 변경할 때까지
Nerdfest

1
@Nerdfest 그런 다음 한 번의 커밋으로 모든 프로젝트에 새로운 규칙을 적용합니다. 별거 아니에요
기즈모

2
공백 변경을 제대로 처리 할 수없는 경우 "diff"도구가 짜증납니다.
edA-qa mort-ora-y

2
규정 된 스타일과 약간 다른 형식이 더 깨끗한 예외는 항상 있습니다. 자동 변환은 종종 특정 코드 블록의 의도를 숨길 수 있는데, 이는 코드에 결함을 추가하는 것만 큼 효과적입니다.
edA-qa mort-ora-y

10

사람들이 장점을 추가하는 것처럼 보이므로 여기에 내 자신의 대답을 던질 것입니다. 내가 단점으로 보는 것은 :

  • 자동 포맷터보다 '더 나은'기능을 제거합니다. 더 깨끗한 포맷을 취소합니다. 이에 대한 예로는 열 기반 매개 변수 선언, 개체의 개별 추가 목록 등이 있습니다.
  • 스타일 규칙 변경에 대한 저항을 작성하여 잘못된 오도 변경을 생성합니다.
  • 대체 형식으로 코드를 더 읽기 쉽게 만드는 '특별한 경우'형식화 기능을 제거합니다.
  • 필요한 재 포맷 기능을 정확하게 지원하는 IDE를 사용하게 됩니다. 다른 IDE에 필요한 옵션 중 하나가 없으면 적어도 몇 가지 문제가 발생합니다.
  • 그룹과 정확히 동일한 형식 규칙을 사용하지 않는 한 쓰기 가능한 코드 저장소를 외부 그룹과 공유하는 데 문제가 있습니다 (일반적으로 항상 그런 것은 아니지만).
  • 규정 된 스타일과 약간 다른 형식이 더 깨끗한 예외는 항상 있습니다. 자동 변환은 종종 특정 코드 블록의 의도를 숨길 수 있는데, 이는 코드에 결함을 추가하는 것만 큼 효과적입니다.

간단히 말해서, 자동화되지 않은 규칙 세트는 최소 스타일 / 가독성 요구 사항을 설정하며, 여기서 자동화 된 규칙은 최소 및 최대를 설정합니다.

VB (버전 5)를보고 가장 성가신 점 중 하나를 찾는 것은 내 코드를 강제로 다시 포맷하고 기본 형식 이상으로 제거하는 것이 었습니다.


일관성을 희생 할 경우 다른 형식 지정 규칙에 따른 이점은 거의 없습니다. 당신은 그것에 익숙해 있습니다. 보헤미안의 조언에 따라 유예 기간을 만들어 서식 스타일을 결정한 다음이를 준수하십시오. 포맷 변경은 어쨌든 가볍게 수행해서는 안됩니다.
JeffO

3
@ Jeff, 그는 일관성이없는 코드 형식을 주장하는 것이 아니라 자동화하기 어려운 일관된 코드 형식을 주장한다고 생각합니다. 예를 들어, 여러 코딩 스타일은 여러 줄의 관련 데이터가 함께있을 때 미적 방식으로 열을 정렬하도록 지정합니다. 이것은 가독성을 크게 향상 시키지만 "미적"또는 "관련"의 정의를 자동화하는 것은 매우 어렵습니다. 이것이 바로 일부 코드 포맷터가 특정 상황에서 수동 서식을 무시하도록 허용하는 이유입니다.
Karl Bielefeldt

1
99.9 %의 일관된 형식을 유지하고 개인적으로 좋아하지 않는 홀수 비트를 견디는 것이 훈련되지 않은 오해를 극복하는 것보다 훨씬 낫습니다. 아마도 팀이 균형을 잡는 곳이 얼마나 훈련되어 있는지에 달려있을 것입니다. 언어에 대해 정해진 규범을 고수하면 모든 괜찮은 편집자 / IDE가 그런 식으로 형식을 지정할 수 있습니다. 규범에서 벗어나기를 고집한다면 문제가 생길 것입니다.
mattnz

3

강제 코드 형식이 훌륭하다는 것을 알았습니다. 이를 통해 개발자는 시선을 사로 잡지 않고 전체 코드 모음을 통과 할 수 있습니다. 또한이 표준을 적용하면 초보자 개발자가 나쁜 습관을 깰 수 있습니다.


3

가장 중요한 단점은 사용자 지정 형식이 중요한 위치에서 손실되는 것입니다.

특정 조건 중 하나라도 존재하지만 충족되지 않은 경우 실패하는 전형적인 온 전성 검사 if ()를 상상해보십시오 ...

  if(
      (user.id == TEST_ID)
    ||(
         (user.id == UserID)
       &&( 
             ( user.type == HUMAN_USER && user.name.size() >= MIN_NAME )
           ||( user.type == EMULATION && input.source != SOURCE_INTERNAL ))
       && ( user.email == NULL || emailValidator.isValid(user.email))
       && ( (user.phone == NULL) == (user.type == EMULATION) )

       // several more lines like this.)
    ){ /* handle results */ }

조건의 논리적 구조에 따라 적절한 들여 쓰기 덕분에 읽을 수 있습니다.

이제 자동화 된 툴은 서로 다른 조건을 관련 라인으로 논리적으로 분리 할 수있는 단서가 없습니다. 각 라인이 한 줄에 3-4 개의 조건이 모여서 다음 조건을 반으로 나눌 이유가 없습니다. 또는 줄당 하나의 비교 표현식으로 분할합니다. 화면에서 더 예쁘게 보일 수도 있지만 로직이 손실됩니다.


이것은 엉망입니다. 양전자의 뇌가 녹았습니다. (와) 주위에 공백이 너무 많습니다. 이것이 바로 코드를 포맷하기 위해 기계가 필요한 이유입니다. 또한 조건 그룹화를 강제하기 위해 항상 한 줄 주석을 전후에 (전례에 따라) 배치 할 수 있습니다. 이 단선 주석에서 바로이 조건 뒤에있는 비즈니스 규칙을 독자에게 설명하는 것이 도움이 될 것입니다.
Štefan Oravec

@ ŠtefanOravec : 자동 포맷터를 통해이를 실행하고이 설명을 적용하십시오. 더 읽기 쉬운 지 확인하십시오. 항상 사용자를 테스트하십시오. 유효한 사용자 이름을 가진 사용자. 에뮬레이트 된 사용자-외부 소스 만. 이메일이있는 경우 유효해야합니다. 휴먼 사용자는 전화 번호가 있어야합니다. 에뮬레이트-해서는 안됩니다. 한 줄 주석이 자동 서식 코드와 어떻게 정렬되는지 확인하십시오.
SF.

2

나는 단점이있는 답변을 추가했으며 큰 이점도 고려할 것입니다.

커밋시 자동 코드 재구성을 사용하면 실제로는 기본 설정이 다른 설정에 영향을 미치지 않으면 서 개인 취향 변형의 가능성을 열어줍니다. 커밋시 IDE 형식 코드를 공통 표준으로 사용할 수 있지만 다른 형식에는 영향을주지 않으면 서 원하는 형식으로 표시 할 수 있습니다.

이것은 나에게 거의 컨벤션 기반 코딩의 성배입니다 ... 공통 코드 형식의 장점을 얻지 만 여전히 충돌없이 개인 취향을 지원할 수 있습니다.


0

그것은 당신의 필요에 달려 있지만, 일부 금기 사항은 매우 도움이됩니다.

이 경우를 고려하십시오.

if( x == 0 ) 
   return foo;
//do something else
return bar;

if 케이스에 로깅을 추가하려면 실수로 쓸 수 있습니다.

if( x == 0 ) 
  log.info("x was 0");
  return foo;
//do something else
return bar;

그리고 갑자기 메소드는 항상을 반환합니다 foo.

편집 : 자동 서식이 아니라 스타일을 확인합니다. 그 답변도 주제가 아닌 경우 죄송합니다. :)


그것은 형식이 아닌 코드 스타일의 것입니다. 이를위한 빌드 도구가 있습니다.

@ 보헤미안, 당신 말이 맞아, 나는 질문을 잘못 읽었다. 우리가 선택한 빌드 도구는 checkstyle btw입니다. :)
Thomas

0

회사의 코드를 균일하게 만드는 데 큰 도움이되며 일반적으로 이해하기 쉽고 제품의 유지 관리가 용이 ​​한 구조를 만들 수 있습니다.


0

글쎄, 장점은 코드 표준화, 개발자 간 시맨틱 등과 같은 모든 코드 포맷터와 동일합니다. 내가 볼 수있는 유일한 단점 은 포맷 사람의 눈이 부족 하고 예외를 추가하는
것입니다. 체크인 시간 포맷터 대신 IDE 포맷터를 고려하는 것이 좋습니다.


0

내 경험상, 그것은 좋은 일입니다. 하나가 없으면 코드 비교는 종종 공백 형식의 혼란을 나타내며 실제 코드 변경을 숨길 수 있습니다. 내 경험상, 누군가의 서식을 엉망으로 만드는 것은 특히 팀 전체의 일관성에 따른 잠재적 이점으로 인해 만들어지는 죄가 아닙니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.