webForumDet fria alternativet

Ungersk notation, underscore (_) i namn m.m.

9 svar · 637 visningar · startad av Pace

PaceMedlem sedan juni 20019 024 inlägg
#1

Jag läser orden "Do not use hungarian notation" i .NET SDK dokumentationen över namngivningstips av klasser, metoder etc - men varför? Jag har lärt in mig detta sedan jag började med VBScript i ASP och har lite svårighet att sluta.

Samtidigt undrar jag varför man använder _ i början av variabelnman, exempelvis _Username eller liknande. Protected, private eller nåt?

r) Ehh, jag menar såklart variabler och inte klasser & metoder.

EkströmMedlem sedan feb. 20022 594 inlägg
#2

Använder också alltid ungersk notation, kamelungersk för att vara bestämd :) Antar att det är för att man måste deklarera vad det är för datatyp. Ex

VB
Dim foo as string
C#
string foo;

Men det förklarar det ändå inte, man håller ju lättare koll på datatyperna man använder om man döper variablerna/konstanterna till t.ex. strFoo osv.

Understreck i början använder man för att man kan :)

kristofferMedlem sedan juni 20001 257 inlägg
#3

Eftersom VBScript bara hade datatypen Variant var det ju idé att namnge variabler med ungersk notation. I dotnet är det onödigt eftersom man måste deklarera variablerna. Fast jag gör det ändå. :)

BrimbaMedlem sedan dec. 19995 875 inlägg
#4

Jag tror det ha att göra med att det är objektorienterat. (chansar)

Låt säg att man har en klass Person och en variabel som står för namn.
Då vore det mer korrekt att skriva

Person*.namn än att skriva
Person*.strNamn**

developerMedlem sedan aug. 2001458 inlägg
#5

Hungarian Notation var något Microsoft införde i början av 80-talet för att minska risken att göra ogiltiga casts, eftersom C/C++ inte är typsäkert, och kompilatorerna inte alltid kan upptäcka felaktiga casts. Ett hyfsat användbart sätt att minska risken för buggar. Även om Microsofts dokument täcker ganska många primitiva datatyper får man såklart inte med allt. Detta leder till att olika grupper får sina egna tillämpningar.

En inte helt ovanlig fälla med HN är att en variabels datatyp ändras vid någon fas i ett projekt, men namnet inte uppdateras eftersom det finns på många ställen.

Själv kommer jag ihåg ett sådant problem i ett projekt som hade driftsatts där man stötte på patrull. Det visade sig att de från början använt null-terminarade strängar och kallade dessa typ szNånting, men sedan gjort om typen så de inte längre var null-terminerade, utan man skickade med en längd. Desvärre var att namnen inte var ändrade, dvs variablerna hette szNånting utan att vara null-terminerade. Problemet jag hittade var att på ett (1) ställe i en mycket stor kod-mängd användes szNånting ändå som en null-terminerad sträng, vilket gav en heap-corruption ungefär en gång i veckan i ett ganska stort system. Min uppfattning är att Hungarian Notation kan vara förrädiskt på detta sätt. En kompilator ställd till att kompilera på strikt varnings-nivå och som behandlar varningar som fel (så att man inte kan strunta i varningar) är en mycket större hjälp än Hungarian Notation.

C# är (precis som Java) typsäkert. Problemet som HN är till för att lösa existerar helt enkelt inte längre. I min mening är det då bara klumpigt med HN och eftersom det dessutom strider mot guidelines är det bara dåligt att använda. Det är skönt att arbeta med ett språk som har guidelines (istället för att varje arbetsplats slösar tid på att göra sådana), och att dessutom ha ett verktyg (FxCop) för att kontrollera att dessa uppfylls. Det finns ingen anledning att avvika från reglerna.

Att namnge variabler med "_" som prefix/suffix eller "m_" som prefix görs ofta för att påvisa att dessa är medlemsvariabler. Detta ligger utanför Hungarian Notation och strider därför inte mot guidelines för C#. Personligen använder jag "m_" som prefix till medlemsvariabler efterom jag tycker det minskar risken för att glömma "this." om man råkar ha en lokal variabel med samma namn som en medlemsvariabel.

PaceMedlem sedan juni 20019 024 inlägg
#6

Jag tackar för dessa visa orden, nu har man blivit lite klokare igen! :)

erkaMedlem sedan dec. 19996 522 inlägg
#7

Vad exakt är en medlemsvariabel ?

PhorpherMedlem sedan feb. 20002 300 inlägg
#8

erka skrev:

Vad exakt är en medlemsvariabel ?

En medlemsvariabel är medlem i en klass.

class Foo
{
    private:
    int m_garnnystan;

    public:
    int getGarnnystan() { return m_garnnystan; };
    .
    .
    .
};

m_garnnystan är nu en medlem i klassen Foo, liksom metoden getGarnnystan() är en medlemsmetod i klassen Foo.

ToonsterMedlem sedan feb. 20001 590 inlägg
#9

På mitt företag (och de flesta inom samma branch) använder inte ungersk notation. Programmen ska vara dels välkommenterade där alla variabler ändå är beskrivna, dels så är variablernas namn valda efter vad de gör, inte vad de representerar för datatyp.
Fast som utvecklare har man den stora äran att göra som man vill (om man inte är styrd av företagspolicy's)

DinoMedlem sedan sep. 20011 914 inlägg
#10

Stephen Walter författare till ASP.NET Unleashed skrev:

Microsoft recommands that you do not follow this convention in the case of .NET Framework and ASP.NET. The motivation for this recommendation is that they expect you to use an advanced editor, such as Microsoft Visual Studio, to write your code. Visual Studio automatically provides you with information about a variable´s type.

135 ms totalt · 3 externa anrop · v20260731065814-full.102f7fcd
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
132 ms — hämta tråd, inlägg och bilagor (db)