Best Practices für C # GUI-Namenskonventionen? [geschlossen]


70

GUIs, ob in WinForms oder XAML geschrieben, scheinen die unterschiedlichsten Namenskonventionen zwischen Projekten zu haben, die ich sehe. Für einen einfachen TextBoxNamen einer Person habe ich verschiedene Namenskonventionen gesehen:

TextBox tbName      // Hungarian notation
TextBox txtName     // Alternative Hungarian
TextBox NameTextBox // Not even camelCase
TextBox nameTextBox // Field after field with TextBox on the end
TextBox TextBoxName // Suggested in an answer...
TextBox textBoxName // Suggested in an answer...
TextBox uxName      // Suggested in an answer...
TextBox name        // Deceptive since you need name.Text to get the real value
TextBox textBox1    // Default name, as bad as you can get

Ich halte mich normalerweise an die StyleCop-Regeln für alle meine CS-Dateien und sehe auch andere, aber die GUI neigt dazu, diese Regeln zu brechen oder stark zu variieren. Ich habe keine Microsoft-Richtlinien gesehen, die sich speziell auf GUI-Elemente anstatt nur auf normale Variablen beziehen, oder sogar Beispiele, die außerhalb einer Konsolenanwendung gelten würden.

Was sind die Best Practices für die Benennung von Elementen in einer GUI?


3
"textBox1" ist nur "so schlecht wie möglich", wenn Sie tatsächlich im Code darauf verweisen.
Austin Salonen

3
@Austin: In diesem Fall sollten Sie in WinForms Generate Member auf false setzen und in XAML den Namen x: Name überhaupt nicht definieren.
Will Eddins

Entschuldigung, es gibt keine gute Antwort darauf. Ich mag textBoxName und lableName selbst, finde es aber schwierig, mich zu verteidigen.
Ian Ringrose

1
Ich stimme Guard zu, das generierte Mitglied sollte standardmäßig auf false gesetzt sein. Tatsächlich gehe ich durch und setze es manuell auf false für alles, was ich nicht explizit benutze.
John Kraft

Argumente für die NICHT Verwendung der ungarischen Notation hier: stackoverflow.com/questions/111933/…
Gnarf

Antworten:


80

Ich verwende die ungarische alte Schule ... txt für TextBox, btn für Button, gefolgt von einem verallgemeinerten Wort, dann einem spezifischeren Wort. dh:

btnUserEmail

Viele Leute haben Dinge gesagt wie "Omg das ist so alt, VB6 ruft!" Aber in einer UI Rich-Winforms-App kann ich Dinge schneller finden und ändern, da das erste, was Sie über ein Steuerelement wissen, normalerweise der Typ, dann die Kategorie und dann die Spezifität ist. Während die neueren Namenskonventionen im Stil stecken bleiben und versuchen, sich daran zu erinnern, wie sie dieses Textfeld benannt haben.

Die ursprüngliche Spezifikation für Steuerelemente finden Sie hier (archiviert).


16
Einverstanden. Dies ist praktisch das einzige, wofür ich diese Syntax mehr verwende, und es liegt einfach an der Trennung zwischen Verwendung und Deklaration, die durch die Teilklassen für das vom Designer generierte Material verursacht wird.
Womp

2
Gibt es eine Ressource, die möglicherweise "korrekte" Präfixe für Steuerelemente anzeigt? Für TextBox sehe ich txt, tb und tbx, daher bin ich mir nie sicher, was richtig ist.
Will Eddins

3
@Neil: warum die Notwendigkeit abkürzen? Das Umbenennen von button1 in btnUserEmail erfordert mehr Arbeit (Tastenanschläge) als buttonUserEmail. Ich stimme Ihrer Logik absolut zu, aber txt ist nicht die Art der Steuerung. textBox ist.
John Kraft

Dieser MS-Support-Artikel listet am Ende nur VB4 / VB6-Sprachen in "Gilt für" auf. Vielleicht nicht die beste Referenz für die moderne .NET-Entwicklung.
Craig

Dies ist, was ich für die Namenskonvention verwende, aber ich denke, der wichtigste Gedanke ist, dass jeder Entwickler im Team dasselbe verwendet!
Gabriel Mongeon

31

Ich benutze:

TextBox nameTextBox;

Genau wie ich verwenden würde:

MailAddress homeAddress;

Der Grund dafür ist, dass in diesen Fällen "TextBox" und "Adresse" beschreiben, was das Objekt darstellt, nicht wie es gespeichert oder verwendet wird. Aber in einem anderen Fall wie dem Speichern des vollständigen Namens einer Person würde ich Folgendes verwenden:

string fullName;

Nicht:

string fullNameString;

Denn "String" beschreibt nicht, was das Objekt darstellt, sondern nur, wie es gespeichert wird.


Schöne Erklärung. Was würden Sie tun, wenn Sie eine Namensklasse (BigNameClass) hätten, die Teile eines Personennamens enthält (Präfix, erste, letzte, mittlere Initiale, Suffix)? Würden Sie dann fullNameBigNameClass verwenden? Ein schwieriger Teil bei der Erstellung eines Standards besteht darin, die Grenze für diese Art von Entscheidung zu ziehen.
Brad Bruce

Vielen Dank. Und ja, ich bin genau auf dieses Problem gestoßen. Die meisten Dinge, die in die Kategorie "BigNameClass" fallen, haben das Muster "AdjectiveAdjectiveAdjectiveAdjectiveNoun". Daher neige ich dazu, es auf etwas wie "fullNameNoun" oder "fullNameAdjectiveNoun" zu reduzieren ... genauso wie ich "MailAddress" auf "Address" reduziert habe.
Lee

+1. So mache ich das und fühle mich besser :)
Simon Whitehead

Wie wäre es mit steuerungsbasierten Feldern und Parametern?
Yousha Aleayoub

12

Gleiche Konvention wie alles andere in .NET: Nur beschreibender Name für Kamelfälle, optional gefolgt von einem Suffix, wenn Sie verschiedene Klassen für dasselbe logische "Ding" unterscheiden müssen. Zum Beispiel:

string name; // a name
TextBox nameText; // the control used to edit the name
Label nameLabel; // the control used to label the edit control
List<string> nameList; // a list of names

und so weiter bis ins Unendliche. Es ist wirklich egal, wie die Suffixe lauten, solange sie konsistent und beschreibend sind.


10

Dies ist nicht meine Erfindung, aber ich mag es:

TextBox uxName = new TextBox();
Label uxNameLabel = new Label();
Button uxAccept = new Button();

Ich ziehe dies der ungarischen Notation vor, da alle meine UI-Steuerelemente in einem Block in Intelisense angezeigt werden. UX für "User eXperience". Es ist auch schön, wenn Sie ein Steuerelement von einem Textfeld in eine Combobox oder etwas anderes ändern, da sich der Name nicht ändert.


4

Ich wünschte, jemand würde die Autorität in diesem Bereich werden und es einfach so sagen, wie es ist, und anfangen, es durchzusetzen ... Das Schlimmste für mich ist, wenn Leute es in derselben Anwendung oder noch schlimmer in derselben Klasse verwechseln.

Ich habe einige ziemlich schreckliche Sachen mit txtName, NameTextBox, name und textBox1 gesehen, die alle in derselben Form verwendet wurden ... yuck.

Wo ich arbeite, haben wir ein Standarddokument, das uns sagt, wie es geht, wo es geht, und ich denke, nur 20% der Menschen möchten überhaupt versuchen, sich anzupassen.

Normalerweise ändere ich etwas, wenn Fxcop mich anschreit.

http://en.wikipedia.org/wiki/Naming_conventions_%28programming%29

Großschreibungsstile

Beachten Sie Folgendes: Microsoft .NET empfiehlt UpperCamelCase (auch bekannt als "Pascal Style") für die meisten Bezeichner. (lowerCamelCase wird für Parameter empfohlen).


+1 zum Verknüpfen der .NET-Namensempfehlungen von Microsoft.
Craig

3

Das Wichtigste an Namenskonventionen ist, etwas Sinnvolles zu wählen, einen Konsens von allen Parteien zu erzielen und daran festzuhalten, als ob Ihr Leben davon abhängen würde.

Für welche Konvention würde ich stimmen:

TextBox name

Es ist kurz und hat einen semantischen Wert als Bezeichner. Was den Typ des Bezeichners angeht, würde ich mich auf Visual Studio verlassen, um Ihnen zu sagen, dass dies in der Regel gut ist.


Ich bin damit einverstanden, andernfalls laufen Sie Gefahr, dass txtName tatsächlich eine Combobox usw. ist.
VoronoiPotato

3

Ich benutze die Hungernotation mit einem kleinen Unterschied.

Ich arbeite jetzt an einem Projekt mit einer ziemlich umfangreichen Benutzeroberfläche. Mit Intellisense ist es also sehr einfach, eine Schaltfläche mit dem Namen btnGetUsers zu finden.

Die Dinge werden kompliziert, wenn die Anwendung Benutzer von verschiedenen Standorten abrufen kann. Das sind verschiedene Kontrollen. Also fing ich an, meine Steuerelemente nach ihrem Standort zu benennen und immer noch die ungarische Notation zu verwenden.

Beispiel: tabSchedAddSchedTxbAdress bedeutet, dass txbAddress ein Textfeld ist, in das eine Adresse eingefügt werden kann und das sich auf der Registerkarte Zeitplan hinzufügen auf der Registerkarte Zeitplansteuerung befindet. Auf diese Weise kann ich Steuerelemente sehr einfach finden und wenn ich einfach "btn" tippe, bekomme ich nicht sofort viele Schaltflächen von überall auf der Benutzeroberfläche.

Das soll mir natürlich nur helfen. Mir ist eine solche Best Practice nicht bekannt. Es hilft jedoch sehr.

Mosu '


2

Ich benenne alle meine UI-Elemente TypeDescriptor. Folgen Sie Ihrem Beispiel TextBoxName.


1
Dies ist, was ich folge, außer dass ich dazu neige, den ersten Buchstaben in Kleinbuchstaben zu schreiben, einfach weil ich es für das Auge angenehmer finde. Für mich wäre es also textBoxName
Mark

1
Diese Konvention ist hilfreich, da GUI-Objekte effektiv in einem von anderen Feldern getrennten Namespace abgelegt werden. Mein Login-Code hat wahrscheinlich mehrere Variablen mit dem Namen userNameoder password, aber es gibt keine Verwechslung mit TextUserNameund TextPassword.

Das macht für mich keinen Sinn, weil wir auf Englisch bevorzugen AdjectiveNoun. Zum Beispiel UserNamenicht NameUser. A TextBoxNamewäre also der Name eines Textfelds (es ist ein Name oder ein Substantiv vom Typ TextBox). NameTextBoxist richtig: es ist ein TextBoxTyp oder für Name, genau wie UserNameist ein NameTyp oder für , User.
ErikE

2

Ich habe in letzter Zeit mit einem Team gearbeitet, das von MFC (6.0 ...) wechselt. Dort hätten sie so etwas wie

CString Name;
CEdit ctlName;

Der einfachste Weg zur Migration war die Verwendung von so etwas wie

TextBox ctlName

Es ist nur eine Erinnerung genug, dass die Variable das Steuerelement und nicht der Wert des Steuerelements ist.

Ich denke, den Typ als Teil des Namens aufzunehmen ist nur ALT.

- Bearbeiten - Ein weiterer Vorteil ist, dass alle Steuerelemente beim Navigieren zusammengefasst werden. Wenn der tatsächliche Typ verwendet würde, wären die ComboBox-Steuerelemente ziemlich weit von den TextBox-Steuerelementen entfernt.


2

Ich verwende normalerweise c_typeName (bitte beachten Sie, dass Typ und Name unterschiedlich sind), z. B. c_tbUserEmail für eine TextBox, in die der Benutzer seine E-Mail-Adresse eingeben sollte. Ich finde es nützlich, weil es bei vielen Steuerelementen schwierig sein kann, sie in der kilometerlangen Intellisense-Liste zu finden. Wenn ich also das Präfix c_ hinzufüge, kann ich alle Steuerelemente in dieser Form leicht sehen.


2

Dieser Wahnsinn mit ungarischen / VB6-Namen muss aufhören.

Wenn Microsoft wirklich wollte, dass Sie Ihre Steuerelemente nach ihrem Typ benennen, warum greift Visual Studio dann nicht automatisch auf "txt" oder "btn" an, wenn Sie das Steuerelement zu Ihrem Web- / Win-Formular hinzufügen?


1
Aber was ist dann die Alternative?
Will Eddins

Persönlich benenne ich ein Textfeld für das, wofür es ist: Name, Benutzername, Passwort usw. Wenn es nicht mit einem Klassenmitglied kollidiert, füge ein Suffix hinzu wie: nameTextBox oder nameInput.
Craig

4
Ist das Sarkasmus? Visual Studio benennt Steuerelemente nach Typ, wenn Sie sie einem Formular hinzufügen.


1

Ich verwende die ungarische Notation, die es einfach macht, Steuerelemente auf großen Seiten zu finden.


1

Für die Elemente, die ich nicht in meinem Code verwenden möchte, lasse ich den Designer sie einfach für mich erledigen. Wenn sie in meinem Code verwendet werden, werden sie in etwas Sinnvolles geändert, und das ist zufällig descriptionType (nameTextBox). So erstellt der Designer sie, wenn genügend Informationen vorhanden sind (siehe Menüpunkte - "Beenden" wird zu exitMenuItem).


1

Meine eigene Praxis ist: Geben Sie _contextDescriptionType ein. Z.B:

TextBox _searchValueTextBox

Auf jeden Fall ist die Namenskonvention entweder zu persönlich oder wird durch allgemeine Regeln auferlegt. In jedem Fall sollte es irgendwo dokumentiert werden, damit alle Projektentwickler leicht darauf zugreifen können.


1

Ich glaube, dass es Namenskonventionen gibt, um den Entwicklercodierungsaufwand zu vereinfachen und die Verwaltbarkeit zu verbessern. Nach meinem Verständnis sollte jeder Name befolgt werden, der für den einfachen Zugriff hilfreich ist.

Ich habe eine Reihe von Kommentaren mit unterschiedlichem Ansatz gesehen, aber das Beste, was ich in meinen Projekten gefunden habe, ist, den ersten drei Namen der Steuerung vorangestellt zu haben. Es gibt viele Gründe, diesem Ansatz zu folgen.

  1. Intellisense würde alle den gleichen Typ zusammenbringen.
  2. Formulareigenschaftsfenster zeigen auch alle Steuerelemente sortiert an
  3. Auf komplexen Formularen können Sie leicht erkennen, dass es sich um ein Etikett oder ein Textfeld handelt (z. B. lblAccounts und txtAccounts).
  4. Ein neuer Benutzer kann problemlos mit der Codierung umgehen.
  5. Stellen Sie sich vor, ich habe die Steuerelemente accountLst, accountlbl, accounttxt, accountgrd und accountChk in derselben Form.

Während des Codierens weiß ein Entwickler immer, dass er auf ein Textfeld oder eine Beschriftung zugreift. Wobei er nicht klar ist, mit welchem ​​Namen der andere Entwickler verwendet hat. Wenn Sie also nur "lbl" Intellisens schreiben, wird die gesamte Beschriftungsliste zur Auswahl gebracht. Wenn Sie den in # 5 verwendeten Ansatz verwendet haben, bringt Intellisense alle Steuerelemente mit acc. Ich habe selten gesehen, dass eine Schleife mit einem Kontrollnamen mit "Konto" oder so begann. Dies bedeutet, dass es in keinem seltenen Fall helfen würde.

Meine Wette ist es, Dinge zu tun, die anderen Entwicklern helfen, Code leicht zu verstehen. Denn wenn Sie in Ihrem Träger aufwachsen, würden Sie nicht immer codieren, sondern eine andere Person würde Ihren Platz einnehmen.

Sie haben die Wahl, wie Sie wollen!


0

Wenn es in einem Anwendungsdesign eine gute Trennung der Bedenken gibt, müssen die Schaltflächen vermutlich nicht als LoginButton, LoginBtn oder btnLogin bezeichnet werden. Wenn der Eigentümer des Objekts ein UI-Element ist, nennen wir es Login. Wenn der Eigentümer kein UI-Element ist, befindet sich das Objekt an einer falschen Stelle.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.