Probleme, die ungarische Notation nicht zu verwenden

10

Ich habe Argumente für und gegen Systems Hungarian gesehen . Seit einigen Jahren arbeite ich an einem Legacy-Projekt, das dieses System verwendet, indem es jede Variable benennt und mit einem Präfix des Variablentyps (z. B. strName, intAge, btnSubmit usw.) benennt (ich kenne die ursprünglichen ungarischen Apps-Präfixe anhand der Art von Variable, nicht der Typ). Ich möchte, dass mein nächstes Projekt es vollständig aufgibt, aber es fällt mir schwerer, ähnliche Dinge eindeutig zu benennen, ohne darauf zurückzugreifen.

Nehmen wir an, ich habe ein Webformular zum Sammeln und Speichern von E-Mail-Adressen in einer Datenbanktabelle und eine Schaltfläche, die die Funktion aufruft, mit der die Adresse in der Datenbank gespeichert wird.

Wenn ich die ungarische Notation verwende, kann ich das Feld txtEmailals Schaltfläche btnEmailund den im Textfeld enthaltenen Wert bezeichnen strEmail. Ich könnte dann eine Funktion verwenden storeEmail(strEmail), um die E-Mail zu speichern. Ich habe hier eine klare Konvention, es ist offensichtlich, was jede Variable ist.

Was wäre die beste Vorgehensweise für die Benennung dieser Variablen?

  • ohne auf ungarische Systeme zurückzugreifen,
  • ohne sie lang oder verwirrend zu machen
  • und mit einer klaren Konvention, die ich für mein gesamtes Projekt verwenden kann?
Furchtlosigkeit
quelle
2
Möglicherweise stimmt etwas mit den übrigen Namenskonventionen oder der Größe Ihrer Funktionen nicht, wenn Sie Probleme haben, eindeutige Namen zu finden.
Welche Technologie verwenden Sie? Diese Präfixe scheinen sich für Web Forms zu eignen.
StuperUser
Ich benutze ASP.NET (mit C # dahinter)
Fearoffours
@delnan - kannst du das bitte näher erläutern? Warum erleichtert die Funktionsgröße die Benennung eindeutig?
Fearoffours
@fearofours: Eine kleinere Funktion benötigt weniger Variablen, und weniger Variablen bedeuten offensichtlich weniger Variablenkonflikte. Das setzt natürlich voraus, dass Sie jede Variable in den kleinstmöglichen Bereich bringen.

Antworten:

8

Ihr letzter Punkt ist der wichtigste - was auch immer Sie tun, Sie müssen in Ihrem Projekt und mit Ihren Kollegen konsistent sein. Es gibt zwei Möglichkeiten, um Konsistenz zu erreichen, und wenn möglich sollten Sie beide verwenden. Verwenden Sie zunächst ein Tool, um die Namenskonventionen beim Erstellen zu überprüfen. In der .Net-Welt wäre StyleCop ein gutes Beispiel für ein solches Tool. Die zweite Möglichkeit, Konsistenz zu erzielen, besteht darin, Peer-Reviews des gesamten Codes durchzuführen, damit Sie alle Ausschau halten können.

Ihre anderen beiden Punkte scheinen nach einer Alternative zu fragen. Ich bin mir nicht sicher, ob Sie eine Alternative brauchen. Der Punkt, dass Ungarisch nicht mehr populär ist, ist, dass es verwendet wurde, um den Typ zu beschreiben, als das Typensystem und die Werkzeuge etwas weniger streng waren. Das heißt, wenn Sie in C programmiert und Zeiger herumgereicht haben, können Sie den Typ nur mit Ungarisch verfolgen. Wenn Sie eine Sprache wie C # oder Java verwenden, werden Sie keine Zeiger verwenden (oder sehr selten), sodass die Notwendigkeit für jede Art von Ungarisch wegfällt. Mit modernen IDEs können Sie den Typ auch sehr leicht erkennen, indem Sie mit der Maus über die Variable fahren oder im schlimmsten Fall eine Verknüpfung verwenden, um die ursprüngliche Deklaration anzuzeigen. Ich glaube also nicht, dass Sie irgendeine Art von Notation benötigen, benennen Sie die Variable einfach so, wie sie funktioniert. Wenn es sich um eine E-Mail-Adresse handelt, verwenden Sie einfach "E-Mail" oder "

Steve
quelle
2
Es wird etwas kniffliger, wenn das Formular / die Seite / das Fenster / was auch immer eine Schaltfläche für E-Mail, ein Textfeld für E-Mail und möglicherweise ein anderes Widget / Steuerelement für E-Mail enthält ...
FrustratedWithFormsDesigner
7
@FrustratedWithFormsDesigner Nicht unbedingt. Das Textfeld könnte emailAddressInput sein, wobei die Schaltfläche emailAddressSubmit und die interne Darstellung einfach emailAddress sein könnte.
Jonathan
@ Jonathan: Guter Punkt.
FrustratedWithFormsDesigner
3

Wenn Sie mit Webformularen / Windows-Formularen / anderen grafischen Elementen arbeiten, ist es sinnvoll, Systems Hungarian zu verwenden, da Sie Steuerelemente haben können, die sehr eng miteinander verbunden sind, z. B. ein Textfeld und eine Beschriftung, die zusammenpassen. Sie könnten sie benennen txtEmailund lblEmailunterscheiden. Nach meiner Erfahrung ist dies üblich und tatsächlich nützlich.

In Ihrem Code-Behind ist diese Art der Benennung jedoch nicht erforderlich. Wenn Sie eine Variable vom Typ haben string, die zum Speichern einer E-Mail verwendet wird, benennen Sie sie einfach email. Wenn Sie aus irgendeinem Grund verwirrt sind, sollten die meisten IDEs es Ihnen ermöglichen, mit der Maus darüber zu fahren und den Typ zu sehen. (Idealerweise ist es in OO-Inhalten ein Attribut eines Objekts und user.Emailnoch deutlicher.)

Ich denke, wenn in Ihrem Code mehr als ein Objekt deklariert ist, das kein GUI-Steuerelement ist, das zu Recht benannt werden könnte email, stimmt etwas mit Ihrem Design nicht.

Andrew Arnold
quelle
1
Tatsächlich sind txt und lbl nicht ungarisch, txt ist nur kurz für Text und lbl ist kurz für Label. Es gibt keinen Grund, nicht nur das Wort in voller Länge zu verwenden, z. B. EmailText und EmailLabel in einem Formular. Ungarisch wäre der Typ, der in beiden Fällen eine Zeichenfolge ist.
Steve
1
@ Steve Haigh - Nein, ich spreche über die Kontrollen selbst. Sie haben ein Objekt vom Typ "Textfeld" namens txtEmail und ein Objekt vom Typ "label" namens lblEmail. Keiner von ihnen ist eine Saite. Sie können haben String - Eigenschaften, aber sie sind nicht reiht sich.
Andrew Arnold
1
Ah, tut mir leid. Ja natürlich. Trotzdem gibt es keinen Grund, keinen aussagekräftigeren Namen wie EmailTextBox zu verwenden. Nur weil VS einen schlechten Namen generiert, heißt das nicht, dass Sie ihn behalten müssen. Im Zusammenhang mit Formularen sind die Abkürzungen txt und lbl jedoch so gut verstanden, dass ich mir in diesem Fall wahrscheinlich keine Sorgen machen würde.
Steve
3

Was macht eine Variable "über lang"?

Anstatt txtEmail, btnEmailkönnten Sie verwenden UserEmailText, UserEmailButtonund AdminEmailText,AdminEmailButton

Das Problem dabei ist, dass Sie möglicherweise das Gefühl haben, dass die Variable langsam lang wird:

AdminEmailIsValid beginnt zu begrenzen, wie lange ich die Variable zulassen würde.

Darüber hinaus stellen Sie möglicherweise fest, dass Sie eine Reihe von Variablen und eine Reihe von Operationen für diese Variablen wiederverwenden. Dafür ist OOP konzipiert . Erstellen Sie anstelle einer Reihe von Variablen ein generisches Objekt:

class EmailForm
  var textBox, button, text
  function storeEmail()

Anschließend können Sie eine neue Variable als Klasse instanziieren und dieselbe Punktnotation verwenden, um auf Ihre Daten zuzugreifen:

userEmailForm = new EmailForm(...data...)
adminEmailForm = new EmailForm(...different data...)
doSomething( userEmailForm.text )
doSomethingElse( adminEmailForm.text )

Dies richtet sich natürlich an Sprachen, die das OOP-Paradigma verwenden, aber die meisten gängigen Webentwicklungssprachen sind objektorientiert oder ermöglichen objektorientierten Code (PHP, Python, C #, C ++, Java, JavaScript, ActionScript usw.) ).

zzzzBov
quelle
Ich sehe den Vorteil von UserEmailText gegenüber txtEmail nicht - Sie fügen nur den Typ hinzu, anstatt ihn vorangestellt zu haben. Ich mag jedoch "Dafür ist OOP konzipiert".
Fearoffours
@fearoffours, OP gab zu, ein Problem mit eindeutigen Namen zu haben, und fügte dieses Beispiel als beschreibende Methode zur Unterscheidung zwischen zwei ähnlichen Variablen ( UserEmailTextund AdminEmailTextspeziell) hinzu. Normalerweise füge ich Suffix-Typen hinzu, da es sich für den Wechsel zu einer Klasse eignet UserEmailText-> UserEmail.text->, User.email.textje nachdem, wie viel Abstraktion / Funktionalität erforderlich ist.
zzzzBov
OK, sehen Sie, wo Sie von dort kommen. +1 für den Vergleich von Suffix / Klasse. Oh, und ich bin der OP!
Furchtoffours
@ Angstoffours, lol whoops ...
zzzzBov