Wie zu kommen mit klarer Schnittstellen-Namen?
Sah ich in einer Anwendung, wo es eigentlich Schnittstellen wie:
IHasContent
IHasValue
IHasMesh
IHasGeometry
IHasTransformation
Sollte Sie es nicht sein?:
IHaveContent
IHaveValue
...
Oder?:
IIncludeContent
IIncludeValue
...
Ich persönlich bin Neigung in Richtung macht Sie:
IContent
IValue
IMesh
IGeometry
ITransform
Da nicht ISomething
bereits impliziert, dass es hat, dass something
?
Als das Letzte, soll ich es machen ITransformable
statt?
Ich denke, mit I + (Has/Have/Include/Exist, etc) + Name
macht die interface-Namen eher verwirrend.
Irgendwelche Ideen auf, wie zu kommen mit besseren interface-Namen, der nicht unangenehm ist, ist der Punkt, und bekommt die Bedeutung zu vermitteln?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einige dieser Namen (Inhalt, Wert etc.) sind vage, und kaum zu beschreiben Sie den Inhalt/Verhalten eines Elements. Im Allgemeinen sollten die Namen so präzise und deutlich wie möglich - IScriptParameter sein könnte, mehr beschreibende als IValue. Wie Ihr Projekt wächst, mehr beschreibende Namen machen Ihren Typen viel einfacher zu unterscheiden (wenn Sie nicht aufpasst, könnten Sie am Ende mit IValue und INumber und IAmount zu handhaben Varianten der "Werte"!)
Wenn Ihr-Schnittstelle (z.B. IMesh) bedeutet "stellt die Eigenschaften eines mesh", dann IMesh ist ein völlig in Ordnung, Namen - es beschreibt die Tatsache, dass Sie behandeln können das Objekt, als wäre es eine Masche.
Wenn Ihre Schnittstelle verwendet wird, um eine Aktion (zB. zum Rendern das Objekt ein mesh, oder zum anwenden einer Transformation auf das Objekt), dann sollten Sie erwägen, ein verb/Adjektiv sondern als Substantiv benennen (z.B. IRenderable, ITransformable) - dies ist ein gemeinsames Muster in .net (IEnumerable (verb/Adjektiv) sondern als ICollection (Substantiv), zum Beispiel)
Mir, "IHasMesh" klingt eher wie IMeshContainer - d.h. es ist ein Objekt, das enthält ein mesh, und die Schnittstelle, die mir erlaubt, um "das Netz". So würde es mir nicht erlauben, zu handeln oder Abfrage von Daten im Netz, sondern einfach abrufen eines gesamten Mesh-Objekt über die Schnittstelle.
Ich würde also verwenden:
Persönlich mag ich IHas+Wort, weil der name der Schnittstelle beschreibt eine Eigenschaft der Klassen, die diese implementieren.
Zum Beispiel:
Wenn ich lese, dass ich leicht verstehen, dass lolcats haben cheeseburger in Ihnen.
Auf der anderen Seite,
Macht mich Frage mich, ob lolcats HABEN cheeseburger oder SIND cheeseburger (das ist die traditionelle verb verwendet bei der Interpretation der Vererbung).
I
bezieht sich nicht auf PronomenI
ist, sondern nur ein Präfix. Aber ich bin nicht sicher, ob das allgemein akzeptiert.I
als das Pronomen.I
ist die Abkürzung für "Interface", und es verwendet zu unterscheiden sind Schnittstellen, die von regulären Klassen (siehe msdn.microsoft.com/en-us/library/8bc1fexb(v=vs. 71).aspx)Das erste, was Sie verstehen müssen, ist, dass das "ich" in den ersten Namen bezieht sich nicht auf das Pronomen "ich", sondern vielmehr folgt die Benennung standard, der Schnittstellen beginnen mit dem Großbuchstaben "I"
In diesem Sinne sind die Schnittstellen tatsächlich mit dem Namen "HasContent," "HasValue", usw, also nicht ändern, um "HaveContent" und "HaveValue", als wäre das nur so peinlich.
Mit, dass gesagt wird, ich kann es nicht genau sehen, was diese Schnittstellen eingesetzt werden. Eine Schnittstelle (per definition) bestimmt ist, zu zwingen, eine Bedingung auf alle Klassen, die es implementieren, und ich bin mir nicht sicher, was diese Schnittstellen erzwingen-alle Klassen haben eine Funktion namens
HasContent()
?Ich denke, man sollte stattdessen den Fokus auf die Schnittstellen mit einem
is a
Beziehung. Wenn Sie deklarieren Sie eine Klasse, die die Schnittstelle implementiertIList
Sie sind nicht impliziert, dass Ihre Klasse hat eine Liste, sondern vielmehr, dass Ihre Klasse ist ein Liste.Also zum Beispiel, einer von Ihnen ist
IHasGeometry
...naja, das gibt mir die Möglichkeit zu überprüfen, ob es die geometrie, aber ich würde realistischerweise nur zu tun haben wollen, mit Figuren, die sind geometrischen Figuren, so würde ich erstellen Sie eine Schnittstelle namensIGeometricFigure
statt, so schränkte Ihre Verwendung auf alles, was arbeitet, die auf geometrischen Figuren.Ich bin damit einverstanden, dass die Namen komisch, aber ich denke, dass ist mehr, weil diese interfaces verwendet werden für eine peinliche Zweck, nicht weil Sie falsch benannt.
Ihre erste Liste von interface-Namen sound genau das richtige. Eine Schnittstelle, name sollte beschreiben, den Vertrag. Dies ist ein Beispiel für eine Schnittstelle, die ich lief über vor kurzem, dass ich ganz gerne:
Perfekt! Der name sagt alles. Das "ich" bezieht sich auf die Tatsache, dass es ist eine Schnittstelle, und der rest beschreibt was den Vertrag erfüllen wird.
Wenn die Schnittstelle aufgerufen wurde
IEmptyValue
es bedeuten würde, die Schnittstelle wird gewährleistet, dass die Durchführung der leere Wert IST. Es ist nicht - es hat die Fähigkeit zu bestimmen, ob ein Wert leer ist.(Wahrscheinlich) keine Klasse aufgerufen werden würde
DeterminesEmptyValue
. Aber es könnte tausend Klassen, die alle die Fähigkeit haben, zu bestimmen, ob verschiedene Arten von Werten, die leer sind, und diese Schnittstelle können Sie alle genannt werden, die in einem gemeinsamen Weg.Die Schnittstelle sollte klar beschrieben werden, für eine bestimmte Beschaffenheit von Klassen, die es implementieren. Im Fall von
IContent
- tun der Praktiker HABEN Inhalt, oder der Implementierer SIND Inhalt?class DeterminesEmptyValue
, richtig?DeterminesEmptyValue
, aber es könnte tausend Klassen, die alle die Fähigkeit haben, zu bestimmen, ob verschiedene Arten von Werten, die leer sind, und diese Schnittstelle können Sie alle genannt werden, die in einem gemeinsamen Weg.Ich mag zu denken, dass
ISomething
bedeutet, dass es ist Etwas, wie in spielen die Rolle von etwas, sondern als das, es 'hat' oder 'enthält' Etwas. AlsoIFather
bedeutet "ich Spiele eine Rolle des Vater', oder ich bin Vater'.IDispatcher
bedeutet "ich Spiele eine Rolle von Dispatcher "oder" ich bin Dispatcher', etc.Einige Leute nennen wollen-Schnittstellen, eine Frage zu beantworten " was mache ich?' :
IListenForEvents
,ILogExceptions
. Wie in diesem postIEventListener
,IEventLogger
Schnittstellen sind für viele Zwecke verwendet, die mit verschiedenen verworren Namenskonventionen. Bevor Sie sich Gedanken über Namen, ist es wahrscheinlich eine gute zuerst entscheiden, wie zu trennen Funktionalität. Microsoft Sammlungen, die haben leider zu wenige unterschiedliche Schnittstellen, die größten Auslassungen wird IReadableList und IAppendable, die beide vererbt werden könnte, die von IList, aber die Unterstützung Kontravarianz und Kovarianz-support [man könnte also passieren IList(Cat) code erwartet eine IReadableList(von Tieren) oder ein IAppendable(Von SiameseCat)]. Auf der anderen Seite, es ist auch möglich, split Dinge zu fein, so dass jede nützliche Klasse zu implementieren hat Dutzende von Schnittstellen.
Ohne zu wissen, welche Arten von Funktionen verwendet wurden, die in der Anwendung und Schnittstellen, es ist schwer zu sagen, ob Sie entworfen wurden, mit einem guten Niveau der Granularität. Es klingt wie Sie sind zu fein unterteilt, aber ich kann nicht wirklich sagen. Sobald die Funktionalität gruppiert entsprechend, dann macht es Sinn, sich Gedanken über die Namen.
Dem "ich" stand nicht für "mich". Es steht einfach nur für die Schnittstelle.
Aber Microsoft hat seine eigene Richtlinien für die Benennung von Schnittstellen.