최악의 코딩 표준은 무엇입니까? [닫은]


77

다음과 같은 표준 코딩 작업을 수행 한 적이 있습니까?

  • 생산성이 크게 떨어 졌습니까?
  • 원래 합당한 이유가 있었지만 원래 관심사가 무의미한 후에 오랫동안 유지 되었습니까?
  • 그들 모두를 기억하는 것이 불가능한 목록에 너무 오래 있었습니까?
  • 저자가 좋은 코딩 연습을 장려하기보다는 마크를 남기려고한다고 생각 했습니까?
  • 왜 그들이 포함되었는지 몰랐습니까?

그렇다면 가장 좋아하는 규칙은 무엇이며 왜 그렇습니까?


여기 몇 가지 예


4
나는 그렇게 전에 SO에 대해 비슷한 질문을했지만 (정확히 동일하지는 않음) stackoverflow.com/questions/218123/…
Brian R. Bondy

@Brian, 감사합니다. 귀하의 질문을 보았지만 잊어 버렸습니다.
finnw

4
코딩 표준의 실제 문제는 그것이 올바른지 아닌지 논쟁하는 데 시간과 노력이 낭비된다는 것입니다.
internecine

답변:


97

이것은 약간의 깃털을 주름 칠 수 있지만 각 방법의 상단에 템플릿 블록 주석을 요구하는 표준은 항상 쓰레기를 벌레로 만듭니다.

1) 업데이트 할 때 알 수있는 실제 작업을 수행하는 코드와 너무 떨어져 있기 때문에 항상 최신 상태가 아닙니다. 나쁜 코멘트는 코멘트가없는 것보다 나쁩니다.

2) 그들은 종종 소스 제어 도구에 이미 포함 된 정보를 반복하지만 정확도는 떨어집니다. 예 : 마지막 수정 자, 수정 날짜 / 이유 목록.


12
나는 (적어도 지금은 학교에서 이상한 것처럼 보였지만) 모두 논평하는 것은 나쁜 습관이라는 것을 안다
Shady M. Najib

14
뿐만 아니라, 최고 수준의 상용구를 배치해야 할 때 새 클래스 파일을 만드는 데 따른 오버 헤드는 실제로 개발자가 새 클래스를 만드는 것을 설득하지 못하고 막대한 다루기 힘든 클래스와 나쁜 디자인을 장려한다는 것을 알았습니다.
Gaz

13
동의하지 않는다! 우리는 쓸모없는 광석 리던던트와 정보를 추가하지 않지만 (.h 파일에서) 함수의 기능에 대한 실제 텍스트 설명을 제공하므로 매우 유용합니다! 물론 우리는 코드와 동기화하여 유지하기 위해 노력하고 있습니다.
Wizard

5
@Shady M Najib 통제 불능 / 유지 관리가 허용 될 때 항상 나쁜가? 일반적으로 좋은 코드는 주석의 필요성을 피할 수있을 정도로 분명한 목적을 갖습니다. 그러나 항상 그런 것은 아니며 이러한 시나리오에서는 주석 달기가 중요하다고 생각합니다. XMLDoc 주석을 포함시켜야하는 한 가지 나쁜 이유는 생각할 수 없습니다.
Nathan Taylor

7
그것이하는 일을 설명하는 블록이 좋습니다. 인수와 반환 값의 유형과 이름을 단순히 반복하는 블록은 잘못되었습니다. 후자를 지시하는 표준으로 작업해야 할 때, 나는 대부분의 자동 생성을 위해 emacs 스크립트를 작성했습니다.
AShelly

130

한 번 교수님에게 각 코드 줄에 대해 적어도 하나의 주석이 필요하다고 요구했습니다.

//Set x to 3
var x = 3;

//if x is greater than 2
if(x>2){

    //Print x
    Print(x);
}

꽤 어리 석었습니다.


10
교수님이 정확히 무슨 일이 일어나고 있는지 아십니까?
John MacIntyre

80
나는 무슨 일이 일어나고 있는지 분명하고 교육이 아니라고 생각합니다.
Dan Ray

18
위의 예는 분명하지만 학생이 다른 앱이나 책에서 함수 호출을 복사하거나 실제로 이해하지 못하면 어떻게 될까요? 교수는 어떻게 알 수 있습니까? 이 멍청한 규칙은 회색 영역을 허용하지 않습니다 (그의 방어에서 이전에 학대되었을 것입니다). 이것이 내가 이것을 해석하는 방법입니다. ... 비 학술적 환경에서 이것을 본다면 조금 무섭습니다. ;-)
John MacIntyre

4
예, 코드를 반복하고 이해하지 못하는 주석을 항상 작성할 수 있습니다. 엔딩 버팀대 앞에 "// 엔딩 버팀대"를 올바르게 설정합니까?
대안

6
실수로 코드에 유용한 주석이 있으면 어떻게해야합니까? // comment그 전에 줄 을 써야 합니까?
구성자

103

우리 회사 (C #)의 코딩 표준은 #REGION을 광범위하게 사용하도록 요구했습니다 (알 수없는 사용자를 위해 Visual Studio에서 단일 행으로 축소 될 소스 코드 블록을 표시 함). 결과적으로, 당신은 항상 잘 구조화 된 클래스 인 것처럼 보이는 것을 열었습니다. # REGION 구문의 깊게 중첩 된 양탄자 아래에 휩쓸린 쓰레기 더미를 찾으십시오. Logger의 단일 선언을 찾기 위해 LOG 영역을 접어야하는 등 단일 행 주위에 영역이있을 수도 있습니다. 물론, 일부 지역이 만들어진 후에 추가 된 많은 방법이 "잘못된"지역 범위에 배치되었습니다. 공포. 공포.

영역은 Visual Studio에 추가 된 최악의 기능 중 하나입니다 . 실제 OO 구조보다는 표면 구조화를 권장합니다.

요즘, 나는 #REGIONs를 보았습니다.


11
나는 이것을 십여 번 투표하려고했다 ...
TGnat

22
#REGION이 필요하다고 생각되면 리팩토링해야한다고 생각합니다.
Jay Bazuzi

23
일반적으로 지역별로 코드를 생성자, 속성, 이벤트, 메서드 및 멤버로 구성합니다. 소스를 관리하고 탐색하는 것이 매우 중요합니다 (특히 상당히 커질 수있는 일부 정적 유틸리티 클래스에서). 나는 그 이상을 사용하지 않을 것입니다.
Evan Plaice

26
우리는 간단한 코딩 표준을 가지고 있습니다. 영역을 중첩 하지 마십시오 . 그것들을 사용하여 관련 메소드 (초기화, 직렬화, 속성 등)를 그룹화하십시오.
Jason Williams

6
#regions의 유일한 좋은 목적은 편집 할 필요가없는 코드를 숨기는 입니다. 그것은 사람들이 직접 만지지 않는 올바른 알고리즘이나 코드 블록을 생성하는 코드 또는 코드를 생성 할 수 있습니다. 그러나 사람들이 작업 할 코드는 아닙니다. #region 상점에 갇힌 사람들에게는 정의로 축소되지만 지역을 확장하는 매크로가 있습니다. 여기를보십시오 : stackoverflow.com/questions/523220/awesome-visual-studio-macros/…
Kyralessa

80

한 직무에서 우리는 데이터베이스에서 헝가리어 표기법 을 사용해야했습니다 .

세부 사항을 기억할 수는 없지만 메모리에서 각 필드 이름에는 다음이 포함되어야했습니다.

  • 모음 없음
  • 모든 대문자
  • 테이블에 대한 참조
  • 데이터 타입 인디케이터
  • 데이터 길이
  • 널 입력 가능 표시기

예를 들어, 사람의 이름을 보유한 열을 호출 할 수 있습니다 PRSNFRSTNMVC30X(개인 테이블, 이름 열, Varchar 30 자, Null 아님).


14
죄송하지만 데이터베이스를 리팩터링하거나 VARCHAR의 길이가 달라야한다고 결정하면 어떻게됩니까? 갑자기 모든 코드를 살펴보고 변경해야합니다. 끔찍해 보인다.
Tom Morris

71
모음이 없나요 ??! 농담하는 거지?
Daniel Cassidy

39
이 표준을 시행 한 사람들은 이마에 융기 부분이 있었고 종종 명예와 전투에 대해 이야기 했습니까?
Ryan Roberts

10
하하, 그들은 DBA 였기 때문에 ...;)
Damovisa

14
url shorter를 통해 열 이름을 보내야합니다. PersonFirstNameVarchar30NotNull = bit.ly/cULlQc
Billy Coover

48

모든 중괄호 다음에 중괄호가 끝나는 내용에 대한 주석이 있어야합니다.

예 :

for (int i = 0; i < 10; i++)
{
    if (foo > bar)
    {
        printf("Foo greater than bar");
    } // End If (foo > bar)

    while (baz)
    {
       farb();
    } // End while (baz)
} // End For

21
더 의미가 있습니다 : 블록의 시작 부분을 말하기 위해 주석이 필요한 경우 블록이 너무 길거나 내용이 너무 복잡합니다.
Richard

5
길고 깊게 중첩 된 블록을 정렬하기가 어려울 수 있기 때문에 투표를하고 싶습니다. 이러한 의견이 도움이 될 수 있습니다. 나는 그 의견이 곧 잘못되고 매우 혼란 스러울 것이므로 길고 깊게 중첩 된 블록은 리팩토링해야하며 더 많은 의견을 추가하지 않아야한다는 신호이기 때문에 투표하고 싶습니다.
Jay Bazuzi

7
강력한 IDE가없는 세상에 좋은 아이디어였습니다.
IAdapter

9
@Jay는 괜찮은 IDE에서 하나의 버팀대를 강조 표시하고 다른 해당 버팀대를 강조 표시합니다. 나는 사람들이 이것을 할 때 개인적으로 혐오합니다.
Evan Plaice

3
당신의 예제는 미친 듯이 보이지만 (논리를 바꿀 때 중요하지 않고 속도를 늦출 수 있기 때문에) 항상 나쁜 것은 아닙니다. 이와 같은 주석은 전체 파일에 걸쳐있는 네임 스페이스 / 엔디 프 선언을 닫는 데 실제로 유용합니다.
jsternberg

38
#define AND  &&
#define OR   ||
#define EQ   ==

'그런가 말했다.


9
#include <iso646.h>가 훨씬 더 나은 선택이 아닌가?
AndrejaKo

3
@AndrejaKo :이 예정된 <iso646.h>; 이것은 C를 FORTRAN처럼 보이게하려는 시도였습니다.
Niall C.

2
이것이 실제로 코딩 표준입니까? 즉, 운영자를 직접 작성하는 것에 대한 회사 정책이 있습니까?
finnw

21
또한 있었나요 #define BEGIN {#DEFINE END }?
JBR 윌킨슨

3
그것은 C ++ 프로그래머가 Visual Basic (또는 Basic, 방언)처럼 보이도록 많은 정의를 가지고 있음을 본 Daily WTF 기사를 상기시킵니다. #define void Sub, #define} 끝, 그런 것들.
Wayne Molina

37
  • 지역 변수 이름은 모두 밑줄없이 소문자입니다

실제 예 : paymentmethodtotalshtml, contracttypechangecontexts, customsegmentspectexts,potentialmsceventref

뉴욕 타임즈의 무게는 다음 같습니다.

“워드 스페이스는 당연한 것으로 간주해서는 안됩니다. 모음을 특징으로하는 최초의 알파벳 인 고대 그리스어는 단어 공간없이 소리없이 해독 할 수 있습니다. […] 라틴어도 2 세기에 이르러 단어 분리를 중단했습니다. 눈이 분리되지 않은 텍스트를 읽으려면 훨씬 더 열심히 노력해야하기 때문에 손실이 수수께끼입니다. 그러나 고고학자 폴 생거 (Paul Saenger)가 설명했듯이, 고대 세계는 '더 쉽고 빠르게 읽을 수 있도록'하고 싶지 않았습니다.”

3
+1. 사소한 성가심이 더해집니다. 또한 코딩 표준 편집기 또는 PM이 "큰 부담이 아니므로 변경할 가치가 없다"고 말할 수 있기 때문에 논쟁하기가 어렵습니다.
finnw

1
바로 그거죠. (이 경우에도 이와 같은 빈번한 변수 이름을 읽으면 실제로 추가 할 수 있습니다.)
John Siracusa

57
두 가지 방법으로 파싱되는 것보다 이름을 발명하여 자신을 즐겁게하십시오. 페이지 똥, 페니스 등
Jay Bazuzi

4
@Jay * sexchange
구성자

2
@configurator : Visual Studio 디버거 팀이 감시 창에서 현재 진행중인 예외를 볼 수있는 기능을 개발할 때 "$ ex"라는 의사 변수를 추가하려고했습니다. 우리는 오랫동안 눈치 채지 못했습니다. 그런 다음 이름을 "$ exception"으로 바꾸었지만 여전히 's'가있는 것으로 읽습니다.
Jay Bazuzi

36

나는 "할 수있는 회사의 소프트웨어 지도자 질문을 받았다 간단하고, 다시 N dundant 코드를 ". 예를 들어 기존 함수에 새 매개 변수를 추가하는 것은 금지되었습니다. 대신 회귀를 피하기 위해 원본을 그대로두고 기능을 복제해야했습니다. 물론 공식적인 테스트는 없습니다 (시간 낭비).

또한 병합 소프트웨어를 사용하는 것도 금지되었습니다. 각 파일은 한 번에 한 명의 프로그래머 만 수정할 수 있습니다. 물론 수정 제어 소프트웨어는 공상 과학 소설이었습니다.

내 인생에서 가장 행복한 날은 해고되었을 때였 다.


그는 '리팩토링'이라는 단어를 들어 본 적이 없을 것입니다
nanda

3
그는 다른 말도 많이 듣지 못했습니다 ...
Wizard79

방법을 변경하지 않았기 때문에 공식적인 테스트가 필요하지 않았습니다 ...
구성자

36

데이터베이스와의 모든 상호 작용은 저장 프로 시저를 통해 수행해야 합니다 . 우리가 2010 년이 아니라 1997 년에 살고 있다면 이치에 맞을 것입니다.

나는 이것이 실제로 원래 질문의 모든 기준을 다룬다는 것을 깨달았습니다.

  • 생산성이 크게 떨어 졌습니까? 검사. ORM을 사용하십시오 .
  • 원래 합당한 이유가 있었지만 원래 관심사가 무의미한 후에 오랫동안 유지 되었습니까? 검사. 관리자는 1000 년 전 데이터베이스 서버 개발자였으며이 코딩 표준을 적용했습니다.
  • 그들 모두를 기억하는 것이 불가능한 목록에 너무 오래 있었습니까? 검사. 여기에는 '가능한 한 많은 데이터베이스에 데이터베이스에 저장해야하는 로직'이 포함되었습니다.
  • 저자가 좋은 코딩 연습을 장려하기보다는 마크를 남기려고한다고 생각 했습니까? 검사. 전 데이터베이스 서버 개발자 인 관리자에게 계속 연락합니다.
  • 왜 그들이 포함되었는지 몰랐습니까? 검사.

2
내 직장에있는이 캠프에 사람들이 있습니다. 그들이 성과 카드를 플레이하려고 할 때 재미 있고 그들의 지식이 얼마나 오래된 지 보여줍니다.
Monica Monica

3
wait .. 모든 진지하게, SP의 C #에서 직접 SQL 호출보다 SP의 성능이 더 좋다고 생각 했습니까?
Sk93

3
왜 그들이 포함되었는지 정확히 아는 것 같습니다. : P
Mason Wheeler

4
내가 자랐을 때 나는 왜 모든 것이 DB를 거쳐야 하는지를 이해했습니다.
Jé Queue

3
"모든 상호 작용은 SP를 사용해야하므로 OR / M을 사용할 수 없습니다"라는 멋진 추론을 들었습니다. 그러한 인력 낭비.
구성자

33

CTO가 '우리'가 더 빠르고 더 빨리 할 수 ​​있다고 믿었 기 때문에 STL 또는 다른 표준 C ++ 라이브러리를 사용할 수 없습니다. 목록 및 문자열 클래스와 같은 기본 구성조차도.


5
STL을 사용하지 않는 사람이 STL을 충분히 사용하지 못하고 옳았 기 때문에 유일하게 들었던 것은 게임이었습니다. EA는 게임을 위해 자체 STL을 구현했습니다. 나는 그것이 더 이상 중요하지 않다고 생각하고 (현대 게임은 GPU 제한적 임) 그들이 그것을 사용하는지 의심합니다. 그러나 그럼에도 불구 하고 완전히 새로운 라이브러리가 아닌 STL 의 구현 이었습니다. EASTL을 사용할 때 여전히 STL을 사용하고있었습니다.
Matt Olenik

1
@Matt :이를 위해 EA 불만은 메모리 사용 및 초기화에 중점을 두었습니다. 자체 구현은 메모리를 덜 소비하고 더 빨리 해제했으며 나중에 초기화 될 객체를 초기화하지 않았습니다.
Matthieu M.

나는 그에게 직접 코딩하도록 지시했다.
rightfold

31

헝가리 표기법

" 찰스 시몬이의 헝가리 표기법 식별자 명명 규칙에 대한 설명 "에서 발췌 한 샘플 .

1 #“sy.h”포함
2 개의 extern int * rgwDic;
3 extern int bsyMac;
4 구조체 SY * PsySz (char sz [])
6 {
7 자 * pch;
8 int cch;
9 구조체 SY * psy, * PsyCreate ();
10 int * pbsy;
11 int cwSz;
12 부호없는 wHash = 0;
13 pch = sz;
14 동안 (* pch! = 0
15 wHash = (wHash11 + * pch ++;
16 cch = pch-sz;
17 pbsy = & rgbsyHash [(wHash & 077777) % cwHash];
(; * pbsy! = 0; pbsy = & psy-> bsyNext)의 경우 18
19 {
20 자 * szSy;
21 szSy = (psy = (구조 SY *) & rgwDic [* pbsy])-> sz;
22 pch = sz;
23 동안 (* pch == * szSy ++)
24 {
25이면 (* pch ++ == 0)
26 귀국 (psy);
27}
28}
29 cwSz = 0;
(cch> = 2 인 경우) 30
31 cwSz = (cch-2 / sizeof (int) +1;
32 * pbsy = (int *) (psy = PsyCreate (cwSY + cwSz))-rgwDic;
33 제로 ((int *) psy, cwSY);
34 bltbyte (sz, psy-> sz, cch + 1);
35 귀국 (psy);
36}

5
아야 아야 아야 아야 아야!
Reinstate Monica

22
이 샘플에서 가장 큰 문제는 의미없는 변수 이름입니다. 헝가리어 접두사를 제거하고 그 중 일부는 1 자 또는 0 자입니다.
finnw

8
이것은 체계 헝가리어이며, 약한 유형의 언어에서 유용합니다 (이름에서 이러한 언어로 작업하는 데 중요한 유형 정보를 인코딩하기 때문에). 강력한 유형의 언어에서는 쓸모가 없습니다. 강력한 형식의 언어에 대한 더 좋은 대안은 Apps Hungarian입니다.이 언어는 변수 (멤버, 포인터, 휘발성, 인덱서) 의 사용 에 대한 중요한 정보를 인코딩 합니다. 언어 자체는 지원하지 않습니다.
Jason Williams

5
오 제발. 난 적이 이제까지 멤버 지방을 혼동하지, 난 / 무엇을 회원 / 주민 / 필드에 그 바보 헝가리어를 사용하지 마십시오. 나는 그들이에 조엘의 예처럼, '안전'과 '안전'과 같은 문자열의 다른 종류의 구별하기 위해 유용 할 수 있습니다 생각하는 잘못된 코드 조회의 잘못된 만들기
피규

3
@configurator : Joel의 예제는 끔찍합니다. 다른 유형을 사용하는 것이 더 좋을 것입니다. 그러면 컴파일러가 사용을 강제합니다.
Matthieu M.

28

한 번은 프로젝트 리더가 모든 변수 (모든 변수)에 "v"접두사를 지정해야하는 프로젝트를 수행했습니다. 따라서 vCount, vFirstName, vIsWarranty 등

왜? "VBScript에서 작업하고 있기 때문에 모든 것이 변형입니다."

이런 씨발.


93
한 번은 모든 변수 (모든 변수)에 "$"접두사가 필요한 언어로 작업 한 적이 있습니다.
nohat

6
@ nohat : 그리고 당신은 그것이 놀랍다는 것을 깨달았습니다.
Josh K

한 번은 모든 변수가 '$'또는 '%'또는 '@'와 같이 구두점으로 시작되는 언어로 일했습니다. 나는 여전히 그렇습니다.
David Thornley

3
이것은 f이전 함수 를 넣어야 할 때만 실제로 문제가되며 코드는 실제로 fUcked (vUp)입니다.
Joe D

1
다양한 버전의 Perl과 같은 소리

26

거의 이것을 잊었다 :

관리자로부터 인용 :

자신의 코드에서 발견 된 문제의 버그를 수정하거나 문서화하지 마십시오. 고객은 향후 몇 년 동안 고객을 식별하고 수정하기 위해 비용을 지불합니다.

이것은 소비자 소프트웨어를위한 것이 아니라 단일 대규모 조직을위한 맞춤형입니다. 말할 것도없이, 고객은 그 후 몇 년 동안 돈을 지불했습니다. 사소한 것처럼 보이지만 버그를 무시하는 것은 버그를 찾는 것보다 어렵습니다.


2
이것은 끔찍한 정책입니다. 이 관리자가 통조림 이었기를 바랍니다.
Bernard

@ Bernard- 대부분의 조직에서 장기적인 수익원을 창출하는 것은 빠른 홍보의 근거입니다. 바라건대, 다른 누군가가 이것으로 광기를 보았고 실수로 주차장에서 그를 뛰어 넘었습니다.
Jim Rush

24

모든 비 개인 메서드, 상수, 열거 및 속성에 대한 XML 주석 적용

사람들이 모든 것을 위해 빈 주석 스터브를 만들거나 GhostDoc을 설치하고 자동 생성 된 주석을 추가하도록 //

/// <summary>
/// Validations the handler.
/// </summary>
/// <param name="propertyName">The property name.</param>
public void ValidationHandler(string propertyName) 
{
   // whatever
}

[편집]이 말을 어리석은 표준으로 언급 한 이유는 메서드 주석이 바보라고 생각하기 때문이 아니라 이러한 주석의 품질이 어떤 식 으로든 강요되지 않고 코드 파일에 많은 혼란을 야기하기 때문입니다. . 맹인 "주석이 있어야합니다"빌드 요구 사항보다 의미있는 코드 문서를 작성하는 더 좋은 방법이 있습니다.


13
' Validations the handler'-uh-oh
Eric

8
+1 어이 싫어요. 의견을 생성하기 위해 소프트웨어를 사용하면 의견이 필요하지 않습니다.
bleevo

9
나는 이것이 나쁜 규칙이라고 생각하지 않습니다. 처음으로 유지 관리 해야하는 방법을 읽을 때 모든 인수에 대한 사양이 있으면 많은 도움이됩니다. 일반적으로 미묘한 부분이 있습니다 (예 : 인수가 null 인 경우, 빈 컬렉션 인 경우, 존재하지 않는 파일의 이름 등). 또 다른 좋은 (IMHO) 규칙은 메서드 이름은 동사 여야하지만 예제에서는 명사입니다.
finnw

3
@finnw 나는 그것이 좋은 습관이지만 나쁜 표준이라고 생각합니다. 개발자가 보증을받을 때 (예외 세부 사항 등) 의미있는 메소드 주석을 작성하고 작성하는 것이 좋습니다. 그렇지 않으면 큰 혼란으로 끝납니다. 전자의 경우에는 컴파일 수준의 시행이 전혀 필요하지 않습니다.
Adam Lear

7
문서화의 전형적인 사례. 명백히 명백한 것 외에는 아무 것도 말하지 않는 의견은 눈에 띄게 죽여야한다.
Cumbayah

23

실제로 코딩 표준은 아니지만 'changelog.txt'라는 소스 제어 파일이 있습니다.

체크인 할 때마다이 파일에 항목을 수동으로 추가해야했습니다. 이 항목은 Subversion 개정 번호와 체크인 주석입니다.

새로운 CTO가 시작되고 누군가가 그에게이 사실을 말했을 때, 그는 즉시 경영진의 결정을 내렸다. 이것은 몇 년 동안 진행되었습니다.


6
아무도 몰랐어요 svn log?
Htbaa

1
정책을 시작한 사람들은 오랫동안 사라졌고 그 이후의 사람들은 계속 진행했습니다. 나는 새로운 CTO (나의 친구)와 같은 주에 시작했고 우리는 이것을보고 WTF를 말했습니까?
Jim A

20

내가 작업 한 일부 장소는 삭제하지 않고 사용되지 않거나 사용되지 않는 코드를 주석 처리해야한다고 주장했습니다. VCS는 히스토리 등을 신뢰하는 대신 주석 처리 된 코드를 통해 파일에서 고통스럽게 유지되었습니다.

내가 찾은 큰 문제는 종종 코드가 주석 처리 된 이유를 알지 못한다는 것입니다. 일부 개발자가 적극적으로 변경하여 참조 용으로 유지하고 싶었거나 더 이상 필요하지 않았기 때문입니까?


3
최근에 주석 처리 된 코드를 많이 삭제했습니다.
CoderDennis

2
주석 처리 된 코드와 주석 처리 된 이유에 대한 좋은 설명이 동반되지 않는 한 일반적으로 주석 처리 된 코드를 삭제합니다.
Jeremy Wiebe

전적으로 동의합니다. 코드로 작업하는 한 코드 주석 처리는 가능하지만 릴리스 버전 / 메인 브랜치에 들어가는 모든 코드에는 주석 처리 된 코드가 없어야합니다. 누군가는 그들이 어떻게 다르게 수행 될 수 있는지 알고 싶다고 말했다. 나는 그것이 언급 된 이유로 자극적이라는 것을 알았습니다 : 그것은 쓸모없고, 해결 방법이며, 또 다른 방법입니까? WTF
앤 슈에 슬러

VS2013 "Peeks"를 사용하면 모든 것이 가능합니다. 그러나 우리는 "변경된 방정식-이니셜"또는 그와 비슷한 내용의 주석을 달았습니다. 그래서 누군가는 필요한 경우 TFS / VCS에서 이전 코드가 어떻게 보일지 궁금해합니다. 따라서 주석 처리 된 10 줄 대신 한 줄입니다. 그러나 VS2013은 훌륭합니다. TFS 기록을 바로 보여줍니다.
Suamere

17

내가 참여한 최악의 코딩 표준은 전혀없는 코드 기반입니다. 오히려 전혀없는 코드베이스에서 작업하는 것보다 완전히 동의하지 않는 코딩 표준을 따르고 싶습니다. 코드베이스의 새로운 부분을 배우기가 훨씬 어렵습니다.


16

버전 제어에 대한 인라인 주석을 강제하는 것은 내가 무시한 가장 의미없는 코딩 표준에 관한 것입니다.

//Changed on 2/2/2004 By Ryan Roberts for work item #2323332
Dim Some Horrendous VB
//End Changed

200 개가 넘는 필드와 40 개의 트리거가있는 고도로 다목적 된 테이블이있는 데이터베이스를 '유지'하면서 공백을 올바르게 사용해야한다고 주장한 Oracle DBA가 가까워졌습니다.


그것은 매우 끔찍하다
Evan Plaice

5
음 딤섬 ...
구성자

물론 소스 제어를하기 전에이 작업을 수행했습니다. 우리가 소스 제어권을 가지게되자, 그것은 습관이었고, 우리는 팀이 그것을 중단시키기 위해 실제로 개입이 필요했습니다. 결국 우리는 발견 된 모든 기존 항목을 중지하고 삭제했습니다.
Scott Whitlock

우리 선임 개발자는 여전히 우리에게 이것을하도록 강요합니다. 나는 그것을 멀리 할 수 ​​있다고 생각할 때마다 (때로는 내가 할 수 없다는 것을 알 때) 정책을 무시합니다.
Joshua Smith

우리 팀에는 여전히 어디서나이 작업을 수행하는 사람이 있습니다 (버전 제어를받는 SQL 스크립트에 거대한 "변경 로그"도 포함합니다). 나에게 설명 된 것처럼, 몇 가지 변경 / 커밋 후에는 변경된 날짜를 기억하지 못하므로 변경 로그는 파일을 열 때 누가 무엇을 왜 변경했는지 즉시 알 수 있습니다.
웨인 몰리나

14

모든 클래스 멤버 함수에 클래스 이름과 가시성이 접두어로 붙도록 결정한 C ++ 첫 번째 타이머가 주도하는 프로젝트에서 코드 검토를 수행했습니다.

class MyClass
{
   public:
      void MyClass_Public_setValue(int value);
}

1
왜 그런지 물어 봤어 ? 나는 그들의 동기를 알고 싶습니다 ..
JBRWilkinson

1
와우, 왜 그 남자는 수업을 사용하고 있습니까?
Mateen Ulhaq

9

네 개의 공백으로 모든 코드를 들여 쓰기해야합니다.)


2
이것은 어떻게 나빴습니까?
Jay Bazuzi

1
그러면 모든 줄의 시작 부분에 불필요한 공간이 4 개 있기 때문에?
nohat

아, 이제 알겠다
대안

21
예, StackOverflow에는 실제로 코딩 표준이 잘못되었습니다. :-)
P Shved

들여 쓰기가 크면 코드 중첩 수준을 낮게 유지해야합니다. 나는 8의 들여 쓰기를 보았고 잘 작동했습니다.
Toon Krijthe

9

나는 몇 년 전에 모든 코드를 왼쪽 정렬해야했는데 들여 쓰기가 없었습니다. 이 정책을 생각 해낸 사람은 긴 코드 줄을 볼 때 가로로 스크롤하는 것을 싫어하여 눈으로 탁구를 치는 것과 같았습니다.


그것은 끔찍하고 끔찍한 코딩 표준입니다. 그리고 어리석은 이유도 있습니다!
gablin

4
가로로 스크롤해야하는 경우 (예 : 페이지 절반 이상) 잘못된 것이있을 수 있습니다. 코드를 완전히 읽을 수 없으므로 들여 쓰기가 좋지 않습니다. 나는 78- 콜 제한을 고수하려고 노력하지만, 그 양을 넘어갈 필요가 있다면 상관하지 않지만 피하려고합니다.
Htbaa

8

이것은 코딩 표준이없는 방법에 대한 더 많은 예입니다.

큰 은행에서 일하는 계약자는 표준을 따르는 것이 최고라고 주장했다. 이 응용 프로그램은 dBase / Clipper로 작성되었으며, 유일한 개발자였으며 ​​물론 표준을 개발했습니다.

  • 모든 것이 대문자입니다. 그가 한 희귀 한 의견을 포함하여 모든 것을 의미합니다.
  • 들여 쓰기가 없습니다.
  • 변수 이름은 APRGNAME의 선을 따라있었습니다. A = 변수 범위 (예 : 공용의 경우 P, PRG = 변수를 작성한 소스 파일의 처음 세 문자, NAME = 변수 이름은 dBase / Clipper가 허용하는 나머지 6 자)입니다.
  • 소스 코드의 처음 4 줄과 마지막 4 줄은 80 * 길이였습니다. 왜? 그래서 그는 도트 매트릭스 프린터가 파일 인쇄를 시작하고 마치는 소리를들을 수있었습니다. 메모리는 전체 프로그램이 매주 메인 프레임 인 20,000 페이지를 통해 인쇄되었습니다.
  • 나는 내 뇌에서 덤벼 들었던 것들이 더 많을 것이라고 확신한다.

저는 그 단계에서 매우 독창적 인 프로그래머 였지만 프로젝트를 맡기 전에 미친 과학자의 말을 듣지 않고 지옥에서 나갈 수있을만큼 충분히 알고있었습니다.

그렇습니다. 우리는 경영진에게 이러한 관행이 얼마나 나쁜지에 대해 말했지만 항상 "계약자에게 그가 무엇을 말하고 있는지 알아야하는 최고 달러를 지불했습니다."


7
오래된 공룡을 조롱하지 마십시오. 그들은 우리를 가능하게했습니다.
P Shved

4
직업 보안과 같은 소리.
MIA

7
각 파일이 인쇄되는시기를 알 수 있도록 오디오 마커가 있습니다. \07이제 각 파일의 시작 부분 에 추가하겠습니다 .
구성자

2
dBase의 변수 "범위 지정"규칙이 존재하지 않기 때문에 이와 같은 이름 지정 체계 (대문자는 아님)를 사용하는 것이 의미가 있습니다. 모든 것이 사실상 세계적이었습니다. i한 프로 시저에서 배열을 인덱싱 하는 데 사용 i하면 호출 프로 시저를 방해 할 수 있습니다. 이 "그림자" 를 사용 PRIVATE ALL LIKE m*하고 PRIVATE i방지 해야합니다.
Gerry

8

내 과거에서 한 번 더 폭발.

회사 소유자의 인용문 :

Java로 작성된 해당 {expletive} 프로젝트에서 2 천 5 백만을 잃었 기 때문에 해석 언어를 사용하여 작성된 코드는 없습니다.

Java 프로젝트는 수십 개의 주식을 처리하도록 설계된 주식 거래 시스템으로, 현재 수천 개의 주식을 처리하는 데 사용되었습니다. 디자인 결함이나 하드웨어 불량 문제를 해결하는 대신 회사 전체는 모든 비 C / C ++ 응용 프로그램을 C / C ++로 변환해야했으며 모든 새로운 개발은 C / C ++로 이루어져야했습니다. 해석 적 언어는 컴파일되지 않은 것을 의미했으며 소유자는 어셈블러, C 및 C ++ 만 컴파일 된 것으로 간주했습니다.

대부분의 코드가 Java와 Perl로 된 800 명의 개인 회사의 경우, 회사 전체가 다음 몇 년 동안 C / C ++로 완벽하게 훌륭한 코드를 다시 작성하는 데 대부분의 시간을 보냈습니다.

충분히 재미, 일부 이십년이 실패하기 전에, 나는 기술 리드 대신 빠른 정렬로 대체되는 어셈블러로 코딩 할 필요가 우리의 정렬 논리가 (이 버블 정렬했다) 결정하는 다른 회사에 있었기 때문에 - 알고리즘이 할 성능을 향상시키지 않습니다. 성능을 향상시키는 유일한 방법은 동일한 논리를 어셈블러에서 다시 작성하는 것입니다.

두 경우 모두, 나는 지시가 내려진 직후 떠났다.


어느 회사가 오늘도 운영되고 있습니까?
finnw

Java에서 '이동'한 것은 다른 것이 오래 전에 사라졌습니다. 그들은 TRS-80에서 PC 로의 전환에서 살아남지 못했습니다.
David B

6

많은 프로그래머들처럼 (그러나 충분하지는 않지만) 코드 장식이 싫어요. 변수 이름에 달러 기호 ($) 접두사를 사용하거나 getter / setter가없는 경우에도 개인 변수에 밑줄을 사용해야 할 때 불쾌합니다. 그것을 이해하기 위해 코드를 장식해야한다면, 지옥을 꺼내야합니다!


"Will"이 말했듯이 "저는 개인 변수가 내 지능으로 그룹화되도록 밑줄을 추가합니다. 그러나 유형 범위의 변수에 대해서만이 작업을 수행합니다. 메서드 내에서 선언 된 변수 또는 더 좁은 범위 "간편하게 분리하고 덜 사용 된 변수를 함께 유지합니다." 나는 그에게 동의해야합니다.
7wp

1
선호하는 독점 IDE에서 변수를 그룹화하는 것이 모든 코드를 손상시키는 충분한 이유라고 생각하지 않습니다.
Adam Harte

그것이 코드라면 IDE에서 사용 가능하게 만드는 것은 완전히 합리적입니다. 또한 밑줄을 추가하는 것은 많은 언어에서 일반적이므로 사람들이 볼 때마다 그 의미를 알고 있습니다.
rjmunro

1
+1 좋은 IDE ( 정규 검색을 사용할 수있는 IDE)를 사용하는 것이 더 합리적입니다. 스크래치 IDE, 텍스트 편집기 및 터미널 사용법을 배우면 훨씬 더 나은 프로그래머가 될 것입니다. 부수적으로, 나는 특히 perl sigils를 좋아하지 않지만 적어도 PHP와 달리 용도가 있습니다.
대안

6
한숨 .. "IDE 's는 겁쟁이들을위한"사람들 중 하나입니다.
일러

6

나는 전달 된 모든 매개 변수의 이름을 P1, P2, P3 등으로 지정 해야하는 잠시 동안 웹 시스템을 사용하여 작업했습니다. 광범위한 문서없이 무엇을 어디에 있는지 알 수있는 기회는 없습니다.

또한 동일한 시스템에서 코딩 표준은 아니지만 모든 단일 파일의 이름은 xyz0001.ext, xyz0002.ext, xyz0003.ext 등입니다. 여기서 xyz는 응용 프로그램 자체의 코드입니다.


6

정확히 1976 년 전인 1976 년입니다. 내 상사는 Edsger Dijkstra에 대해 들어 본 적이 없거나 CACM 문제를 읽지 못했지만 "GOTO가 나쁘다"는 소문을 들었으므로 COBOL 프로그램에서 GOTO를 사용할 수 없었습니다. 이것은 COBOL이 "end if"를 추가하기 이전이었을 때, 3 가지 고전적인 제어 구조 중 2 분의 2 만 가지고있었습니다 (시퀀스, if / then / else, 수행 (즉, 수행)). 그는 기본 프로그램에서 GOTO를 허용하고 어셈블러 언어 프로그램에서 분기 명령을 허용했습니다.

이것은 일종의 "당신은 거기에 있어야했다"라는 이야기입니다. 내가 아는 한, 1976 년 이후 발명 된 모든 언어에는 적절한 제어 구조가있어 GOTO를 사용할 필요가 없습니다. 그러나 요점은 왜 GOTO가 유해한 것으로 여겨지는지 또는 어떤 언어가 유아 장애이고 어떤 언어가 치명적인 질병인지 알지 못했습니다.


6

프로젝트에서 일하면서 수석 건축가가 명시 적 코드를 작성해야했습니다. 코드에서 찾은 최악의 예 중 하나는 다음과 같습니다.

private string DoSomething( bool verbose )
{
    if ( verbose ) { return someString; }
    else if ( !verbose ) { return otherString; }
    else { return string.Empty; }
}

ReSharper 조차도 이것이 잘못되었다고 말했습니다!


9
void로 선언 된 함수에서 무언가를 반환하기가 어려울 것입니다.
Mircea Chirea

7
@MAttB 어떤 조건에서 최종 ( else) 분기를 수행할지 고려하십시오.
Richard

6
else {return string.Empty; }은 5 년 후 유지 보수 개발자가 위의 두 행을 편집 한 경우 실행됩니다. 그러나 string.Empty를 반환하면 불가능한 조건 이었던 사실이 숨겨 집니다. 대신 InvalidOperationException ( "이 코드는 세 가지 값 논리를 지원하도록 설계되지 않았습니다");
MatthewMartin

1
이것은 끔찍하다. 무슨 일이야 return verbose ? someString : someOtherString;?
Callum Rogers

1
@callum 삼항 연산자는 금지 될 수있다 : 전에 거기 ...
hplbsh

6

마지막 직장에서 "표준"은 저를 고용 한 사람이 준 것에 대한 매우 강력한 용어입니다. ColdFusion 및 SQL 에서 웹 사이트를 프로그래밍 할 때 다음과 같은 코딩 요구 사항이 주어졌습니다.

  • 포함을 사용하지 마십시오. 하나의 큰 페이지를 좋아합니다
  • 변수 및 열 이름의 단어는 항상 밑줄로 구분하십시오 (isactive, firstname 등 제외).
  • 약어를 사용하지 마십시오. 항상 이름을 쓰십시오 (그는 종종 fname 등을 썼습니다)
  • 혼동되는 이름을 사용하지 마십시오 (양은 다르지만 관련 사항을 측정 한 amount_charged 및 charge_amount
  • DIV를 사용하지 말고 최소한의 CSS를 사용하십시오. 대신 중첩 테이블을 사용하십시오 (한 번에 6 층 깊이를 발견했습니다).
  • 쿼리를 캐시하지 마십시오. 이제까지.
  • 둘 이상의 페이지에서 변수를 사용 하시겠습니까? 응용 범위.
  • 각 페이지는 자체 try / catch 블록입니다. 전역 오류 처리기가 필요하지 않습니다.

나는 그가 종료하자마자 이것들을 바꾸기 시작했습니다.


... 나에게 공평 보인다 "혼란 이름을 사용하지 마십시오"
8128

1
그것은 절대적으로 공정한 지침입니다. 내 요점은 그가 전혀 따르지 않았다는 것이었다. 나는 "혼란하지 않다"는 그의 생각과 내 생각이 다르다고 생각한다.
Ben Doom

4

내 인생에서 C ++ 코더로서, 두 개의 "불쾌한"규칙이 시행되었습니다.

  1. "VC ++ 4.1은이를 지원하지 않기 때문에 STL을 사용할 수 없습니다 (현재로서는 VC ++ 6.0으로 전환 할 수 없습니다)."
  2. "마 하지 , 나는 (프로젝트 리더의 이름은 삭제) 학생으로 쓴 힙 정렬 알고리즘의 구현을 사용이 O 수 있기 때문에 (N ^ 2) 나쁜 경우는, 이것은 QuickSort를 사용합니다."

6
프로젝트 책임자의 HeapSort에 어떤 문제가 있습니까?
7wp

4
실제로 코드가 외부 사용자 입력을 받아 들인 경우 QuickSort는 O(n^2)DOS 공격 (최악의 경우 입력)을 열 때 잘못 될 수 있습니다 . 또한 전환이 불가능한 이유는 STL을 사용하지 않았다는 이유입니다.
Maciej Piechotka

4

모든 클래스와 클래스 멤버에 대한 XML 문서를 작성해야합니다. 개인 포함. 기본 ghostdoc 주석을 사용하도록 매혹되었습니다.

public class User 
{
    /// <summary>
    /// the _userID
    /// </summary>
    private int _userID;
}

이 이전 답변 과 매우 유사합니다 .
finnw

예. 나는 또한 개인 회원에 대해서도 언급해야합니다. 말이 덜 이해됩니다.
Carl Bergquist

고스트 독을 사용하도록 권유?! 가
구성자
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.