Wie vermeiden Sie Namensähnlichkeiten zwischen Ihren Klassen und den einheimischen? [geschlossen]

9

Ich bin gerade auf ein "interessantes Problem" gestoßen, zu dem ich Ihre Meinung gerne hätte:

Ich entwickle ein System und aus vielen Gründen (dh Abstraktion, Technologieunabhängigkeit usw.) erstellen wir unsere eigenen Typen für den Informationsaustausch.

Zum Beispiel: Wenn es eine Methode gibt, die SendEmail heißt und von der Geschäftslogik aufgerufen wird, hat sie übrigens einen Parameter vom Typ OurCompany.EMailMessage, ein Objekt, das vollständig technologieunabhängig ist und nur "geschäftsrelevante Daten" enthält (z Instanz, keine Informationen über Kopfcodierung).

Innerhalb der SendEmail-Funktion erhalten wir diese Informationen von unserem EMailMEssage-Objekt und erstellen ein MailMessage-Objekt (dieses ist technologiebezogen), damit es über das Netzwerk gesendet werden kann.

Wie Sie bereits feststellen können, hat unsere Klasse einen sehr ähnlichen Namen wie die "Muttersprache". Das Problem ist: Dies ist genau das, was sie sind, E-Mail-Nachrichten, daher ist es schwierig, einen anderen aussagekräftigen Namen für sie zu finden.

Haben Sie dieses Problem oft? Wie schaffen Sie das?

Bearbeiten: @mgkrebbs hat gerade die Verwendung vollständig qualifizierter Namen kommentiert. Dies ist unser aktueller Ansatz, aber meiner Meinung nach etwas zu ausführlich. Ich hätte gerne etwas saubereres, wenn möglich.

JSBach
quelle
2
Die Qualifikation immer zu verwenden, scheint eine praktikable Lösung zu sein, wenn auch etwas ausführlich. Verwenden Sie OurCompany.EMailMessage für einen Typ und SendEmailClass.EMailMessage (oder was auch immer) für den anderen. Gibt es ein Problem mit diesem Ansatz?
mgkrebbs
Ja, ich habe darüber nachgedacht, aber es wird ausführlich. Ich hätte gerne etwas "saubereres", aber die von Ihnen vorgeschlagene Lösung ist meine aktuelle. Ich werde dies der Erklärung hinzufügen
JSBach
3
Namen kommen in einen Kontext. Normalerweise ein Namespace oder so ähnlich. Es sollte also kein Problem sein.
Deadalnix
+1, ich mag diese Frage. Ich habe diese Frage vor ungefähr 7 Jahren einmal einem Ausbilder gestellt und er dachte, ich sei ein komplettes "...." :)
NoChance
Welche Sprache benutzt du? Die Antwort ist sprachspezifisch. Im Allgemeinen lautet die Antwort "Namespace verwenden". In einer einzelnen Java-Anwendung ist es durchaus üblich, dass ein halbes Dutzend Bibliotheken denselben Klassennamen verwenden.
Kevin Cline

Antworten:

3

Dies ist ein Problem mit dem Namespace, den Sie für Ihr Projekt verwenden werden.

Grundsätzlich ist ein Namespace die Sammlung der Schlüsselwörter, die von all Ihren Klassen und / oder allen Klassen bereitgestellt werden, die Sie in Ihrem Projekt verwenden möchten (einschließlich der Standardklassen, die normalerweise mit der Sprache / dem Compiler / der IDE bereitgestellt werden).

Da es sich bei einem Namespace um eine Sammlung handelt, werden im Grunde genommen einige Regeln angewendet, um das Durcheinander von Begriffen ohne verwandtes Verhalten zu verhindern. In einigen Sprachen wie C # können Sie Ihren eigenen Namespace wie gewohnt definieren und auch in anderen Klassen verwenden.

Verwechseln Sie den Namespace nicht mit dem Basisschlüsselwort der Sprache. Beide sind eine Sammlung von Schlüsselwörtern, aber mit einem großen Unterschied zwischen beiden: Sie können einen Namespace ändern, aber normalerweise können Sie die Basisschlüsselwörter einer Sprache nicht ändern. Die Summe zwischen dem in Ihrem Projekt verwendeten Namespace und den grundlegenden Schlüsselwörtern der von Ihnen verwendeten Sprache ergibt die Gesamtanzahl der Schlüsselwörter.

Das Thema wird im Internet stark diskutiert, ich kann eine einfache Suche mit den Begriffen "Namespace [Ihre Sprache]" oder so etwas vorschlagen. Ich beantworte Ihre Frage nicht direkt, nur weil Sie für verschiedene Sprachen unterschiedliche Ansätze haben können.

Mikro
quelle
3

Nun, mein altes Entwicklungsteam verwendet, um das Akronym der Anwendung in jeder benutzerdefinierten Klasse anzuhängen. Wir hatten zum Beispiel eine ABCEmail- Klasse.

Ich denke, es ist einfacher als sich auf den Namespace zu verlassen, kann aber auch eine ergänzende Lösung für die Verwendung des Namespace sein.

Da Sie ein neues Objekt erstellen, bedeutet dies nicht, dass das native Objekt nicht Ihren Anforderungen entspricht, sodass Ihr Name für Ihre E-Mail-Datei CustomizedEmail , AdvancedEmail ... usw. Sein kann

Amin
quelle
1
Einverstanden mit Ihrem letzten Punkt, aber warum wäre OAEmailbesser als OurApplication.Email? OAEMailhat Auswirkungen auf jeden Teil der Software, während die Namespace-Notation nur dort Auswirkungen hat, wo die Konvertierung erfolgt und beide Klassen in derselben Quelldatei verwendet werden.
Steven Jeuris
1
Ich denke, das Präfix ist eine gute Idee, wenn Ihre Sprache keine Namespaces unterstützt. Aber wenn die Sprache eine Form für den Namespace unterstützt, verwenden Sie sie (dies ist das Problem, für das Namespaces entwickelt wurden!). `
Martin York
@Steven Jeuris: Der Name der Klasse sollte nach ihrer Erstellung ausgewählt werden. Danach finde ich es eine schlechte Praxis, es zu ändern ... wegen all der unnötigen Auswirkungen.
Amine
@Loki Astari: Ich weiß nicht, welche IDE Sie verwenden, aber ich finde, dass ein anderer Klassenname beim Suchen oder Öffnen einer bestimmten Klasse einfacher zu handhaben ist. Ich habe Projekte mit einer angepassten Version von "E-Mail" gesehen und jedes Mal, wenn ich die Datei öffnen wollte, musste ich mehrere Namespaces durchsuchen. Ihr Punkt ist immer noch gültig. Ich denke, es ist subjektiv für die Paketorganisation, wie viele benutzerdefinierte Klassen erstellt werden.
Amine
1
@Amine: Ich wusste nicht, dass du tatsächlich gegen Namespaces argumentierst . Ich schlage vor, Sie lesen mehr über Namespaces, um alle Vorteile ihrer Verwendung zu sehen: Kapselung, Beseitigung von Mehrdeutigkeiten, weniger Redundanz, ... Ps: Die meisten modernen IDEs verfügen über Suchfunktionen, mit denen Sie schnell eine Quelldatei finden können, ohne sie durchsuchen zu müssen Die Hierarchie. Zu Ihrem Kommentar an mich: Ständiges Refactoring ist Teil der Softwareentwicklung. Wenn Sie einen passenderen Namen finden können, ob mit großer Wirkung oder nicht, sollten Sie ihn umbenennen. Es ist jedoch am besten, dies zuerst mit Kollegen zu besprechen.
Steven Jeuris
3

Welche Sprache benutzt du? Die Antwort ist sprachspezifisch. Im Allgemeinen lautet die Antwort "Namespaces verwenden". Ich würde den Typnamen fast nie entstellen, um einen Konflikt mit einem externen Namespace zu vermeiden.

In einer einzelnen Java-Anwendung ist es durchaus üblich, dass derselbe Klassenname (z. B. "Datum") in einem halben Dutzend Namespaces definiert ist. Wenn eine Klasse zwei separate Date-Klassen verwenden muss, muss eine der Date-Klassen überall dort, wo sie angezeigt wird, vollständig qualifiziert sein, da Java keine Typ-Aliase unterstützt. In C ++ ist das Leben einfacher; Sie können einen von ihnen einfach mit einem typedef umbenennen.

Kevin Cline
quelle
Ich wollte gerade eine ähnliche Antwort veröffentlichen, wollte aber anstelle des C ++ - Alias-Beispiels erwähnen, dass C # die Alias-Direktive verwendet .
Steven Jeuris
@Steven: Ich wollte C # anstelle von C ++ erwähnen, aber es ist ein paar Jahre her, seit ich in C # programmiert habe und war mir nicht sicher.
Kevin Cline
2

Haben Sie dieses Problem oft? Wie schaffen Sie das?

Es hängt wirklich von der Sprache ab, die Sie verwenden. In C ++ und Java wird dieses Problem mithilfe von Namespaces gelöst. Ich benutze C ++ und es kommt vor, dass ich verschiedene Klassen mit dem gleichen Namen habe. Dies ist kein Problem, da sie sich in verschiedenen Namespaces befinden.

In anderen Sprachen gibt es keine Möglichkeit, andere Namen anzugeben.

BЈовић
quelle
Für den Computer ist dies kein Problem, für den Entwickler jedoch möglicherweise, da Sie beispielsweise EmailMessage und MailMessage haben.
JSBach
@ Oscar offensichtlich. Für Computer kann es sein xyz123und es funktioniert immer noch gleich. Ich sehe keinen anderen Weg als ausführlich (Sie sagten in den Kommentaren, dass Sie versuchen, dies zu vermeiden).
BЈовић
2

Ihre Frage ist sehr gut. Wie wäre es, wenn Sie Ihrer Methode ein Präfix wie U (oder u) oder cls (kurz für class) voranstellen? Zum Beispiel:

clsEMailMEssage oder uEMailMEssage

Dies erfordert nicht viel Tippen und Sie können sofort erkennen, dass der Typ "Ihr" ist.

Bearbeiten - Als Antwort auf die ersten 2 Kommentare:

Ich möchte den Leser darauf aufmerksam machen, dass: Nicht alle ungarischen Notationen gleich sind. Wir sollten zwischen System Ungarisch und Apps Ungarisch unterscheiden. Ich gehe davon aus, dass der obige Vorschlag dem ungarischen Typ Apps folgt, der nicht schädlich ist.

Der mit der ungarischen Systemnotation verbundene Schaden, z. B. beim Benennen einer ID und einer intID, ist im obigen Vorschlag nicht enthalten.

Weitere Informationen hierzu finden Sie unter: Falschen Code falsch aussehen lassen - Joel On Software

Keine Chance
quelle
3
Jedes Mal, wenn jemand die ungarische Notation empfiehlt, tötet Gott ein Kätzchen.
Konamiman
2
Das BIgHUmpCAmelCAsing hilft auch nicht.
Steven Jeuris
Kommentare oben sind willkommen. Bitte sehen Sie meine Änderungen, obwohl ich weiß, dass einige von uns ihre Meinung nicht ändern werden, schließlich wer möchte, dass ein Kätzchen getötet wird? :)
NoChance
Ich habe die Abwärtsabstimmung entfernt, nachdem Sie eine gültige Begründung hinzugefügt haben. Ich stimme jedoch nicht zu, dass Apps Hungarian in diesem Szenario besser geeignet ist als Namespaces. Wenn die Sprache Aliase unterstützt, ist dies eine weitaus geeignetere Lösung. Siehe die Antwort von Kevin Cline .
Steven Jeuris
@Steven Jeuris, danke für deinen Kommentar. Namespaces sind perfekt, außer dass sie ziemlich lang sind, um weiter zu tippen. Ich werde den von Ihnen angegebenen Link überprüfen.
NoChance