문제

이 질문은 헝가리 표기법의 좋은 예를 찾는 것이므로, 우리는 이것들을 모을 수 있습니다.

편집하다: 나는 유형에 대한 헝가리 인이 필요하지 않다는 데 동의합니다. Joel이 그의 기사에서 제공하는 것처럼 (내 대답에 따라) 그의 기사와 같이 가독성과 유지 가능성을 증가시키는보다 구체적인 예를 기대하고 있습니다.

도움이 되었습니까?

해결책 2

다른 헝가리어 게시물에서 언급 된 바와 같이 지금 클래식 한 기사는 Joel의 사이트입니다.

http://www.joelonsoftware.com/articles/wrong.html

다른 팁

헝가리 표기법의 좋은 사례를 요구하는 문제는 모든 사람이 좋은 예가 어떻게 보이는지에 대한 자신의 아이디어를 가질 것이라는 것입니다. 내 개인적인 의견은 최고입니다 헝가리 표기법 ~이다 헝가리 표기법이 없습니다. 표기법은 원래를 표시하기위한 것입니다 의도 된 사용법 유형이 아닌 변수의 변수이지만 일반적으로 유형 정보, 특히 양식 컨트롤 (예 : G, txtfirstname 누군가의 이름을위한 텍스트 상자의 경우). 이로 인해 액상 (예 : "Nounterms Prepin Nounters Prepe Prepin Prepin Prepin Prepin Prepin Prepin Prepin Prepin Prepin Prepin Prepin Prepin Prepin Prepin Prepin 님)과 유형을 변경 해야하는 경우 (유형이 변경된 Win32 API에"LPARAMS가 있음) 코드가 덜 유지 가능합니다.

당신은 아마 그것을 전혀 사용하지 않는 것을 고려해야합니다. 예 :

  • strfirstname - 이건 그냥 될 수 있습니다 이름 그것이 무엇인지 분명하기 때문에 유형은 그다지 중요하지 않으며이 경우 분명해야합니다. 분명하지 않다면, IDE가 당신을 도울 수 있습니다.
  • txtfirstname - 이것은 변경 될 수 있습니다 FirstNametextbox 또는 FirstName_TextBox. 그것은 더 잘 읽히고 당신은 그것이 텍스트뿐만 아니라 제어라는 것을 알고 있습니다.
  • Caccount - MFC의 클래스 이름에 사용되었지만 실제로는 필요하지 않습니다. 계정 충분합니다. 대문자 이름은 유형에 대한 표준 규칙입니다 (특정 장소에만 나타나서 속성이나 방법과 혼동되지 않습니다).
  • ixarray (색인으로 정렬) - ix 약간 모호합니다. 노력하다 ArrayIndex.
  • USSTATE (안전하지 않은 문자열 상태) - "미국 상태"처럼 보입니다. 더 나은가요 상태_불완전한 또는 뭔가. 어쩌면 그것을 감싸고있을 수도 있습니다 불완전한 클래스는 적어도 유형-안전을 만들 수 있습니다.

(포인터의 경우). 내가 사용하는 유일한 접두사입니다. 나는 그것이 변수 (예 : 포인터)에 많은 것을 추가한다고 생각하며 조금 더 정중하게 취급해야합니다.

데이터 유형의 헝가리 인은 다소 passe입니다. 그러나 데이터가 좋지 않은 것처럼 포인터를 취급하므로 코딩 할 때 가정하지 말아야 할 가정을 만들더라도 사용자에게 무엇이 있는지 확인하고 싶습니다.

오염 된 데이터. 신뢰할 수없는 소스에서 들어오는 모든 데이터를 접두사하여 해당 변수를 오염 된 것으로 만듭니다. 실제 작업이 수행되기 전에 모든 오염 된 데이터를 정리해야합니다.

컴파일러가 이미 당신을 위해 그것을 수행하기 때문에 헝가리어를 사용하는 것은 무의미합니다.

헝가리 인이 유용한 곳은 동일한 원시 유형을 가진 논리적으로 다른 종류의 변수를 구별하는 것입니다. 예를 들어, ints를 사용하여 좌표를 나타내는 경우 x와 함께 x 좌표, y와의 좌표 및 d와의 거리를 접두사 할 수 있습니다. 그래서 당신은 모양의 코드가있을 것입니다

dxHighlight = xStart - xEnd

yHighlight = yLocation + 3

yEnd = yStart + dyHeight

dyCode = dyField * 2

등등. 한 눈에 오류를 발견 할 수 있기 때문에 유용합니다. DY를 AY에 추가하면 항상 Y를 얻습니다. 두 개의 X를 빼면 항상 DX를 얻습니다. DY에 스칼라를 곱하면 항상 DY를 얻습니다. 등등. 당신이 같은 줄을 보면

yTop = dyText + xButton

DY와 AX를 추가하는 것은 의미가 없기 때문에 잘못되었음을 한 눈에 알고 있습니다. 알 수있는 한, int를 int에 추가하기 때문에 컴파일러는 이것을 잡을 수 없었습니다.

언어 별 접두사를 사용하지 마십시오.

우리는 사용:

n: Number 
p: Percentage 1=100% (for interest rates etc)
c: Currency
s: String
d: date
e: enumeration
o: object (Customer oCustomer=new Customer();)
...

우리는 모든 언어에 동일한 시스템을 사용합니다.

SQL
C
C#
Javascript
VB6
VB.net
...

생명의 절약입니다.

악마의 옹호자 : 헝가리 표기법의 가장 좋은 예는 그것을 사용하지 않는 것입니다. :디

우리는 헝가리어 표기법을 현대 IDE와 함께 사용하는 데 어떤 유리도 얻지 못합니다. 이름도 변경해야하므로 변수의 유형을 리팩토링 할 때 작업이 추가됩니다 (대부분의 경우 변수를 처리 할 때 대부분의 유형이 어쨌든 어떤 유형인지 알 수 있습니다).

표기법으로 문제를 주문할 수도 있습니다. 포인터에 p를 사용하고 주소에 대한 A를 사용하는 경우 변수 apstreet 또는 pastreet에 호출합니까? 일관성이 없을 때 가독성이 감소하고 표기법을 작성 해야하는 순서를 기억해야 할 때 귀중한 마인드 스페이스를 사용해야합니다.

헝가리어 표기법은 때때로 동적 언어에서 유용 할 수 있습니다. 특히 Server Side ActionScript (본질적으로 JavaScript)를 생각하고 있지만 다른 곳에 적용될 수 있습니다. 실제 유형 정보가 전혀 없기 때문에 헝가리 표기법은 때때로 일을 좀 더 쉽게 이해할 수 있도록 도와 줄 수 있습니다.

더 이상 유용한 유일한 헝가리 인은 멤버 변수의 경우 M_입니다. (정적 멤버에게는 SM_을 사용합니다. 여전히 존재하는 "다른"범위이기 때문에 80 억 개의 특성 길이의 가변 이름을 사용하는 와이드 스크린 모니터 및 컴파일러가있는 유형 이름은 그만한 가치가 없습니다.

헝가리 표기법 (내가 배운대로 낙타 케이싱)은 소프트웨어 프로젝트를 상속받을 때 매우 중요합니다.

그렇습니다. IDE와 함께 변수를 '호버'하고 어떤 클래스인지 알아낼 수 있지만, 수천 줄의 코드를 따라 페이징하는 경우 몇 초 동안 멈추지 않아도됩니다. .. 싱글 .... 시간 ....

기억하십시오 - 당신은 당신이나 당신의 팀을위한 코드를 작성하지 않습니다. 당신은 또한이 코드를 2-5 년 동안 도로에서 픽업 해야하는 사람을 위해 그것을 작성하고 그것을 향상시킵니다.

나는 그것에 대해 실제로 읽고 원래 의도라는 것을 이해하려고 노력할 때까지 헝가리 표기법에 반대했습니다.
Joels Post "Orly"와 "헝가리 표기법을 재발견"하는 기사를 읽은 후 나는 정말로 내 마음을 바꿨습니다. 올바른 완료 나는 그것이 극도로 강력하다고 생각합니다.

Joel Spolsky의 잘못
http://www.joelonsoftware.com/articles/wrong.html

헝가리 표기법 재발견
http://codingthriller.blogspot.com/2007/11/rediscing-hungarian-notation.html

나는 대부분의 naysayers가 그것을 실제로 시도한 적이 없으며 그것을 진정으로 이해하지 못한다고 믿습니다. 실제 프로젝트에서 시도해보고 싶습니다.

위의 링크 된 Joel의 기사와 일반적으로 헝가리 표기법에서 벗어나야 할 핵심은 변수에 대해 불쾌한 것이있을 때 사용하는 것입니다.

이 기사에서,이 기사에서 인코딩 된 인코딩 된 문자열은, 안전하지 않은 줄에 헝가리어 'US'를 사용하고 안전한 현에 ''를 사용해야한다는 것이 아닙니다. 약간 문자열이 안전한지 여부를 나타내는 식별자. 표준이되면 표준이 깨질 때 쉽게 알 수있게됩니다.

ORM (예 : 최대 절전 모드)을 사용할 때 관리 및 관리되지 않은 물체를 처리하는 경향이 있습니다. 관리되는 객체를 변경하는 것은 명시 적 저장을 호출하지 않고 데이터베이스에 반영되며, 관리되는 객체를 처리하려면 명시 적 저장 호출이 필요합니다. 객체를 다루는 방법은 객체가 무엇인지에 따라 다릅니다.

유일한 유용한 점은 인터페이스 컨트롤, txtusername, txtpassword, ddlbirthmonth를 선언 할 때입니다. 완벽하지는 않지만 큰 형태/프로젝트에 도움이됩니다.

변수 나 다른 항목에 사용하지 않고 제어 만 사용합니다.

포인터에 'P'를 사용하는 것 외에도 버퍼 크기 매개 변수 (또는 변수)가 바이트 카운트인지 또는 문자 카운트인지를 나타 내기 위해 'CB'및 'CCH'를 사용한다는 아이디어가 마음에 듭니다. 드물게 - 'CE'는 요소의 수를 나타내는 데 사용됩니다). 따라서 전달 유형 대신 접두사가 사용 또는 의도를 전달합니다.

나는 아마도 접두사를 일관되게 사용하는만큼 일관되게 사용하지는 않지만 아이디어가 마음에 듭니다.

헝가리 표기법이 더 이상 유용하지 않다는 데 동의합니다. 원래 의도는 데이터 유형이 아니라 엔티티 유형을 나타내는 것이라고 생각했습니다. 예를 들어 고객, 직원 및 사용자의 이름과 관련된 코드 섹션에서는 로컬 문자열 변수 CusName, EmpName 및 UsrName의 이름을 지정할 수 있습니다. 그것은 비슷한 소리가 나는 변수 이름을 구별하는 데 도움이 될 것입니다. 엔티티에 대한 동일한 접두사가 응용 프로그램 전체에서 사용됩니다. 그러나 OO를 사용하고 객체를 다루는 경우 고객 .name, Employee.Name 및 User.Name에서 이러한 접두사는 중복됩니다.

변수의 이름은 그것이 무엇인지 설명해야합니다. 좋은 변수 이름 지정은 헝가리 표기법을 쓸모 없게 만듭니다.

그러나 때로는 좋은 변수 명명 외에 헝가리 표기법을 사용합니다. m_numobjects에는 "M_와 NUM의 두 가지"접두사가 있습니다. 중_ 범위를 나타냅니다. 이것. 숫자 값을 나타냅니다 ~이다.

"헝가리어"가 포함되어 있어도 "좋은"코드를 읽을 때 전혀 방해받지 않습니다. 오른쪽 : 코드를 읽습니다. 클릭하지 않습니다. (실제로 코딩 할 때 마우스 나 부두 프로그래밍 별 조회 기능을 거의 사용하지 않습니다.)

m_ubscale과 같은 것을 읽을 때 느려집니다 (네, 당신을보고 있습니다, Liran!), 내가 그 사용량을보아야 할 때 (주석 없음!)는 그것이 무엇을 확장하는지 (전혀?) 데이터 유형 (고정 포인트 Char)입니다. 더 나은 이름은 m_scalefactor 또는 m_zoomfactor이며, 고정 포인트 번호 또는 typedef로 주석이 있습니다. (실제로, 동일한 고정 지점 형식을 사용하는 여러 클래스의 다른 멤버가 있으므로 타이핑은 유용 할 것입니다. 그러나 일부는 그렇지 않지만 여전히 m_ubwhwhate! 혼란스럽고 말하기는 여전히 표시됩니다.)

헝가리 인은 정보를 대체하는 것이 아니라 변수 이름에 첨가물이되어야한다고 생각합니다. 또한 헝가리 표기법은 여러 번 변수의 가독성, 바이트 낭비 및 읽기 시간에 전혀 추가되지 않습니다.

내 2 ¢.

아주 오래된 질문이지만 여기에 정기적으로 사용하는 몇 가지 "헝가리어"접두사가 있습니다.

나의

로컬 변수의 경우, 글로벌 컨텍스트에서 이름이 의미가있는 위치를 구별합니다. MyFoo가 보이면 다른 곳에서 FOOS로 수행하는 다른 일에 관계 없이이 기능에만 사용됩니다.

myStart = GetTime();
doComplicatedOperations();
print (GetTime() - myStart);

그리고

TMP

루프 또는 다단계 작업의 임시 값 사본 용. 두 개의 TMPFOO 변수가 서로 몇 줄 이상을 보면 거의 확실하지 않습니다.

tmpX = X; 
tmpY = Y;
X = someCalc(tmpX, tmpY);
Y = otherCalc(tmpX, tmpY);

그리고 어떨 때에는 낡은 그리고 새로운 비슷한 이유로 TMP, 일반적으로 더 긴 루프 또는 기능으로.

나는 포인터에만 P를 사용하는 것입니다. 그리고 그것은 내가 C ++에있는 경우에만입니다. C#에서는 헝가리 표기법을 사용하지 않습니다. 예를 들어

MyClass myClass;
MyClass* pMyClass;

그게 다야 :)

편집하다: 오, 방금 거짓말이라는 것을 깨달았습니다. 멤버 변수에도 "M_"도 사용합니다. 예를 들어

class
{
private:
bool m_myVar;
}

글쎄, 나는 창 제어 변수와 함께 만 사용합니다. 나는 btn_, txt_, lbl_ 등을 사용하여 그들을 발견합니다. 또한 유형 (BTN_ 등)을 입력하여 컨트롤 이름을 찾는 것이 도움이된다고 생각합니다.

헝가리 표기법의 좋은 예와 같은 것은 없습니다. 사용하지 마십시오. 약하게 입력 한 언어를 사용하는 경우에도 아닙니다. 당신은 더 행복 할 것입니다.

그러나 사용하지 않을 이유가 필요한 경우, 이것은 내가 가장 좋아하는 것입니다. 이 위대한 링크:

헝가리 표기법의 한 번의 트릭은 "변수의 유형을 변경하지만 변수 이름을 변경하지 않은 상태로 두십시오"입니다. Win16 : -WndProc (Hwnd HW, Word Wmsg, Word Wparam, Long Lparam)에서 Win32 WndProc (HWND HW, UINT WMSG, WPARAM WPARAM, LPARAM LPARAM)에서 WNDPROC (Hwnd HW, Word Wpparam, Long Lparam)에서 WACK 앱에서 거의 항상 수행됩니다. 그들은 말이지만 실제로는 오랜을 말합니다. 이 접근법의 실제 가치는 매개 변수의 너비가 64 비트가 될 때 Win64 마이그레이션으로 명확하지만, 오래된 "W"및 "L"접두사는 영원히 유지됩니다.

나는 'w'를 'temp'또는 'tmp'대신 접두사로 사용하는 'w'를 사용하여 다음과 같이 기수 데이터에 대한 로컬 변수를 사용합니다.

Public Function ArrayFromDJRange(rangename As Range, slots As Integer) As Variant

' this function copies a Disjoint Range of specified size into a Variant Array 7/8/09 ljr

Dim j As Integer
Dim wArray As Variant
Dim rCell As Range

wArray = rangename.Value ' to initialize the working Array
ReDim wArray(0, slots - 1) ' set to size of range
j = 0

For Each rCell In rangename
    wArray(0, j) = rCell.Value
    j = j + 1
Next rCell

ArrayFromDJRange = wArray

End Function
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top