다음과 같은 표준 코딩 작업을 수행 한 적이 있습니까?
- 생산성이 크게 떨어 졌습니까?
- 원래 합당한 이유가 있었지만 원래 관심사가 무의미한 후에 오랫동안 유지 되었습니까?
- 그들 모두를 기억하는 것이 불가능한 목록에 너무 오래 있었습니까?
- 저자가 좋은 코딩 연습을 장려하기보다는 마크를 남기려고한다고 생각 했습니까?
- 왜 그들이 포함되었는지 몰랐습니까?
그렇다면 가장 좋아하는 규칙은 무엇이며 왜 그렇습니까?
여기 몇 가지 예
다음과 같은 표준 코딩 작업을 수행 한 적이 있습니까?
그렇다면 가장 좋아하는 규칙은 무엇이며 왜 그렇습니까?
여기 몇 가지 예
답변:
이것은 약간의 깃털을 주름 칠 수 있지만 각 방법의 상단에 템플릿 블록 주석을 요구하는 표준은 항상 쓰레기를 벌레로 만듭니다.
1) 업데이트 할 때 알 수있는 실제 작업을 수행하는 코드와 너무 떨어져 있기 때문에 항상 최신 상태가 아닙니다. 나쁜 코멘트는 코멘트가없는 것보다 나쁩니다.
2) 그들은 종종 소스 제어 도구에 이미 포함 된 정보를 반복하지만 정확도는 떨어집니다. 예 : 마지막 수정 자, 수정 날짜 / 이유 목록.
한 번 교수님에게 각 코드 줄에 대해 적어도 하나의 주석이 필요하다고 요구했습니다.
//Set x to 3
var x = 3;
//if x is greater than 2
if(x>2){
//Print x
Print(x);
}
꽤 어리 석었습니다.
// comment
그 전에 줄 을 써야 합니까?
우리 회사 (C #)의 코딩 표준은 #REGION을 광범위하게 사용하도록 요구했습니다 (알 수없는 사용자를 위해 Visual Studio에서 단일 행으로 축소 될 소스 코드 블록을 표시 함). 결과적으로, 당신은 항상 잘 구조화 된 클래스 인 것처럼 보이는 것을 열었습니다. # REGION 구문의 깊게 중첩 된 양탄자 아래에 휩쓸린 쓰레기 더미를 찾으십시오. Logger의 단일 선언을 찾기 위해 LOG 영역을 접어야하는 등 단일 행 주위에 영역이있을 수도 있습니다. 물론, 일부 지역이 만들어진 후에 추가 된 많은 방법이 "잘못된"지역 범위에 배치되었습니다. 공포. 공포.
영역은 Visual Studio에 추가 된 최악의 기능 중 하나입니다 . 실제 OO 구조보다는 표면 구조화를 권장합니다.
요즘, 나는 #REGIONs를 보았습니다.
한 직무에서 우리는 데이터베이스에서 헝가리어 표기법 을 사용해야했습니다 .
세부 사항을 기억할 수는 없지만 메모리에서 각 필드 이름에는 다음이 포함되어야했습니다.
예를 들어, 사람의 이름을 보유한 열을 호출 할 수 있습니다 PRSNFRSTNMVC30X
(개인 테이블, 이름 열, Varchar 30 자, Null 아님).
모든 중괄호 다음에 중괄호가 끝나는 내용에 대한 주석이 있어야합니다.
예 :
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
#define AND &&
#define OR ||
#define EQ ==
'그런가 말했다.
#define BEGIN {
와 #DEFINE END }
?
실제 예 : paymentmethodtotalshtml
, contracttypechangecontexts
, customsegmentspectexts
,potentialmsceventref
“워드 스페이스는 당연한 것으로 간주해서는 안됩니다. 모음을 특징으로하는 최초의 알파벳 인 고대 그리스어는 단어 공간없이 소리없이 해독 할 수 있습니다. […] 라틴어도 2 세기에 이르러 단어 분리를 중단했습니다. 눈이 분리되지 않은 텍스트를 읽으려면 훨씬 더 열심히 노력해야하기 때문에 손실이 수수께끼입니다. 그러나 고고학자 폴 생거 (Paul Saenger)가 설명했듯이, 고대 세계는 '더 쉽고 빠르게 읽을 수 있도록'하고 싶지 않았습니다.”
나는 "할 수있는 회사의 소프트웨어 지도자 질문을 받았다 간단하고, 다시 N dundant 코드를 ". 예를 들어 기존 함수에 새 매개 변수를 추가하는 것은 금지되었습니다. 대신 회귀를 피하기 위해 원본을 그대로두고 기능을 복제해야했습니다. 물론 공식적인 테스트는 없습니다 (시간 낭비).
또한 병합 소프트웨어를 사용하는 것도 금지되었습니다. 각 파일은 한 번에 한 명의 프로그래머 만 수정할 수 있습니다. 물론 수정 제어 소프트웨어는 공상 과학 소설이었습니다.
내 인생에서 가장 행복한 날은 해고되었을 때였 다.
데이터베이스와의 모든 상호 작용은 저장 프로 시저를 통해 수행해야 합니다 . 우리가 2010 년이 아니라 1997 년에 살고 있다면 이치에 맞을 것입니다.
나는 이것이 실제로 원래 질문의 모든 기준을 다룬다는 것을 깨달았습니다.
CTO가 '우리'가 더 빠르고 더 빨리 할 수 있다고 믿었 기 때문에 STL 또는 다른 표준 C ++ 라이브러리를 사용할 수 없습니다. 목록 및 문자열 클래스와 같은 기본 구성조차도.
헝가리 표기법
" 찰스 시몬이의 헝가리 표기법 식별자 명명 규칙에 대한 설명 "에서 발췌 한 샘플 .
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}
한 번은 프로젝트 리더가 모든 변수 (모든 변수)에 "v"접두사를 지정해야하는 프로젝트를 수행했습니다. 따라서 vCount, vFirstName, vIsWarranty 등
왜? "VBScript에서 작업하고 있기 때문에 모든 것이 변형입니다."
이런 씨발.
f
이전 함수 를 넣어야 할 때만 실제로 문제가되며 코드는 실제로 fUcked (vUp)
입니다.
거의 이것을 잊었다 :
관리자로부터 인용 :
자신의 코드에서 발견 된 문제의 버그를 수정하거나 문서화하지 마십시오. 고객은 향후 몇 년 동안 고객을 식별하고 수정하기 위해 비용을 지불합니다.
이것은 소비자 소프트웨어를위한 것이 아니라 단일 대규모 조직을위한 맞춤형입니다. 말할 것도없이, 고객은 그 후 몇 년 동안 돈을 지불했습니다. 사소한 것처럼 보이지만 버그를 무시하는 것은 버그를 찾는 것보다 어렵습니다.
모든 비 개인 메서드, 상수, 열거 및 속성에 대한 XML 주석 적용
사람들이 모든 것을 위해 빈 주석 스터브를 만들거나 GhostDoc을 설치하고 자동 생성 된 주석을 추가하도록 //
/// <summary>
/// Validations the handler.
/// </summary>
/// <param name="propertyName">The property name.</param>
public void ValidationHandler(string propertyName)
{
// whatever
}
[편집]이 말을 어리석은 표준으로 언급 한 이유는 메서드 주석이 바보라고 생각하기 때문이 아니라 이러한 주석의 품질이 어떤 식 으로든 강요되지 않고 코드 파일에 많은 혼란을 야기하기 때문입니다. . 맹인 "주석이 있어야합니다"빌드 요구 사항보다 의미있는 코드 문서를 작성하는 더 좋은 방법이 있습니다.
Validations the handler
'-uh-oh
실제로 코딩 표준은 아니지만 'changelog.txt'라는 소스 제어 파일이 있습니다.
체크인 할 때마다이 파일에 항목을 수동으로 추가해야했습니다. 이 항목은 Subversion 개정 번호와 체크인 주석입니다.
새로운 CTO가 시작되고 누군가가 그에게이 사실을 말했을 때, 그는 즉시 경영진의 결정을 내렸다. 이것은 몇 년 동안 진행되었습니다.
svn log
?
내가 작업 한 일부 장소는 삭제하지 않고 사용되지 않거나 사용되지 않는 코드를 주석 처리해야한다고 주장했습니다. VCS는 히스토리 등을 신뢰하는 대신 주석 처리 된 코드를 통해 파일에서 고통스럽게 유지되었습니다.
내가 찾은 큰 문제는 종종 코드가 주석 처리 된 이유를 알지 못한다는 것입니다. 일부 개발자가 적극적으로 변경하여 참조 용으로 유지하고 싶었거나 더 이상 필요하지 않았기 때문입니까?
버전 제어에 대한 인라인 주석을 강제하는 것은 내가 무시한 가장 의미없는 코딩 표준에 관한 것입니다.
//Changed on 2/2/2004 By Ryan Roberts for work item #2323332
Dim Some Horrendous VB
//End Changed
200 개가 넘는 필드와 40 개의 트리거가있는 고도로 다목적 된 테이블이있는 데이터베이스를 '유지'하면서 공백을 올바르게 사용해야한다고 주장한 Oracle DBA가 가까워졌습니다.
모든 클래스 멤버 함수에 클래스 이름과 가시성이 접두어로 붙도록 결정한 C ++ 첫 번째 타이머가 주도하는 프로젝트에서 코드 검토를 수행했습니다.
class MyClass
{
public:
void MyClass_Public_setValue(int value);
}
네 개의 공백으로 모든 코드를 들여 쓰기해야합니다.)
나는 몇 년 전에 모든 코드를 왼쪽 정렬해야했는데 들여 쓰기가 없었습니다. 이 정책을 생각 해낸 사람은 긴 코드 줄을 볼 때 가로로 스크롤하는 것을 싫어하여 눈으로 탁구를 치는 것과 같았습니다.
이것은 코딩 표준이없는 방법에 대한 더 많은 예입니다.
큰 은행에서 일하는 계약자는 표준을 따르는 것이 최고라고 주장했다. 이 응용 프로그램은 dBase / Clipper로 작성되었으며, 유일한 개발자였으며 물론 표준을 개발했습니다.
저는 그 단계에서 매우 독창적 인 프로그래머 였지만 프로젝트를 맡기 전에 미친 과학자의 말을 듣지 않고 지옥에서 나갈 수있을만큼 충분히 알고있었습니다.
그렇습니다. 우리는 경영진에게 이러한 관행이 얼마나 나쁜지에 대해 말했지만 항상 "계약자에게 그가 무엇을 말하고 있는지 알아야하는 최고 달러를 지불했습니다."
\07
이제 각 파일의 시작 부분 에 추가하겠습니다 .
i
한 프로 시저에서 배열을 인덱싱 하는 데 사용 i
하면 호출 프로 시저를 방해 할 수 있습니다. 이 "그림자" 를 사용 PRIVATE ALL LIKE m*
하고 PRIVATE i
방지 해야합니다.
내 과거에서 한 번 더 폭발.
회사 소유자의 인용문 :
Java로 작성된 해당 {expletive} 프로젝트에서 2 천 5 백만을 잃었 기 때문에 해석 언어를 사용하여 작성된 코드는 없습니다.
Java 프로젝트는 수십 개의 주식을 처리하도록 설계된 주식 거래 시스템으로, 현재 수천 개의 주식을 처리하는 데 사용되었습니다. 디자인 결함이나 하드웨어 불량 문제를 해결하는 대신 회사 전체는 모든 비 C / C ++ 응용 프로그램을 C / C ++로 변환해야했으며 모든 새로운 개발은 C / C ++로 이루어져야했습니다. 해석 적 언어는 컴파일되지 않은 것을 의미했으며 소유자는 어셈블러, C 및 C ++ 만 컴파일 된 것으로 간주했습니다.
대부분의 코드가 Java와 Perl로 된 800 명의 개인 회사의 경우, 회사 전체가 다음 몇 년 동안 C / C ++로 완벽하게 훌륭한 코드를 다시 작성하는 데 대부분의 시간을 보냈습니다.
충분히 재미, 일부 이십년이 실패하기 전에, 나는 기술 리드 대신 빠른 정렬로 대체되는 어셈블러로 코딩 할 필요가 우리의 정렬 논리가 (이 버블 정렬했다) 결정하는 다른 회사에 있었기 때문에 - 알고리즘이 할 성능을 향상시키지 않습니다. 성능을 향상시키는 유일한 방법은 동일한 논리를 어셈블러에서 다시 작성하는 것입니다.
두 경우 모두, 나는 지시가 내려진 직후 떠났다.
많은 프로그래머들처럼 (그러나 충분하지는 않지만) 코드 장식이 싫어요. 변수 이름에 달러 기호 ($) 접두사를 사용하거나 getter / setter가없는 경우에도 개인 변수에 밑줄을 사용해야 할 때 불쾌합니다. 그것을 이해하기 위해 코드를 장식해야한다면, 지옥을 꺼내야합니다!
정확히 1976 년 전인 1976 년입니다. 내 상사는 Edsger Dijkstra에 대해 들어 본 적이 없거나 CACM 문제를 읽지 못했지만 "GOTO가 나쁘다"는 소문을 들었으므로 COBOL 프로그램에서 GOTO를 사용할 수 없었습니다. 이것은 COBOL이 "end if"를 추가하기 이전이었을 때, 3 가지 고전적인 제어 구조 중 2 분의 2 만 가지고있었습니다 (시퀀스, if / then / else, 수행 (즉, 수행)). 그는 기본 프로그램에서 GOTO를 허용하고 어셈블러 언어 프로그램에서 분기 명령을 허용했습니다.
이것은 일종의 "당신은 거기에 있어야했다"라는 이야기입니다. 내가 아는 한, 1976 년 이후 발명 된 모든 언어에는 적절한 제어 구조가있어 GOTO를 사용할 필요가 없습니다. 그러나 요점은 왜 GOTO가 유해한 것으로 여겨지는지 또는 어떤 언어가 유아 장애이고 어떤 언어가 치명적인 질병인지 알지 못했습니다.
프로젝트에서 일하면서 수석 건축가가 명시 적 코드를 작성해야했습니다. 코드에서 찾은 최악의 예 중 하나는 다음과 같습니다.
private string DoSomething( bool verbose )
{
if ( verbose ) { return someString; }
else if ( !verbose ) { return otherString; }
else { return string.Empty; }
}
ReSharper 조차도 이것이 잘못되었다고 말했습니다!
else
) 분기를 수행할지 고려하십시오.
return verbose ? someString : someOtherString;
?
마지막 직장에서 "표준"은 저를 고용 한 사람이 준 것에 대한 매우 강력한 용어입니다. ColdFusion 및 SQL 에서 웹 사이트를 프로그래밍 할 때 다음과 같은 코딩 요구 사항이 주어졌습니다.
나는 그가 종료하자마자 이것들을 바꾸기 시작했습니다.
내 인생에서 C ++ 코더로서, 두 개의 "불쾌한"규칙이 시행되었습니다.
O(n^2)
DOS 공격 (최악의 경우 입력)을 열 때 잘못 될 수 있습니다 . 또한 전환이 불가능한 이유는 STL을 사용하지 않았다는 이유입니다.