Ich bin alle für gut gemachte Präfixe .
Ich denke, dass die ungarische (System-) Notation für den größten Teil des "schlechten Rufs" verantwortlich ist, den Präfixe erhalten.
Diese Notation ist in stark typisierten Sprachen, z. B. in C ++ "lpsz", weitgehend sinnlos, um Ihnen mitzuteilen, dass Ihre Zeichenfolge ein langer Zeiger auf eine nicht terminierte Zeichenfolge ist, wenn: Segmentierte Architektur eine alte Geschichte ist, C ++ - Zeichenfolgen nach gängigen Konventionen Zeiger auf nicht terminierte Zeichenfolgen sind char-Arrays, und es ist gar nicht so schwer zu wissen, dass "customerName" eine Zeichenfolge ist!
Ich verwende jedoch Präfixe, um die Verwendung einer Variablen anzugeben (im Wesentlichen "Apps Ungarisch", obwohl ich es vorziehe, den Begriff Ungarisch zu vermeiden, da er eine schlechte und unfaire Verbindung mit System Hungarian hat), und dies ist eine sehr praktische Zeitersparnis und Fehlerreduzierender Ansatz.
Ich benutze:
- m für Mitglieder
- c für Konstanten / Readonlys
- p für Zeiger (und pp für Zeiger auf Zeiger)
- v für flüchtig
- s für statische
- i für Indizes und Iteratoren
- e für Veranstaltungen
Wenn ich den Typ klarstellen möchte , verwende ich Standardsuffixe (z. B. List, ComboBox usw.).
Dies macht den Programmierer auf die Verwendung der Variablen aufmerksam, wenn er sie sieht / verwendet. Der wohl wichtigste Fall ist "p" für Zeiger (da sich die Verwendung von var. Zu var-> ändert und Sie mit Zeigern - NULL, Zeigerarithmetik usw. - viel vorsichtiger umgehen müssen), aber alle anderen sind sehr praktisch.
Beispielsweise können Sie denselben Variablennamen in einer einzigen Funktion auf verschiedene Arten verwenden: (hier ein C ++ - Beispiel, das jedoch für viele Sprachen gleichermaßen gilt)
MyClass::MyClass(int numItems)
{
mNumItems = numItems;
for (int iItem = 0; iItem < mNumItems; iItem++)
{
Item *pItem = new Item();
itemList[iItem] = pItem;
}
}
Sie können hier sehen:
- Keine Verwechslung zwischen Element und Parameter
- Keine Verwechslung zwischen Index / Iterator und Elementen
- Verwendung einer Reihe klar verwandter Variablen (Artikelliste, Zeiger und Index), die die vielen Fallstricke generischer (vager) Namen wie "count", "index" vermeiden.
- Präfixe reduzieren die Eingabe (kürzer und funktionieren besser mit automatischer Vervollständigung) als Alternativen wie "itemIndex" und "itemPtr".
Ein weiterer großartiger Punkt bei "iName" -Iteratoren ist, dass ich niemals ein Array mit dem falschen Index indiziere. Wenn ich eine Schleife in eine andere Schleife kopiere, muss ich keine der Schleifenindexvariablen umgestalten.
Vergleichen Sie dieses unrealistisch einfache Beispiel:
for (int i = 0; i < 100; i++)
for (int j = 0; j < 5; j++)
list[i].score += other[j].score;
(was schwer zu lesen ist und oft zur Verwendung von "i" führt, wo "j" beabsichtigt war)
mit:
for (int iCompany = 0; iCompany < numCompanies; iCompany++)
for (int iUser = 0; iUser < numUsers; iUser++)
companyList[iCompany].score += userList[iUser].score;
(Dies ist viel besser lesbar und beseitigt alle Verwirrung über die Indizierung. Mit der automatischen Vervollständigung in modernen IDEs ist dies auch schnell und einfach einzugeben.)
Der nächste Vorteil ist, dass für Code-Snippets kein Kontext verstanden werden muss. Ich kann zwei Codezeilen in eine E-Mail oder ein Dokument kopieren, und jeder, der dieses Snippet liest, kann den Unterschied zwischen allen Elementen, Konstanten, Zeigern, Indizes usw. erkennen. Ich muss nicht "oh, und sei vorsichtig, weil" hinzufügen 'data' ist ein Zeiger auf einen Zeiger ", weil er 'ppData' heißt.
Und aus dem gleichen Grund muss ich meine Augen nicht aus einer Codezeile heraus bewegen, um sie zu verstehen. Ich muss den Code nicht durchsuchen, um festzustellen, ob 'data' ein Lokal, ein Parameter, ein Mitglied oder eine Konstante ist. Ich muss meine Hand nicht zur Maus bewegen, damit ich den Mauszeiger über 'Daten' bewegen und dann warten kann, bis ein Tooltip (der manchmal nie angezeigt wird) angezeigt wird. So können Programmierer den Code erheblich schneller lesen und verstehen , da sie keine Zeit damit verschwenden, nach oben und unten zu suchen oder zu warten.
(Wenn Sie nicht glauben, dass Sie Zeit damit verschwenden, nach oben und unten zu suchen, um etwas herauszufinden, suchen Sie nach Code, den Sie vor einem Jahr geschrieben und seitdem nicht mehr angesehen haben. Öffnen Sie die Datei und springen Sie etwa auf halber Strecke, ohne sie zu lesen. Sehen Sie, wie Bis jetzt können Sie von diesem Punkt aus lesen, bevor Sie nicht wissen, ob etwas ein Mitglied, ein Parameter oder ein lokales Element ist. Springen Sie jetzt zu einem anderen zufälligen Ort ... Dies tun wir alle den ganzen Tag, wenn wir den Code eines anderen einzeln durchlaufen oder versuchen zu verstehen, wie man ihre Funktion aufruft)
Das Präfix 'm' vermeidet auch die (IMHO) hässliche und wortreiche "this->" - Notation und die damit verbundene Inkonsistenz (selbst wenn Sie vorsichtig sind, erhalten Sie normalerweise eine Mischung aus 'this-> data' und 'Daten' in derselben Klasse, da nichts eine konsistente Schreibweise des Namens erzwingt).
'diese' Notation soll Mehrdeutigkeiten auflösen - aber warum sollte jemand absichtlich Code schreiben, der mehrdeutig sein kann? Mehrdeutigkeit führt früher oder später zu einem Fehler. In einigen Sprachen kann "dies" nicht für statische Elemente verwendet werden. Daher müssen Sie "Sonderfälle" in Ihren Codierungsstil einfügen. Ich bevorzuge eine einzige einfache Codierungsregel, die überall gilt - explizit, eindeutig und konsistent.
Der letzte große Vorteil ist Intellisense und die automatische Vervollständigung. Versuchen Sie, Intellisense in einem Windows Form zu verwenden, um ein Ereignis zu finden. Sie müssen durch Hunderte mysteriöser Basisklassenmethoden scrollen, die Sie niemals aufrufen müssen, um die Ereignisse zu finden. Wenn jedoch jedes Ereignis ein "e" -Präfix hätte, würden sie automatisch in einer Gruppe unter "e" aufgeführt. Das Präfixieren dient daher dazu, die Mitglieder, Konstanten, Ereignisse usw. in der Intellisense-Liste zu gruppieren, wodurch es viel schneller und einfacher wird, die gewünschten Namen zu finden. (Normalerweise kann eine Methode etwa 20-50 Werte (Lokale, Parameter, Mitglieder, Konstanten, Ereignisse) haben, auf die in ihrem Bereich zugegriffen werden kann. Nach der Eingabe des Präfixes (ich möchte jetzt einen Index verwenden, gebe ich also 'i' ein. .. '), mir werden nur 2-5 Optionen für die automatische Vervollständigung angezeigt. Die' zusätzliche Eingabe '
Ich bin ein fauler Programmierer, und die obige Konvention erspart mir viel Arbeit. Ich kann schneller codieren und mache weit weniger Fehler, weil ich weiß, wie jede Variable verwendet werden soll.
Argumente gegen
Also, was sind die Nachteile? Typische Argumente gegen Präfixe sind:
"Präfixschemata sind schlecht / böse" . Ich bin damit einverstanden, dass "m_lpsz" und seine Art schlecht durchdacht und völlig nutzlos sind. Aus diesem Grund würde ich empfehlen, eine gut gestaltete Notation zu verwenden, die Ihre Anforderungen unterstützt, anstatt etwas zu kopieren, das für Ihren Kontext ungeeignet ist. (Verwenden Sie das richtige Werkzeug für den Job).
"Wenn ich die Verwendung von etwas ändere, muss ich es umbenennen" . Ja, natürlich tun Sie das. Darum geht es beim Refactoring und darum, warum IDEs über Refactoring-Tools verfügen, um diese Aufgabe schnell und schmerzlos zu erledigen. Auch ohne Präfixe, die Verwendung eines variablen Veränderung bedeutet fast sicher sein Name sollte geändert werden.
"Präfixe verwirren mich nur" . Wie jedes Werkzeug, bis Sie lernen, wie man es benutzt. Sobald sich Ihr Gehirn an die Namensmuster gewöhnt hat, filtert es die Informationen automatisch heraus und es macht Ihnen nichts aus, dass die Präfixe nicht mehr vorhanden sind. Aber Sie müssen ein oder zwei Wochen lang ein solches Schema anwenden, bevor Sie wirklich "fließend" werden. Und dann schauen sich viele Leute alten Code an und fragen sich, wie sie es jemals ohne ein gutes Präfixschema geschafft haben.
"Ich kann mir nur den Code ansehen, um dieses Zeug herauszuarbeiten" . Ja, aber Sie müssen keine Zeit damit verschwenden, an anderer Stelle im Code nachzuschauen oder sich an jedes Detail zu erinnern, wenn die Antwort genau an der Stelle ist, auf die Ihr Auge bereits fokussiert ist.
(Einige) dieser Informationen können gefunden werden, indem Sie nur darauf warten, dass ein Tooltip in meiner Variablen angezeigt wird . Ja. Wenn dies unterstützt wird, können Sie bei einigen Präfixtypen, wenn Ihr Code sauber kompiliert wurde, nach einer Wartezeit eine Beschreibung durchlesen und die Informationen finden, die das Präfix sofort übermittelt hätte. Ich bin der Meinung, dass das Präfix ein einfacherer, zuverlässigerer und effizienterer Ansatz ist.
"Es ist mehr tippen" . "Ja wirklich?" Ein ganzer Charakter mehr? Oder ist es das? Mit IDE-Tools zur automatischen Vervollständigung wird die Eingabe häufig reduziert, da jedes Präfixzeichen den Suchraum erheblich einschränkt. Drücken Sie "e" und die drei Ereignisse in Ihrer Klasse werden in Intellisense angezeigt. Drücken Sie "c" und die fünf Konstanten werden aufgelistet.
"Ich kann this->
anstelle von verwenden m
" . Ja, das kannst du. Aber das ist nur ein viel hässlicheres und ausführlicheres Präfix! Nur es birgt ein weitaus größeres Risiko (insbesondere in Teams), da es für den Compiler optional ist und daher seine Verwendung häufig inkonsistent ist. m
Auf der anderen Seite ist es kurz, klar, explizit und nicht optional, so dass es viel schwieriger ist, Fehler damit zu machen.