Was sind die Vorteile des Präfixierens von Funktionsparameternamen mit p *?


22

Ich sehe oft Projekte (in Java-Projekten und -Teams, die Eclipse verwenden), denen Funktionsparameter vorangestellt sind p.

Beispielsweise

public void filter (Result pResult) ...

Ich persönlich sehe keinen Nutzen darin, würde aber gerne wissen, was die Begründung ist. Die beste Erklärung, die ich bisher gehört habe, ist, den Namen identischer benannter Felder zu unterscheiden. Ich habe meine Probleme mit dieser Erklärung, aber ich kann den Punkt verstehen.

Antworten:


34

Die Praktiken zum Hinzufügen aussagekräftiger Präfixe zu Symbolen, wie z. B. die gut publizierte ungarische Notation , stammen aus der Zeit, als IDEs nicht existierten oder zu primitiv waren. Wenn heute ein Deklarationspunkt mit einem Mausklick gefunden werden kann, macht es keinen Sinn, den wertvollsten Teil des Namens, seine ersten Buchstaben, durch Zuweisen eines gemeinsamen Präfixes zu verderben.


10
Systems Hungarian Notation ist eine schreckliche Praxis, die vermieden werden sollte. Auf der anderen Seite können einige Apps der ungarischen Notation nützlich sein (z. B. um zu verhindern, dass unsichere Benutzereingaben missbraucht werden).
Casey Kuball

7
@Darthfett: Selbst diese Art der ungarischen Notation scheint zu versuchen, ein manuelles Ad-hoc-Typsystem direkt in die Variablennamen zu implementieren. Verwenden Sie einfach eine gute statisch getippte Sprache und lassen Sie ein echtes Typensystem solche Dinge automatisch für Sie nachverfolgen!
Tikhon Jelvis

1
@WyattBarnett Systems Hungarian bietet Programmierern mit modernen IDEs keine nützlichen Informationen. Apps Hungarian kann Kopfschmerzen bei Codeüberprüfungen reduzieren, wenn sie korrekt durchgesetzt werden.
Casey Kuball

2
@TikhonJelvis Nicht alle Sprachen unterstützen stark erzwungene Typedefs (z. B. C ++ - Typedefs ). Für die Sprachen, die es unterstützen, sind Sie ganz richtig.
Casey Kuball

4
@Darthfett: In C / C ++ können Sie es einfach in struct/ unionmit einem Element umbrechen .
Maciej Piechotka

9

Wie Sie vermuten, sollten Namenskollisionen zwischen dem Parameternamen und den Namen der Mitglieder oder der lokalen Variablen vermieden werden. Mitgliedsvariablen erhalten manchmal aus demselben Grund ein Präfix (z m_result. B. ). Persönlich bevorzuge ich es, nur das thisPräfix für Mitgliedsvariablen zu verwenden, wenn es zu einer Namenskollision kommt. Es ist in die Sprache eingebaut und jeder weiß bereits, was es bedeutet.


Das ist was ich mache. Das Nichtverwenden eines Präfixes hilft auch in Eclipse beim Aufrufen der Methode. Wenn Sie Ihren Objektbaum erstellt und die Variablen wie die Parameternamen der aufzurufenden Methode benannt haben, funktioniert dies wie ein Charm, aber wenn die Parameternamen vorangestellt sind, funktioniert dies nicht.
oschrenk

5

Ich verwende ein Parameterpräfix nur, wenn der Parameter einer Mitgliedsvariablen wie einem Konstruktor oder einem Setter zugewiesen werden soll.

Paint (newColor) {
  color = newColor;
}

Ich finde, dass die Verwendung eines anderen Variablennamens offensichtlicher ist als die Verwendung des Präfixes "this".

In anderen Situationen vermeide ich die Verwendung eines Parameters, der leicht mit einer Mitgliedsvariablen verwechselt werden kann.

Wenn eine Methode oder Klasse so groß ist, dass sich die Bedeutung der Variablen nur schwer beurteilen lässt, besteht die eigentliche Lösung darin, sie in kleinere Methoden / Klassen aufzuteilen. Die Verwendung von Präfixen ist eine Band-Aid-Lösung, die das zugrunde liegende Problem behebt.


Ich persönlich bevorzuge es, den Parameternamen in diesem Fall abzukürzen (z Paint (clr) { color = clr; }. B. ). ... Es gibt normalerweise nicht viel Mehrdeutigkeit, obwohl color -> clrinsbesondere eine Ausnahme sein kann.
Justin Time 2 Setzen Sie Monica

1

Wenn Sie einen Standard festlegen, der 'p' als Präfix für jeden Methodenparameternamen verwendet, können Sie die Methodenparameter im restlichen Methodenkörper leicht erkennen.

Das Auffinden der Methodenparameter spart Zeit. Sie können Ihren Code leicht debuggen.


1
Wenn Sie nicht wissen, was ein Parameter ist und was nicht - Ihre Methode ist wahrscheinlich schlecht geschrieben. Vielleicht ist es zu lang oder es werden zu viele unstrukturierte Variablen verwendet? In beiden Fällen scheint es sich um ein anderes Problem zu handeln, bei dem unnötige Präfixe hinzugefügt werden.
Jakubiszon

1

Kurz - Diese Vorgehensweise erschwert das Lesen von Code.

Lang - ich werde argumentieren, dass es sich um eine schlechte Praxis handelt, die nur zur Unterstützung anderer schlechter Praktiken verwendet wird. Lassen Sie uns ein paar Gründe untersuchen, warum die Verwendung solcher Präfixe hilfreich sein könnte:

  • Vermeiden von Kollisionen bei Variablennamen

    • Drücken Ihre Parameternamen genau aus, was die Parameter sind? Wenn Sie ein Parameter- und ein Klassenfeld haben, die "genau gleich" sind, benötigen Sie keinen Parameter.
    • In diesem Fall ist es nur sinnvoll, Präfixe für Klassenkonstruktoren wie das in Aarons Antwort beschriebene neue Präfix * zu verwenden. Dies kann auch für Setter-Methoden nützlich sein, z

    public void setHeight(int newHeight) { this.height = newHeight; }

  • Methoden benötigen viele Parameter, deklarieren viele Variablen und wir könnten leicht vergessen, welcher ein Parameter ist.

    • Wie oben beschrieben, liegt das Problem in der Anzahl der Variablen.
    • Das Programm ist wahrscheinlich nicht gut strukturiert. Überprüfen Sie, ob alle Variablen "unabhängig" sind - möglicherweise sollten sie in Strukturen oder Klassen organisiert werden. Vielleicht sollte die gesamte Berechnung oder der gesamte Prozess in eine separate Klasse eingeschlossen werden, um nur mit einer solchen Anzahl von Variablen zu arbeiten.
    • Selbst wenn Sie eine solche Anzahl von Variablen benötigen, sollten diese aussagekräftige Namen verwenden und das Präfix steht zwischen Ihnen und dem aussagekräftigen Teil.
  • Methoden sind sehr lang und Sie müssen Präfixe verwenden, um zu verfolgen, was ein Parameter ist.
    • Das Problem liegt in der Länge der Methoden - Wenn ein Programm gut geschrieben ist, sollten Sie immer den Methodenkopf und seinen gesamten Körper auf einem Bildschirm sehen.
    • Versuchen Sie, die Methode in kleinere Blöcke aufzuteilen.

Mit Ausnahme einiger spezifischer Fälle hilft das Hinzufügen von Parameterpräfixen nur bei Symptomen und löst keine tatsächlichen Probleme.


0

Ich bin ein Fan von iParam für In- und OParam für Out-Parameter. Ich würde cParam für Veränderung sagen, aber das ist nicht akzeptabel


2
Können Sie erklären, warum Sie ein Fan dieses Präfixes sind, was bringt es Ihnen?
Peter
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.