시스템 헝가리어의 매력은 무엇입니까? [닫은]


18

에서 지침을 명명 당신은 무엇을 수행합니까? 저자는 말합니다 :

또한 Charles Simonyi의 헝가리 표기법을 사용하여 코딩하는 것을 선호합니다.

나는 여전히 Petzold / Systems Hungarian의 풍미 중 헝가리어를 선호하는 여러 프로그래머들에게 다가 갔다. 생각하십시오 dwLength = strlen(lpszName).

잘못된 코드 만들기를 잘못 읽었 으며 도메인 이름 정보가 변수 이름에 포함 된 Apps Hungarian의 이론적 근거를 이해합니다. 그러나 컴파일러 유형을 이름에 첨부 할 때의 가치를 이해하지 못합니다.

프로그래머가 여전히이 스타일 표기법을 계속 사용합니까? 관성인가? 가독성 감소를 능가하는 이점이 있습니까? 사람들은 코드를 읽을 때 데코레이터를 무시하는 법을 배웁니다. 그렇다면 코드를 계속 추가하는 방법은 무엇입니까?

편집 : 많은 답변이 역사를 설명하거나 더 이상 관련이없는 이유를 설명합니다.이 기사에서 모두 다루었습니다.

나는 아직도 그것을 사용하는 누군가의 의견을 듣고 싶습니다. 왜 사용합니까? 표준에 있습니까? 필요하지 않은 경우 사용 하시겠습니까? 새 프로젝트에서 사용 하시겠습니까? 장점은 무엇입니까?


5
내가 IT에서 시작했을 때 헝가리어 표기법이 모든 분노 였지만 완전히 코딩 환경이었습니다. 간단한 텍스트 편집기는 구문 강조, 지능 및 코드 파일이 없으므로 처음에 선언 된 모든 변수가있는 수백 줄 길이입니다. 그것은 당신이 다루고있는 것을 해결하는 데 인생을 더 쉽게 만들었습니다. 그러나 현대적인 도구 및 관행과의 필요성 내 옵션에 갔다 그것은 정말 역사에 위탁해야한다
GrumpyMonkey

1
나는 그 년 전에 그것을 사용했고 그것을 좋아하지 않았습니다. 나는 그것을 전혀 놓치지 않습니다.
MetalMikester

IMO는 접두사가 아닌 접미사를 사용하고 있었다의 가장 큰 문제 - 심지어 애플 리케이션에서의 '사마귀가'보통 이름의 나머지 부분보다 의미 정보가 들어 헝가리
JK합니다.

답변:


38

순간 나는 아직도 헝가리를 사용하여 정확히 세 가지 이유 , 신중하게 피하는 다른 모든 위해를 :

  1. 유지 관리를 수행 할 때 기존 코드베이스와 일치합니다.
  2. 제어용 (예 : "txtFirstName". 종종 "firstName"값과 "firstName"컨트롤을 구별해야합니다. 헝가리어가이를 수행하는 편리한 방법을 제공합니다. 물론 "firstNameTextBox"를 입력 할 수 있지만 "txtFirstName"은 이해하기 쉽고 문자 수가 적습니다. 또한 헝가리어를 사용한다는 것은 동일한 유형의 컨트롤을 찾기 쉽고 IDE에서 이름별로 그룹화하는 것을 의미합니다.
  3. 두 변수가 동일한 값을 가지고 있지만 유형별로 다른 경우 예를 들어, 사용자가 실제로 입력 한 값의 경우 "strValue"및 정수로 구문 분석 된 후 동일한 값의 경우 "intValue"입니다.

내 아이디어를 모범 사례로 설정하고 싶지는 않지만 헝가리 규칙을 가끔 사용하면 코드 유지 관리에 도움이되지만 비용은 거의 들지 않는다는 경험이 있기 때문에이 규칙을 따릅니다. 즉, 나는 내 자신의 연습을 끊임없이 검토하므로 내 아이디어가 발전함에 따라 다른 일을 할 수도 있습니다.


최신 정보:

방금 헝가리어가 잘못된 코드를 잘못 보이게 만드는 방법을 설명하는 Eric Lippert 의 통찰력있는 기사 를 읽었습니다 . 읽을 가치가 있습니다.


훌륭한 답변, 반딧불이 질문에 답변합니다.
AShelly

방금 내 아이폰의 독창적 인 편집을 보았습니다 ... gsub ( 'firefly', 'fully');
AShelly

5
IDE에서 UI 컨트롤을 쉽게 그룹화하기 위해 준 헝가리어를 사용하여 +1 이것은 새로운 프로젝트에 여전히 타당한 유일한 용도이며, 나는 그것 없이는 살 수 없었습니다. 컨트롤이 텍스트 상자라는 것을 알고 있지만 "이름"또는 "이름"인지는 알 수 없습니다.
코디 그레이

2
이 답변에 동의합니다. intValue와 strValue 사용에 관해서는 valueAsInt와 valueAsStr로도 볼 수 있으므로이 헝가리 표기법을 고려하는지 모르겠습니다 .int와 str이 변수 이름의 일부와 비슷합니다.
Michel Keijzers

2
2 접두사는 꽤 바보가 될 수 있기 때문에 전체 접미사를 선호합니다 ( tssb또는 무엇 tsddi입니까? 예, 존재합니다). 약어는 복용, 균일의 문제가 TextBox그것의 여부에 대한 불일치가있을 수 tb또는 txt(나는 개인적으로 하나의 창에 모두 '수석'dev에 사용을 보았다). 들어 3 변수가 최종 의도 유형에 도달 할 때 (예 : 내가 사용하는 것 헝가리를 삭제 value하고 strValue귀하의 예제에서).
Jonathan Dickinson

6

헝가리어 표기법을 사용하는 팬은 아니지만 다음과 같이 생각하십시오.

  • 검색 창에 "txt"를 입력하면 코드에서 TextBox를 참조하는 문자열을 찾는 것이 더 빠릅니다.

모든 요소가 자체 이름을 갖는 반대의 경우를 상상해보십시오. 가고 싶은 곳을 찾는 것이 느려질 수 있습니다.

DropDownList를 참조하고 싶을 때 ddl도 마찬가지입니다. :)

사람들은이 요소가 어디에 있는지 찾기 위해 많은 시간을 소비하지 않을 것입니다.

접두어 사용은 C #과 같은 최신 언어 컴파일러 에는 사용할 수 없지만 인간에게는 사용할 수 있습니다 (읽기 가능) .


이것이 제가 들었던 실질적인 가치의 가장 좋은 예입니다. (그러나 여전히 채택하기에는 충분하지 않습니다.)
AShelly

1
접두사는 컴파일러를위한 것이 아니라 항상 사람들을위한 것이 었습니다. 변경된 것은 컴파일러가 아니라 형식 정보와 코드를 탐색하는보다 효과적인 방법을 제공하는 IDE입니다.
Jeremy

변수와 (특히) 위젯을 사용하여 동일한 작업을 수행합니다. 종종 유형을 나타내는 짧은 접두사를 제공합니다. 그러나 그들에게 "완전히 헝가리 인"이되는 것은 아닙니다.
GrandmasterB

4

Apps Hungarian (타입 시스템을 통해 표현할 수없는 객체의 의미 적 속성을 나타내는 태그)은 1980 년대 초의 약한 유형의 언어를 사용할 때 일반적인 오류를 처리하는 합리적인 방법이었습니다. 오늘날의 강력한 형식의 언어에서는 거의 목적이 없습니다.

시스템 헝가리어 (객체의 선언 된 유형을 중복 표시하는 태그)는 코드베이스에 표면적으로 균일 한 모양을 적용하는 것을 제외하고는 어떤 목적으로도 사용되지 않았습니다. Apps Hungarian의 의도를 잘못 이해 한 숙련되지 않은 프로그래머와 숙련되지 않은 프로그래머가 생성하고 전파했으며 복잡한 코딩 지침으로 코드 품질을 향상시킬 수 있다고 생각했습니다.

두 스타일 모두 Microsoft에서 시작되었습니다. 요즘 Microsoft의 명명 규칙 은 "헝가리어 표기법을 사용하지 마십시오"라고 말합니다.


4

올바른 접두사 시스템을 생각해 내면 키의 마모가 확산되어 키보드 교체 비용이 줄어 듭니다.


나는 이것을 확장 할 수 있다고 생각합니다. 나는 직장에서 SH를 지난 10 년 동안 사용했습니다 (표준에 있기 때문에). 문제 해결에 도움이되지 않았습니다.

반면에, 나는 '홈 코드'에서 무의식적이지만 잘 알려진 변수를 거의 동일하게 사용했습니다. 나는 SH를 놓친 적이 없다.

두 곳 모두 고정 크기 기본 유형이 필요한 프로토콜 코드를 작성했습니다. 이것은 SH에 대해 생각할 수있는 가장 유용한 사용 사례입니다. SH로 쓸 때 알 수 없었으며 SH없이 쓸 때 방해가되지 않았습니다.

결론적으로, 내가 볼 수있는 유일한 차이점은 키보드의 마모입니다.


1
빈정 거림처럼 :)
JohnL

4

실제로 이번 달에 작성한 새 코드에서 SH를 사용하기 시작했습니다.

내 임무는 JS에서 일부 Perl 코드를 다시 작성하여 웹 응용 프로그램의 클라이언트쪽으로 이동할 수 있도록하는 것입니다. Perl에서 SH는 일반적으로시길 ($ string, @array, % hash) 때문에 필요하지 않습니다.

JavaScript에서는 SH가 데이터 구조 유형을 추적하는 데 매우 중요하다는 것을 알았습니다. 예를 들어

var oRowData = aoTableData[iRow];

정수 인덱스를 사용하여 객체 배열에서 객체를 검색합니다. 이 규칙을 준수하면 데이터 형식을 찾는 데 상당한 시간이 절약되었습니다. 또한 간결한 변수 이름 ( oRowvs iRow)을 오버로드 할 수 있습니다 .

tl; dr : SH는 약한 유형의 언어로 복잡한 코드를 가지고있을 때 좋습니다. 그러나 IDE가 유형을 추적 할 수 있다면 선호하십시오.


2

또한 이론적 근거가 궁금합니다. 우리는 그들이 왜 과거에 그것을 사용했는지 알고 있습니다. 유형 정보에 대한 IDE 지원 부족. 그러나 지금? 간단히 말해 전통이라고 생각합니다. C ++ 코드는 항상 다음 과 같았습니다. 왜 변경해야합니까? 또한 헝가리어 표기법을 사용하는 이전 코드를 기반으로 할 때 갑자기 사용을 중지하면 꽤 이상하게 보일 것입니다 ...


2
C ++ 코드는 항상 이런 식으로 보이지는 않았습니다. Bjarne Stroustrup 책을 확인하십시오.
JBR 윌킨슨

@JBRWilkinson : Charles Simonyi는 1976 년경 헝가리 표기법 ( c2.com/cgi/wiki?HungarianNotation )을 만들었습니다 . 따라서이 표기법은 실제로 C ++보다 우선합니다. 대부분의 C ++ 프로그래머가 아닌 많은 사람들은 1 일 이후 (코딩의), 그것을 사용했습니다. 나는 Bjarne Stroustrup이 주목할만한 예외라는 것을 알고 있습니다. Linus Torvalds도 마찬가지이지만 사실을 바꾸지는 않습니다.
Paweł Dyda

2
헝가리어는 항상 기본적으로 Microsoft였습니다. 유닉스와 유닉스와 같은 환경에서 많이 사용되는 것을 보지 못했습니다.
David Thornley

2

시스템 헝가리어 표기법은 실제로 '유형'이라는 용어에 대한 오해와 약간의 차이가있었습니다. 시스템 개발자는 문자 그대로 앱 도메인 유형 (행 색인, 열 색인 등)이 아닌 컴파일러 유형 (워드, 바이트, 문자열 등)으로 사용했습니다.

그러나 모든 개발자는 함정에 빠지기 전에 (유형 변경, 새롭고 의미있는 접두사 생성, 기타). 따라서 관행이 있다고 생각합니다. 더 나아지지 않은 개발자와 선택이 왜 좋지 않은지를 깨닫는 개발자, 연습을 요구하는 코딩 표준을 고수하는 개발자 및을 사용하는 사람들의 관성이 <windows.h>있습니다. Microsoft가 접두사 표기법을 제거하기 위해 변경하는 데 너무 많은 비용이 듭니다 (WPARAM?).


1
의도 한 사용조차도 컴파일러가 알지 못하는 개인 유형 시스템을 생성하므로 유형을 확인할 수 없으므로 최적보다 적습니다.
래리 콜먼 18

@Larry : 사실이지만, 소스 코드를 구문 분석하고 코드가 표준을 준수하는지 확인할 수있는 소프트웨어가 있습니다. 접두사가 표현식에서 일치하는지 확인할 수 있습니다.
Skizz

1
정적 타이핑을 사용할 때 가장 이상적인 것은 컴파일러 유형 세트가 도메인 유형 세트의 상위 세트가되는 것입니다. 그러면 컴파일러가 추가 기능없이 모든 것을 확인할 수 있습니다.
래리 콜맨

0

헝가리 사람들이 빠뜨린 한 가지가 있습니다. 헝가리 표기법은 실제로 자동 완성 기능으로 훌륭하게 작동합니다.

변수가 있고 이름이 intHeightOfMonster라고 가정하십시오.

변수의 이름을 잊었다 고 가정 해보십시오.

heightOfMonster 또는 MonsterHeight 또는 MeasurementMonsterHeight 일 수 있습니다.

문자를 입력하고 변수 이름을 자동 완성 제안을 받으려고합니다.

heightOfMonster가 정수라는 것을 알고 있으면 i와 voila 만 입력하면됩니다.

시간을 절약.

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