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


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.