Warum Präfix C# - interface-Namen mit einem "I"
Was ist die Logik hinter dieser Konvention?
Sehe ich keinen Vorteil. Das zusätzliche Präfix nur verpestet die API.
Mein denken ist inline mit Konrad ' s Antwort diesem Zusammenhang Frage; der gewählte Antwort von denen ist meist das, was ich Frage für hier.
- Ich sehe zwei Stimmen zu schließen---aber ich bin nicht überzeugt, es ist wirklich genau das doppelte von dem verlangen nach alternativen. Wenn jemand mich überzeugen, werde ich die Abstimmung zu schließen. (Hinterlassen Sie bitte einen Kommentar.)
- Nicht dupliziert, und tatsächlich eine gute Frage.
- Nicht ein Duplikat ist, doch Jon Limjap scheint anders zu denken. Was kann ich tun?
- Es war nicht nur Jon Limjap. 3 Leute haben sich für ihn zu Stimmen, er war nur in der 3rd-person, dies zu tun.
- Vielen Dank für die Klarstellung. Ist es möglich, darüber abzustimmen, unclose es? Wäre hilfreich, wenn ein link, der das vermeintliche Duplikat wurde zur Verfügung gestellt durch die Wähler.
- Ja, die Benutzer können abstimmen, zu öffnen. Es dauert 3 Benutzer Stimmen zu erneut eine Frage. Derzeit ein Benutzer hat gewählt, so zu tun, also braucht es zwei mehr.
- Sie haben auch eine bestimmte rep Niveau zu tun, Niveau sollte in die FAQ (3k rep)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Seine das komplette Gegenteil, die Namenskonvention eindeutig identifiziert eine Schnittstelle.
Zum Beispiel, wenn Sie haben:
Nur vom Lesen, kann ich sicher davon ausgehen, dass IPet und IMammal sind wahrscheinlich die Schnittstellen.
Den .NET CLR erlaubt einzelne Klasse die Vererbung. Also, wenn ich eine Basis Klasse..kann ich nur erbt eine Klasse von ihm. Ermöglicht das ändern der IPet-Schnittstelle, um eine Basis Klasse..unser Beispiel wird nun
Ich bin Erben von der Pet-Klasse und der Umsetzung der IMammal-Schnittstelle.
Wenn wir es Taten, was Sie vorschlagen, und entfernt die Buchstaben "I" haben wir dies:
Welches ist das Klasse ich bin mit Vererbung aus? Das ist die Schnittstelle, ich die Umsetzung? Es wird verwirrend, richtig? (Zur info..Sie soll die Basisklasse immer zuerst, so könnte man argumentieren, dass Punkt...aber wenn Sie sich streiten, entfernen Sie den Buchstaben I aus, indem interface-Namen, ich bezweifle, dass Sie zu Folgen, dass die Praxis so gut)
Wie Sie sehen können, dass die Namenskonvention leicht erzählt mir viel über mein Objekt, ohne dass ich das weiter untersuchen. Ich kann leicht sehen, was ich Erben vs, was ich die Umsetzung.
historical reasons
und (laut Brad Abrams), dass es eineclear recognition of the influence of COM (and Java) on the .NET Framework
und die Entscheidung, es zu tragen, nach vorne war, weil so viele "early adopters" des .NET Frameworkwere already familiar with COM
. (Siehe diese Antwort für die ausführlichere Zitate. stackoverflow.com/questions/222457/...)Base class 'xyz' must come before any interfaces
. Dies sollte nicht so verstanden werden, dass ich dagegen bin mit "I" als Präfix. Unter anderem, es ist schön, eine visuelle Anzeige, wie die interface-y mein code ist oder nicht.Außerdem mag ich es, denn ich kann es Lesen als "ich-verb-Verhalten" wie in "ICanSave" oder "IDoDoubleEntry" etc...
ICanSave
sollteISaveble
.ISaveble
oderI[Am]Saveble
bedeutet dasselbe wieICanSave
. In der Tat, meine Art des Denkens über Schnittstellen, es ist näher an der realen Bedeutung. Schnittstellen sind Möglichkeiten, um zu deklarieren, um dem compiler, einen Typ (Klasse oder struct), implementiert eine bestimmte Gruppe von Verhaltensweisen, d.h., es zwingt den compiler zu verlangen, die der Typ implementiert das Verhalten in der Schnittstelle definiert. also, für mich, eine verb-phrase, mit der Erklärung, dass der Typ nicht etwas ist besser geeignet.IClonable
,IDisposable
, undIComparable
und nichtICanClone
,ICanDispose
oderICanCompare
.Ich denke, dass die IInterface Namenskonvention ist albern. Es ist ein Beispiel die Ungarische notation, und ich schließe mich der Schule des Denkens, verachtet die Ungarische notation. Wenn Sie ein interface mit nur einer Implementierung, die den gleichen Namen hat, die Möglichkeit in Betracht ziehen, dass dies ein code smell.
Jedoch, ich noch verwenden es, weil in diesem Fall IInterface ist von Microsoft empfohlen, und "- standard ist besser als besser".
Warum ist das nicht eine Funktion der syntaktischen Hervorhebung, anstatt die Ungarische notation? Warum nicht die IDE nur Kursiv darstellen Bezeichner für interfaces, wenn es so wichtig zu unterscheiden zwischen Klassen und interfaces. Ich hasse setzen "" oder "m", bevor die Felder "C" vor den Klassen, etc. Schlimmer noch, es fördert die Programmierer schreiben wirklich schlechte APIs wie:
statt einer vernünftigen:
Selbst .NET-Allgemeine Klasse Autoren fiel in diese Falle. Der name einer Klasse sollte NIEMALS der name der Schnittstelle, die nur mit dem "ich" entfernt. Der name der Klasse sollte immer dem Benutzer mitteilen, wie die Klasse unterscheidet sich von anderen Implementierungen des interface(s). Ich vote für dropping das dumme "ich" allein aus diesem Grund.
Auch, wenn ich intellisense verwenden, möchte ich der Gruppe Dinge, die durch den funktionalen Bereich, und nicht, ob es eine Klasse oder ein interface. Ich denke nie, "ich brauche ein interface, keine Klasse." Ich denke immer, "ich brauche etwas, dass X".
MyReallySpecificBusinessComponent
undIMyReallySpecificBusinessComponent
wäre Ok. Aber definitiv nichtList
.Java
es richtig?Eigentlich finde ich es sinnvoll, zu vermeiden, benennen Auseinandersetzungen, könnte ich zum Beispiel erstellen Sie eine konkrete Klasse genannt Fred, die IFred
Ich immer dachte, es war lustig, die Verwendung von Verben für Verhaltens-Schnittstellen. Dies ist eine Abkehr von der Klasse naming convention von Hauptwörtern, sondern es ermöglicht auch die Klasse, um "sprechen" zu seinem Verhalten.
Dies funktioniert nicht gut für strukturelle Schnittstellen wie WCF Schnittstellen, aber wir brauchen Sie nicht, um Spaß zu haben die ganze Zeit.
Ihre Frage zu beantworten, denken Sie an die
I
als "implementiert" So...diese service-Klasse erbt von
Dog
und implementiertIDataService
Bin ich noch nicht wirklich, deine Frage zu beantworten, aber die
I
ist nützlich, weil Sie Namenskonflikte zwischen namespace, Klasse und Schnittstelle.so dass wir am Ende mit
Ich denke, in der Realität, es ist ein Vernunft-Konvention.
Wenn man die zwei "best-practice-Aphorismen"
Klarheit ist König
und
Lärm ist schlecht
gibt es einen Konflikt zwischen diesen. Die Frage ist: Wann beginnt Klarheit geworden für ein Lärm?
Für mich ist es eher laut (aber ebenso klar) zu schreiben
Person person = new PersonImpl()
alsIPerson person = new Person()
.Es ist entweder das, oder fügen Sie "Impl", um die Implementierung der Schnittstelle (argh). Ich habe nicht ein problem mit dem "ich", es ist die einfachste und direkteste Namensgebung für eine Schnittstelle.
Den "ich" - convention zu sein scheint, eine alte Konvention, dass wäre nicht relevant heute. Aktuelle code-editor bietet viele Einblicke über die Art, die Sie verwenden, so zu streiten, dass Es einfacher ist, zu identifizieren, die Schnittstelle ist wie zu Fragen, für ein Namensraum-Präfix durch ein "N", weil Sie wollen sicher sein, dass Sie nicht zu verwechseln mit einer konkreten Klasse (Präfix mit einem "C"?).
Eines übereinkommens bedeutet nicht, dass Es eine gute Konvention. Manchmal ist Es nur, weil die Menschen bekommen, um es zu benutzen...
Nehmen Sie zum Beispiel die C# - Dokumentation-generator: Es kümmert sich nicht um ihn... wenn dein interface ist nicht das Präfix mit einem "ich" noch sehen Sie Ihre Schnittstelle in der interface-Teil Ihrer Dokumentation. Glaubst du wirklich, dass ein Präfix "I" für alle Ihre Schnittstellen im interface-Abschnitt der Dokumentation ist ein relevanter Informationen und helfen Ihnen, besser zu identifizieren, Schnittstellen?
Macht es leicht erkennbar als eine Schnittstelle.
Die Notwendigkeit, zu unterscheiden zwischen einem interface und einer Klasse tatsächlich gibt ein Designfehler. In eine gut gestaltete Anwendung, es wird immer klar sein. Eine Unterklasse sollte immer eine Spezialisierung und Klassen können nur spezialisiert auf ein Thema, nie mehr.
Einer Klasse sollte aus einem einzigen Grund für die Existenz. Es sollte niemals erforderlich, um sekundäre Funktionen in einer Basisklasse. E. g.:
Die erste ist eine Konfigurationsdatei, die sich in Xml -, das zweite ist spezialisiert auf Yaml. Auch diese sind Einweg, aber das spielt keine Rolle, so viel. Sie nicht erstellen Sie diese beiden Klassen, da der eine andere Entsorgung Prozesse.
Kontrastieren diese mit:
Dies wird Ihnen sagen, dass der wichtigste Zweck einer XmlConfigurationFile hat, ist, dass es Einweg. Sie können es verwenden, als eine Möglichkeit dar Konfigurationsdateien ist schön, aber ist zweitrangig.
Das problem beginnt, wenn Sie Klassen erstellen, die mehrere Gründe für seine Existenz:
Selbst wenn XmlConfigurationFile und YamlConfigurationFile hätte Schnittstellen, die es noch gibt schlechtes design. Wie können Sie Ihre Konfigurations-Datei werden Xml und Yaml zur gleichen Zeit?
Wenn Sie Lesen, durch die Beispiele gegeben (hier und anderswo), die Menschen immer kämpfen, um ein gutes Beispiel finden, wenn das I-Präfix Angelegenheiten. Eine der Antworten ist hier:
Dies ist, wie diese Klasse Aussehen wird, eine Anwendung über Haustiere. Ein Hund ist Hauptzweck ist als spezialisierter Haustier, das Haustier-bezogene Dinge, nicht, dass es ein säugetier.
Dies ist, wie die gleiche Klasse in einer Anwendung, die über Tier-Klassifizierungen. Es ist schön zu wissen, ein Hund ist ein Haustier, aber es ist Hauptzweck ist als spezialisierter säugetier, das säugetier-Verwandte Dinge.
Ich denke die Klassen sollten Ihnen sagen, die richtige Geschichte über die Architektur und die Domäne Ihrer Anwendung. Die eine Schnittstelle sein, die mit dem Präfix " I " ist eine technische Anforderung und hilft Ihnen nicht zu sagen, Ihre Anwendung Geschichte besser.
Sobald Sie zu schreiben beginnen, kleine, dedizierte, einzelne-Zweck-Klassen, die Notwendigkeit zu wissen, ob es implementiert oder erweitert wird automatisch verschwinden.
Namenskonventionen bieten den Vorteil, erzählen Sie etwas über das Objekt, bevor Sie es verwenden. Namenskonventionen wurden Häufig verwendet, für viele Jahre, gehen den ganzen Weg zurück zu fortran beharren darauf, dass integer-Werte beschränkt (wenn ich mich richtig erinnere), um Variablennamen wie "i" und "j".
Hungariation notation nahm Namenskonventionen auf eine ganz neue hässliche Stufe tha beschrieben die variable Art, ob oder nicht es war ein Zeiger, etc. Viele von uns, die ausgesetzt wurden, die zu viel code ist mit der ungarischen notation entwickelt, nervöse Zuckungen und verbalen stottert.
Präfix interface-Namen mit ich ist ein relativ low-impact -, Harmlose Art und Weise der Ermittlung dieses Objekt.
TL;DR - Extraktion
interface IFoo
ausclass Foo
ist üblich in SOLIDEN Entkopplung, insbesondere für Unit-Tests ZweckeMir die dual-Konvention der Klasse
Foo
Implementierung der SchnittstelleIFoo
(vor allem, wenn beide in der gleichen assembly) vermittelt eine bestimmte Absicht, dass:Foo
sollte immer indirekt sein, durch die entsprechendenIFoo
- interface (und wahrscheinlich injiziert über einen IoC container)IFoo
ist eine proprietäre, nicht-wiederverwendbare Schnittstelle, die speziell zu ermöglichen Klassen abhängigFoo
zu verspotten, sich diese Abhängigkeit bei unit Tests.IFoo
SchnittstelleIFoo
sind erforderlich, zu einem späteren Zeitpunkt, dass eine entsprechende interface-segregation-design müssen nachgerüstet werden, die in der Hierarchie.Begründung
Um der Lage sein, zu Verspotten oder Stub, eine Klasse, eine allgemein akzeptierte best practice in Unit-Tests ist zu entkoppeln von Abhängigkeiten zwischen Schichten nur über Schnittstellen. Diese Schnittstelle Entkopplung wird auch getan werden, um Klassen, die sonst hatte nie eine design-Anforderung für polymorphicism (D. H. nur eine solche Umsetzung bestanden hätte, gäbe es nicht die Notwendigkeit für unit-Tests).
Als Folge der Umgestaltung und wiederverwertung von diesen Schnittstellen (z.B. die Interface Segregation Prinzip der
SOLID
) ist nicht Häufig angewendet, um zu solchen 'mockable' Schnittstellen - es ist oft eine 1:1 Korrelation zwischen den öffentlichen Methoden, Eigenschaften und Ereignisse einer 'mockable' Klasse (Foo
) und seine entkoppelte SchnittstelleIFoo
(ähnlich dem COM-ära automatische Schnittstellen in VB).Tools wie VS und Resharper machen kann extrahieren solche öffentlichen Symbole aus einer Klasse in eine separate Schnittstelle trivial, wie ein nachträglicher Einfall.
Weiter, wenn wir Bedenken, dass Mocking-frameworks wie Moq, erlauben definition von Implementierungen der Schnittstelle on-the-fly, wir müssen nicht überflüssige Mühe, die Benennung der konkreten test-Doppel-Umsetzung Klasse.
Es ist einfach eine Namenskonvention, so dass jeder würde wissen, ob es ein interface oder sonst etwas, es ist nicht zwingend, noch durch den compiler, noch durch die IDE aber Alle Schnittstellen, die ich sah in meinem ganzen Leben beginnt mit dem Brief, den ich
Ich scheint die traditionellen Konventionen aus der ungarischen Notation.
Interface-Richtlinien Zur Benennung sagt "Präfix interface-Namen, die mit den Buchstaben I, um anzugeben, dass der Typ eine Schnittstelle."
Framework Design Guidelines auch sagt: "MACH Präfix interface-Namen, die mit den Buchstaben I, um anzugeben, dass der Typ eine Schnittstelle."
Es ist nur ein coding-Konvention, So ist es schwer zu bestimmen, gut oder schlecht.
Wichtige Dinge, ist die Konsistenz.
Erstens glaube ich voranstellen ich dann die Beschreibung falsch ist, weil es bedeutet, dass Implementierungen können eine kürzere Namen. IList (intf) -> Liste. Dies ist ein anti-pattern, wie wir alle wissen, wir sollten mit intf und wahrscheinlich nur konkrete Typen beim erstellen. Don ' T flame me dies ist eine Verallgemeinerung, aber die Prämisse ist intf impl nur selten. Die Umsetzung name sollte beschreiben, wie es die Umsetzung des intf oder was es tut. Denke intf List, LinkedList implementiert die Liste mit einer verlinkten Liste. Wer kümmert sich, wenn es länger als wir sollten mit Liste die meisten der Zeit. Wenn wir eine Klasse die viele intf wir sollten wohl nicht alle intf als die Schatten, die der eigentliche Zweck der Klasse. IN dem Fall, dass etwas entfernt werden, ohne die intf Sinn macht. ZB ppl nennen mich beim Namen, nicht die Person, Geschwister, Entwickler etc mit meinem Namen ist das beste, die meisten beschreibenden Namen. Ich nehme an, wenn eine Klasse impl eine einfache intf dann rufen Sie Default Intf das es auf ious dies ist die default-Implementierung des Intf.
Namen von Klassen sollten in das Ende sein, von Menschen lesbar und fast ein kurzer Satz beschreibt deren Zweck. Präfix-codes etc sind nicht toll, wie wir kommunizieren mit Worten, nicht codes. - Computer-t-interessieren, welche Klassen genannt werden, warum also bleibt, ist, dass wir die Dinge nennen, also die Namen helfen uns und unseren Kollegen.
Wahrscheinlich sein, damit es leicht erkennbar in intellisense, da alle Schnittstellen zu Klumpen zusammen. Ähnlich wie ich Präfix alle meine UI-Steuerelemente mit btn, tb, lb. Wenn intellisense-kicks ist alles verklumpt zusammen in eine einfache Gruppe.
Mit all der Argumente über die Namenskonventionen und geben die korrekten Namen für Variablen und Methoden, die tatsächlich beschreiben, was Sie tun...warum nicht einfach die Namen Ihrer interfaces (z.B. PetInterface, PlayerInterface, etc.) und tun, Weg mit dem Präfix "I" alle zusammen. Also, was Sie haben zu geben, eine zusätzliche 9 Buchstaben, zumindest das "ich" wird entfernt, und wir wissen, es ist nicht eine Klasse, weil es sagt "Schnittstelle".