Ich habe den Begriff Schlumpfnamen von hier gezogen (Nummer 21). Um jedem zu ersparen, der nicht mit den Problemen vertraut ist, wird beim Benennen von Schlümpfen eine Reihe verwandter Klassen, Variablen usw. mit einem gemeinsamen Präfix vorangestellt, sodass am Ende "a SmurfAccountView
geht a SmurfAccountDTO
an die SmurfAccountController
" usw. angezeigt werden.
Die Lösung, die ich bisher gehört habe, besteht darin, einen Schlumpf-Namespace zu erstellen und die Schlumpf-Präfixe zu löschen. Das hat mir im Allgemeinen gute Dienste geleistet, aber ich habe zwei Probleme.
Ich arbeite mit einer Bibliothek mit einer
Configuration
Klasse. Es hätte aufgerufen werden können,WartmongerConfiguration
aber es befindet sich im Wartmonger-Namespace. Es wird also nur aufgerufenConfiguration
. Ich habe ebenfalls eineConfiguration
Klasse, die aufgerufen werden könnteSmurfConfiguration
, aber sie befindet sich im Schlumpf-Namespace, sodass sie überflüssig wäre. Es gibt Stellen in meinem Code, an denenSmurf.Configuration
nebeneinander angezeigt wirdWartmonger.Configuration
und die Eingabe von vollständig qualifizierten Namen klobig ist und den Code weniger lesbar macht. Es wäre schöner, mit einemSmurfConfiguration
und umzugehen (wenn es mein Code und keine Bibliothek wäre)WartmongerConfiguration
.Service
In meinem Smurf-Namespace befindet sich eine Klasse, die aufgerufen werden könnteSmurfService
.Service
ist eine Fassade auf einer komplexen Schlumpfbibliothek, in der Schlumpfjobs ausgeführt werden.SmurfService
scheint ein besserer Name zu sein, dennService
ohne das Smurf-Präfix ist das so unglaublich generisch. Ich kann akzeptieren, dass diesSmurfService
bereits ein generischer, unbrauchbarer Name war, und das Entfernen von Schlumpf machte dies nur deutlicher. Aber es hätte benannt werdenRunner
könnenLauncher
, usw. und es würde sich für mich immer noch "besser anfühlen",SmurfLauncher
weil ich nicht weiß, was einLauncher
tut, aber ich weiß, was einSmurfLauncher
tut. Man könnte argumentieren, dass das, was einSmurf.Launcher
tut, genauso offensichtlich sein sollte wie einSmurf.SmurfLauncher
, aber ich konnte sehen, dass `Smurf.Launcher eine Art Klasse ist, die sich eher auf Setup bezieht als auf eine Klasse, die Schlümpfe startet.
Wenn es einen offenen und geschlossenen Weg gibt, mit beiden umzugehen, wäre das großartig. Wenn nicht, was sind einige gängige Praktiken, um ihre Belästigung zu lindern?
quelle
Smurf.Launcher
Schlümpfe oder startet esSmurfJob
s? Vielleicht könnte es aufgerufen werdenSmurf.JobLauncher
?SmurfJob
s oder führt sie technisch aus, um mit der Sprache der Schlumpfdokumentation übereinzustimmen. In Anbetracht dessen, und die anderen Antworten, ich werde umbenennenSmurfService
zuSmurfJobRunner
. Es scheint, dass Nummer 1 keine sprachenunabhängige beste Auflösung hat, wie ich erwartet hatte. Ich kann Fälle sehen, in denen das MitgehenSmurfConfiguration
der richtige Anruf wäre, aber in meinem Fall denke ich,Configuration
ist es das Beste, selbst mit dem Ärger vonWartmonger.Configuration
.Smurf.Configuration
undSmurfConfiguration
fühlen sich anders an ? Sicherlich ist es nicht der Sonderpreis, oder? (Kürzen auf,Config
wenn die Länge das Problem ist.) GibtSmurf.Configuration
es Probleme, bei denenSmurfConfiguration
dies nicht der Fall ist?Antworten:
Sie sprechen einige gute Punkte an.
Im Hinblick auf doppelte Klassen können Sie Klassen in C # aliasen. Verwenden Sie zum Beispiel
using ColorScheme = The.Fully.Qualified.Namespace.Outlook2007ColorScheme;
Siehe diesen Beitrag auf StackOverflow . Sie haben Ihre Programmiersprache nicht angegeben, aber ich habe sie dem entnommen, was Sie geschrieben haben. Also , wo man mit zwei verschiedenen Projekten zu tun haben, können Sie alias sie alsSmurfConfiguration
undWartmongerConfiguration
die würde Zweideutigkeit freizugeben, wenn beide Klassen raubend.Da ein Dienst externen Anwendungen ausgesetzt ist, sehe ich kein Problem darin, den Dienst mit Ihrem Anwendungsnamen zu kennzeichnen. In diesem Fall
SmurfService
wäre dies gültig, da dadurch tatsächlich Gruppen von Diensten in der konsumierenden Anwendung unterschieden werden.Ich bin der Meinung, dass Namespaces verwendet werden sollten, um diese Art der Benennung zu vermeiden. Dadurch wird es schwieriger, den Code zu durchsuchen und zu erkennen, was eine Klasse ist, ohne MyCompanyMyProductMyAreaClassName zu lesen. Mit der Aliasing-Technik können Sie Mehrdeutigkeiten bei Bedarf reduzieren. Das einzige Mal, wenn Sie Ihrer Namensgebung Komplexität verleihen sollten, ist, wie ich bereits in Nr. 2 dargelegt habe, wann die Leute einen Dienst in Anspruch nehmen werden. Hier ist es sinnvoll, diese Art der Benennung zu verwenden, da die Mehrdeutigkeit verwirrend sein kann, wenn der Verbraucher über eine Vielzahl von Diensten verfügt, die er verbraucht.
quelle
org.apache.smurfville.wartmonger.configuration
. Dies schließt leider Aliase aus. 2 ist ein solider Punkt, deshalb werde ich das Schlumpf-Branding für den Service beibehalten.Der Sinn von Namespaces ist, dass Sie Klassen mit demselben Namen aus verschiedenen Bibliotheken haben können, ohne dass sie kollidieren. Wenn Sie dieselbe benannte Klasse von beiden verwenden müssen, müssen Sie die Mehrdeutigkeit beseitigen, indem Sie einer oder beiden den Namespace-Bereich voranstellen.
Das heißt, es ist nicht wirklich schlimm, eine Reihe von Schlumpfklassen zu haben, wenn Schlumpf Ihnen etwas Bestimmtes über die Klasse sagt. Die Klassennamen sollten so aussagekräftig sein, dass Sie einige Informationen über die Funktionsweise der Klasse erhalten.
Ebenso
DBSession
könnte einDBRequest
Objekt nehmen, das ein Objekt zurückgibtDBResponse
. DasHttpSession
könnte auch aufHttpRequest
undHttpResponse
Objekte wirken.Dies sind Schlumpfklassen mit einem Zweck.
Sie könnten in dem Live -
MyCompany
Namespace aberMyCompanyHttpSession
undMyCompanyDBSession
nicht geben Ihnen mehr Informationen , als Sie zuvor. In diesem Fall löschen Sie den Schlumpf und machen ihn zu einem Namespace.quelle
Ich bin schon einmal auf diesen Punkt der Verwirrung gestoßen und es ist normalerweise eine Frage, ob wir die Art von Dingen, die es ist, als Teil seines Namens einbeziehen.
Sie erwähnen
SmurfConfiguration
undWartmongerConfiguration
als mögliche Arten von Konfigurationen. Sie geben an, dass Sie das Adjektiv (seine Art) in seinem Namespace entfernt haben, sodass nur noch die Vanille übrig bleibtConfiguration
. Das würde ich vermeiden.Es ist, als würde man entscheiden, dass Erdbeereis nur Eis im Erdbeer-Namensraum und ebenfalls mit Schokolade ist, aber was passiert ist, ist, dass Sie das Adjektiv, das ihm seine Identität verleiht, von der Sache selbst getrennt haben. Es ist kein Eis in der Kategorie Erdbeeren. Es ist Erdbeereis - eine Art Eis.
Stellen wir uns vor, Sie importieren die
Strawberry.IceCream
Klasse in Ihre App und beginnen direkt mit der InstanziierungIceCream
.Dies mag gut und schön erscheinen, bis Sie am Ende eine andere
IceCream
Klasse importieren . Jetzt kehren Sie zu dem ursprünglichen Problem zurück, sie irgendwie unterscheiden zu müssen, was problematisch ist. Was Sie die ganze Zeit wollten, war:Namespaces sollten besser belassen werden, um potenzielle Konflikte zwischen Drittanbietern zu vermeiden, die möglicherweise in ihren Bibliotheken die gleichen Konzepte verwenden. Wenn ein Entwickler jedoch eine Bibliothek oder ein Projekt erstellt, sollte er jedes Konzept eindeutig benennen und Namespaces nur als Ordner für die Organisation verwenden. Oft wird der Name des Ordners im Namen der von ihm organisierten Konzepte gefunden, und das ist in Ordnung.
quelle
Es ist auf jeden Fall eine gute Faustregel, dass Klassen, die ein gemeinsames Präfix für eine Reihe von Klassen haben, es wahrscheinlich verdienen, in ihrem eigenen Namespace zu arbeiten. Um das Problem zu lösen, wenn Sie Klassen mit ähnlichen Namen aus zwei Namespaces verwenden müssen:
1) Alias die Namespaces, obwohl ich es kurz und bündig machen würde, jede natürliche Abkürzung, vielleicht sogar nur 1 Buchstabe:
Dann immer Präfix verwenden und Instanzen entsprechend benennen:
2) Alias der Klasse, wie in einer anderen Antwort vorgeschlagen.
3) Jede Bibliothek, über die Sie die Kontrolle haben, sollte den Begriff "Konfiguration" nicht verwenden. Verwenden Sie den Thesaurus: zB 'Einstellungen', 'Modell', 'Parameter'. Könnte für den Kontext sowieso aussagekräftiger sein: Wenn Smurf beispielsweise eine Art numerisches Analysemodul wäre, das Sie geschrieben haben, wäre 'Parameters' möglicherweise besser für die Konfiguration. Verwenden Sie das spezielle Vokabular, das mit dem Kontext eines Moduls verknüpft ist, zu Ihrem Vorteil, um eindeutige Namen zu erhalten, die auch dann eindeutig sind, wenn sie in andere Namespaces gemischt werden. Ich denke, dies könnte eine Art Antwort auf die OP-Frage 2 sein.
4) Refactor-Code, damit Sie die Verwendung der Konfiguration nicht an zwei verschiedenen Stellen mischen müssen. Details dazu liegen bei Ihnen.
5) Kombinieren Sie die beiden Konfigurationen zu einer, bevor Sie sie an Ihre Klasse übergeben. Verwenden Sie eine kombinierte conf-Klasse, um Folgendes darzustellen:
Die kurzen Mitgliedsvariablennamen erreichen jetzt das Gleiche wie das Aliasing der Klasse / des Namespaces.
quelle
Scheint seltsam, dass das Hinzufügen eines Punktes zum Namen Sie stört.
Wenn beide
Smurf
undWartmonger
Konfigurationen an einem Ort zusammen verwendet werden, sie jedoch getrennt an mehreren Orten verwendet werden, ist der Namespace auf jeden Fall ein guter Ansatz.Wenn Sie über einen Namespace verfügen, können Sie im internen Code "saubere" Namen verwenden. Bei Präfixen wird der interne Code von
SmurfConfiguration
insideSmurfService
verwendet, was jedes Mal ärgerlich sein kann, wenn Sie diesen Code öffnen.quelle