시스템 헝가리어 표기법이 여전히 유용한 방법입니까? [닫은] 현재 형태로 합리적으로 대답 할

포럼을 검색했지만 피해야하는 이유와 은색 총알이 아닌 이유 만 찾을 수 없었습니다. 그래서 나는이 질문이 중복이라고 생각하지 않습니다.

거기 VALID 로 사용 해요 내가 시스템 헝가리어 I을 잊다해야하는 이유 이유는?

지금까지 사용하면 다음과 같은 이점이 있습니다.

  • 일관된 변수 이름
  • 검색하지 않고 유형을 볼 수 있습니다 (지능형이 죽었거나 색인을 생성하는 절반 시간이므로 여전히 유효한 이유입니다)
  • 시맨틱은 여전히 ​​이름의 두 번째 부분으로 압축 될 수 있습니다

그리고 다음과 같은 단점이 있습니다.

  • 그것은 어떤 사람들을 귀찮게합니다 (왜 그런지 모릅니다)
  • 유형이 변경되면 유형이 변수의 이름과 일치하지 않을 수 있습니다 (유효한 이유는 아니며 유형이 거의 변경되지 않으며 “모두 이름 바꾸기”가 있음)

왜:

vector<string> vecCityNames;
wstring strCity = L"abc";
//more code here
vecCityNames.push_back(strCity);

보다 더 나쁜 :

vector<string> cityNames;
wstring city = L"abc";
//more code here
cityNames.push_back(city);//Are we pushing back int on a queue? Float on a stack? Something else?



답변

나는 (몇 년 전) 그것을 사용했지만 더 이상 사용하지 않습니다. 주된 이유는 대부분의 경력을 쌓아온 강력한 타이핑 (C ++, Java)으로 OO 언어에 불필요하기 때문입니다. 이 언어들에서, 타입을 잘 정의하면, 컴파일러는 타입 안전성을 강제 할 수 있고 강제 할 것입니다. 따라서 모든 이름 접두사는 이름이 길어 지므로 이름을 더 길고 읽기가 어렵습니다.

잘 작성된 OO 프로그램에서 대부분의 변수는 사용자 정의 유형입니다 (참조). 접두사에 동일한 일반 태그 (예 o: “object”등)를 붙이면 아무런 이점도없고 단점 만 있습니다. 그러나 유형 별 태그로 접두사를 붙이면 종종 비슷한 이름을 가진 수천 가지 유형에 대해 다른 약어를 찾으려고 노력합니다. 잘 관리 된 프로그램에서는 전혀 드물지 않습니다).

물론 이것은 비 OO 언어에는 적용되지 않으며 약하거나 동적으로 유형이 지정된 언어에는 적용되지 않을 수 있습니다 (C와는 별도로 경험이 없습니다). 사용 가능한 IntelliSense (또는 그에 상응하는 로컬)가없는 차선책 편집기 / IDE는 아닙니다. 그리고 이것은 단지 2 센트입니다. 따라서 헝가리어 표기법이 팀과 프로젝트에 효과적이라면 그대로 사용하십시오. 중요한 것은 프로젝트가 시작 되기 전에 ( 일관된 코딩 스타일뿐만 아니라) 이것에 동의 하고 항상 일관성을 유지하는 것입니다.

* 우리의 현재 프로젝트에서 짧은 목록 : 우리가 Charge, ChargeBreakdown, ChargeCalculator, ChargeDAO, ChargeDTO, ChargeLineHelper, ChargeMaps, ChargePairChargeType, 다른 사람의 사이에서. 게다가 우리는 또한 Contracts, Countries, Checkouts, Checkins …를 가지고 있으며 이것은 OP에 의해 “합리적인 크기”라고 부르지 않는 프로젝트에서 단지 문자 C입니다.


면책 조항 : 저는 실제로 헝가리 인이므로 권한을 가지고이 문제에 대해 말할 수 있다고 생각합니다. 😉


답변

std::vector<string> vecCityNames;나쁜가요?

프로파일 링에서 도시 이름이 오히려로 유지되어야한다고 표시하면 std::deque해당 유형의 오브젝트를 참조하는 모든 변수 이름이 갑자기 오해의 소지가 있다는 헝가리 표기법의 문제점은 일반적으로 사용됩니다 .

그런 다음 모든 변수의 이름을 바꾸시겠습니까? 큰 프로젝트에서 그렇게 해 본 적이 있습니까? 머피의 도움으로 (그리고 그 사람은 거기에 엄청나게 도움이됩니다.) 어딘가에서 누군가와 같은 변수를 사용했을 것입니다. deqCityNames변경 사항으로 인해 빌드가 깨져서 30 년 동안 코드를 사용하여 수십 년 동안 앉아있는 사람은 아무도 없었습니다. 유독 한 짐승에게 물린 것에 대한 두려움 때문에.

그러나 내가 아는 것에서 Charles Simonyi가 헝가리어를 생각해 낸 방식에서 접두어는 구문 유형이 아닌 변수 의미 론적 사용법을 나타냅니다 . 즉, 도시 이름 목록의 올바른 접두어는 도시 유형에 관계없이 (또는 , 암호가 충분하지 않은 경우 )있을 수 있습니다.listCityNameslstCityNameslist

그러나 복수 ( “이름”)이 이미 도시의 무리라는 것을 전달하기 때문에이 접두어는 매우 불필요한 것으로 생각합니다. 결론 :주의해서 식별자를 선택할 때 헝가리어 표기법은 거의 필요하지 않습니다. OTOH, 일반적으로 사용되는 방식은 장기적으로 실제로 코드를 손상시키는 것입니다.


답변

어떤 이유로 든, 여기에있는 기존의 대답은 헝가리 표기법에 대한 근거를 똑바로 밝히지 않고 춤추는 것처럼 보입니다. 헝가리어 표기법은 언어 자체에서 수행하기 어려운 유형 정보 ( 유형 이론적 의미로 ) 를 추가하는 데 유용 합니다 . 일반적으로 헝가리어 표기법 (일반적으로 설명 된대로)이 완전히 불필요한 방식으로 C ++ 또는 Java 유형 시스템을 사용하는 것은 어렵지 않습니다. 이는 아마도 반발을 일으킨 것입니다. 모든 주석에서 이러한 주석을 유지하지만 추가 값이 거의 없거나 전혀 없습니다 (코드가 더 복잡 해져서 해를 입힐 수도 있습니다).

반면에 헝가리어 표기법의 사용을 제한하여 정보를 입력하는 경우 유형 (이론적으로 이론적 인 유형으로 )으로 제한하는 경우 아닌언어에 의해 자연스럽게 캡슐화되면 매우 유용 할 수 있습니다. 예를 들어, C와 C ++는 배열 참조를 포인터 유형으로 전달하지만 배열 참조와 포인터는 서로 다른 연산을 수행해야합니다. 배열은 첫 번째 요소를 넘어서 색인 될 수 있지만 포인터는 그렇지 않아야합니다. 이것은 배열이 인수로 함수에 전달되는 즉시 유형 시스템에 손실되는 유용한 정보입니다. 따라서 우리 그룹에서는 C 및 C ++ 코드에서 변수 이름 주석을 채택하여 포인터 변수가 실제로 단일 요소에 대한 포인터인지 또는 배열에 대한 포인터인지를 구분했습니다. 이 규칙을 채택하면 코드 기반에서 메모리 손상 문제 발생이 크게 줄어 들었습니다.


답변

그것은 어떤 사람들을 귀찮게합니다 (왜 그런지 모릅니다)

그것이 짜증나는 이유는 코드의 시각적 스캔 속도를 늦추는 모든 단일 식별자에 약간의 속도 충돌이 있기 때문입니다. 그것은 mAs입니다.


답변

증오 가 너무 강해 IMO 원하는 방식으로 코드를 작성할 수 있습니다. 나는 단순히 내 코드에서 헝가리어 표기법을 사용하지 않는 것을 선호하며, 다른 사람들의 코드에서 읽거나 작업하지 않아도되는 선택을 선호합니다.

당신은 왜 어떤 사람들이 헝가리어 표기법을 성가 시게하는지 물었습니다. 나는 다른 사람들을 위해 말할 수 없지만 그것이 나를 괴롭힌 이유는 다음과 같습니다.

  1. 못 생겼어 헝가리어는 완벽하게 합리적인 이름을 취하고 코드에 해당하는 것을 앞에 붙입니다. 이 코드를 내면화하면 완벽하게 이해할 수 있지만 처음에는 누군가 내 소스 코드에서 C ++ 이름 mangler를 풀어 놓은 것처럼 보입니다.

  2. 중복입니다. 변수 선언은 유형을 설정합니다. 변수 이름으로 해당 정보를 반복 할 필요가 없다고 생각합니다. 이는 모든 언어에 해당되는 것은 아닙니다. 예를 들어, Perl 에서 변수 이름 앞에 @ 또는 $ 와 같은 sigils 는 기본적으로 변수 유형을 정의하므로 사용할 수밖에 없습니다.

  3. 내가 가지고 있지 않은 문제를 해결합니다. 메서드와 함수는 너무 길어서 로컬 변수 또는 매개 변수의 선언을 찾기가 어려워 야하며 너무 많은 변수를 포함해서는 안되며 무엇이 무엇인지 추적하는 데 어려움이 있습니다. 지역 변수를 사용하는 코드에 가까운 지역 변수를 선언하면이 점에서도 도움이됩니다. 과거의 C 컴파일러는 함수의 시작 부분에 모든 지역 변수를 선언해야하지만 그 한계는 오래 전에 제거되었습니다.

  4. 불완전합니다. 헝가리어 표기법은 유형 시스템이없는 언어 (BCPL)를 위해 발명되었으며 나중에 상당히 제한된 수의 기본 유형을 가진 언어 (C)에서 널리 사용되었습니다. IMO는 광범위한 유형 시스템을 가진 C ++ 또는 Java와 같은 언어에서는 제대로 작동하지 않습니다. char []와 같은 기본 유형이지만 클래스는 아닌 변수의 유형을 나타 내기 위해 접두사를 사용하고 싶은 이유는 무엇입니까? 또는 vec클래스 와 같은 접두사를 발명하기 시작하면 클래스 계층 구조와 평행 한 접두사 계층 구조로 끝납니다. 그것이 당신에게 호소한다면, 당신은 그것을 환영합니다. 그것에 대해 생각하면 두통이 생깁니다.

  5. 적어도 내가 이해하는 것처럼 모호 합니다. 차이 무엇 szFoopszFoo? 첫 번째는 0으로 끝나는 문자열이고 두 번째는 0으로 끝나는 문자열에 대한 포인터입니다. 그러나 C 또는 C ++에서 내가 아는 한 문자열 변수는 실제로 포인터이므로 동일합니까? 어느 것을 사용해야합니까? 실제 답변은 실제로 중요하지 않습니다. 요점은 이러한 종류의 질문을 피하는 데 도움이되는 표기법을 사용하여 답변을 식별 할 수 없다는 것입니다. 반면 변수의 선언은 컴파일러가 사용하는 것이므로 분명해야합니다.

이것들은 헝가리 표기법에 대해 나를 괴롭히는 것들입니다 . 그럼에도 불구하고 나는 비록 헝가리 인들이 왜 크게 포기되었는지를 충분히 설명하지는 않는다고 생각합니다. 대부분의 프로그래머가 헝가리어를 사용하지 않는 세 가지 가장 큰 이유는 다음과 같습니다.

  1. 그것을 사용해야 할 강력한 이유가 없습니다. 위의 항목 3과 4를 참조하십시오. 헝가리어가 헝가리어를 사용하지 않는 것보다 큰 이점을 제공한다면 성가심으로 살 수는 있지만, 보지 못하고 다른 대부분의 사람들도 그렇지 않습니다. 아마도 헝가리어에 대한 가장 좋은 점은 널리 사용되는 규칙 이었기 때문에 표준 사용을 고수하면 비슷한 기술을 가진 다른 프로그래머가 표기법을 이해할 수 있다고 합리적으로 기대할 수 있습니다.

  2. Microsoft가 아닌 회사의 영향력 증가. 헝가리 표기법을 채택한 대부분의 프로그래머가 그렇게했다고 말하는 것이 타당 할 것입니다. 이것이 마이크로 소프트가 코드를 작성하는 방식이기 때문에 종종 흐름에 따라 가기가 더 쉽기 때문입니다. 구글이나 애플과 같은 회사는 과거보다 훨씬 더 큰 영향력을 행사하고 있으며, 그 어느 때보 다 많은 프로그래머가 헝가리와 거의 같은 회사와 다른 회사의 스타일을 채택하고 있습니다. (여전히 구글과 애플 모두 상수 이름에 ‘k’접두사를 사용하는 것과 같은 일부 잔존물이 여전히 표시되어 있음을 알면 공평합니다.)

  3. 마이크로 소프트 자체는 헝가리를 포기했다. 코딩 지침에서 Microsoft의 일반 명명 규칙 섹션 을 확인 하면 헝가리 표기법을 사용하지 마십시오.

따라서 헝가리어 표기법 사용을 중지해야하는 한 가지 유효한 이유는 다음과 같습니다.

헝가리 표기법의 인기는 컨벤션이 더 이상 도움이되지 않을 정도로 줄어 들었습니다. 요즘 헝가리어를 사용하거나 이해하는 프로그래머가 훨씬 적기 때문에 컨벤션은 정보를 전달하는 데 훨씬 덜 효과적입니다. 자신의 개인 프로젝트에서 코드를 작성하는 유용한 방법을 찾으면 그만 둘 이유가 없습니다. 그러나 헝가리어를 사용하지 않는 팀의 일원으로 코드를 작성하는 경우 성공적인 의사 소통 전략이 아니라 사용자와 다른 팀 사이의 벽이 될 수 있습니다.


답변

지금까지 사용하면 다음과 같은 이점이 있습니다.

  • 일관된 변수 이름

The Simpsons의 문자 뒤에 모든 변수의 이름을 지정하면 일관성이 있지만 이점이 있습니까?

  • 검색하지 않고 유형을 볼 수 있습니다 (지능형이 죽었거나 색인을 생성하는 절반 시간이므로 여전히 유효한 이유입니다)

이것이 특정 도구의 약점을 기반으로 한 유일한 이유입니다 …

  • 시맨틱은 여전히 ​​이름의 두 번째 부분으로 압축 될 수 있습니다

그것은 이점이 아닙니다. 당신은 단지 ( 거대한 ) 단점 이 없다고 주장하고 있습니다.


답변

IDE는 변수 위에 마우스를 놓으면 변수 유형이 무엇인지 간단하게 알려줍니다. 그렇다면 왜 그 정보를 복제해야합니까? 기본적으로 Systems Hungarian Notation은 DRY를 위반하며 이와 관련된 모든 함정이 있습니다. 현대 환경에서 해당 정보에 쉽게 액세스 할 수 있으면 그 가격을 지불 할 이유가 없습니다.

일관성은 그 자체로는 이점이 아닙니다. 유형으로 이름을 지정하지 않으면 일관성 이 있습니다 . 일부 변수에만 이름에 유형이있는 경우에만 불일치가 발생합니다. 그리고 의미를 두 번째 부분으로 포장하는 것은 단순히 “글쎄, 그렇게 나쁘지는 않습니다.”, 다른 모든 사람들은 의미 의 전체 이름 을 사용해야합니다 . 실제 장점은 없습니다.