2016-03-03 8 views
7

Dies ist eine Frage, die möglicherweise keine einzige richtige Antwort haben, wie ich weiß, Codierungsstile sind sehr unterschiedlich, vor allem zwischen verschiedenen Sprachen, zB camel case Funktionsnamen in Javascript vs Pascal Gehäuse-Methoden in C#. Das kann ich durchaus akzeptieren.Typoskript Stil Anleitung für Schnittstellen

Vielleicht bin ich über das Sorgen machen, aber ich fange gerade an, in Typoskript zu schauen, wirklich wie die Blicke davon und plane, es zusammen mit Angular2 zu verwenden, und will einen guten Styleguide etablieren.

Was ich wirklich nicht bekomme, ist Punkt 2 here, nicht ich Präfix für Schnittstellen zu verwenden. Bis dahin dachte ich, das wäre fast universell. Ich habe eine Klasse Auto, also einen natürlichen Namen, wenn die Schnittstelle nur ein I davor ist ... ICar. Sobald Sie das I-Präfix sehen, wissen Sie, dass Sie eine Schnittstelle haben.

Ich möchte jede vorgeschlagene Praxis folgen, aber diese ich weiß wirklich nicht, warum zu gehen.

Weiß keiner warum, was ich für eine fast universelle Konvention hielt, wird hier entmutigt? Ich weiß, dass du die Konventionen verwenden kannst, die du magst, und fragst dich, ob es einen Grund dafür gibt, dass diese allgemeine Konvention nicht in Typoskript verwendet wird.

Vielen Dank im Voraus für Meinungen/Infos!

Antwort

10

I als Präfix war irgendwann für Java und C# (wahrscheinlich auch andere) groß, aber ich denke nicht, dass dies immer noch eine gute Idee ist, aber wie kann man etwas ändern, das von den meisten Entwicklern und bestehenden verwendet wird Codebasis.

Es ist ähnlich wie ungarische Notation, die allgemein als schlechte Praxis gilt. Gib ihm einen aussagekräftigen Namen. Wenn Sie verschiedene Arten von Car s als make Car haben, ist die universelle Schnittstelle und class FancyCar implements Car viel natürlicher. Dinge wie Präfixe verhindern nur, dass Menschen darüber nachdenken, was sie wirklich ausdrücken möchten. Siehe auch http://c2.com/cgi/wiki?IntentionRevealingNames

Es gibt auch Sprachen wie Dart (wahrscheinlich viele andere, weiß ich nicht), wo es nicht so eine klare Unterscheidung zwischen interface und class ist. In Dart können Sie jede Klasse implementieren. Die Schnittstelle der Klasse fungiert nur als interface.

Update

Ich sage nicht Namensgebung einfach ist. In der Tat denke ich, dass es die meisten oder zumindest die schwierigsten Teile der Softwareentwicklung sind. Es ist nur so, dass der allgemeine Konsens der "Elite" darin besteht, dass Präfixe aus technischen Gründen nicht der beste Ansatz sind. Dies bedeutet nicht, dass es Alternativen gibt, die nur Vorteile und keine Nachteile haben. Es scheint in diesem Fall Benennung wie UserService, UserServiceImpl, MockUserService stattdessen verwendet wird. Auf diese Weise wird in den meisten Teilen Ihres Codes der natürlichste Weg UserService verwendet und die Derivate nur in Privaten. Ansonsten, wie oben erwähnt, ist Konsistenz viel wichtiger. Wenn in der von Ihnen verwendeten Sprache ein bestimmter Stil häufiger vorkommt, schlage ich vor, dies auch in Ihrem Code zu verwenden.

+1

Danke für das Feedback. Das Argument "FancyCar implementiert Auto" usw. funktioniert, wenn Sie die Schnittstellen aus polymorphen Gründen verwenden, jedoch häufig, z. sagen ein Angular Service, wird es ein Beispiel, z.B. 'FileSystemService',' UserService', und wir können sie alle für eine Schnittstelle implementieren, so dass wir immer die Schnittstelle und nicht die konkrete Klasse in die Dienstverbraucher einspeisen. Dies ermöglicht dann ein einfaches Mocking von Klassen auf die Schnittstelle usw. Dies würde bedeuten, dass Sie an einen alternativen Namen für die Schnittstelle jedes Dienstes denken müssen, anstatt an ein einfaches Präfix (z.B. "IFileSystemService", "IUserService"). – peterc

+0

Nochmals vielen Dank für Ihre Kommentare. Ich nehme an, wir könnten Suffixe anstelle von Präfixen verwenden, aber bis zum Schluss ist es nicht dasselbe?Ich nehme an, wir würden auch 'FileSystemServiceInterface' verwenden. Ich habe schon einige Tutorials mit dem "Ich" in Interfaces gesehen (von hoch angesehenen Autoritäten in dem js Wort), deshalb dachte ich zuerst, dass es ähnlichen Konventionen folgen würde wie Iclass basierte Sprachen wie C# (wo es alles benutzt) die Zeit), und warum überrascht, als ich später den Stilführer sah, und dass es diese eine Konvention so spezifisch anvisierte. Alles zum Nachdenken. – peterc

+0

Ich denke, die Absicht ist, wie in meinem vorherigen Kommentar erwähnt, kein Präfix oder Suffix auf der ** -Schnittstelle ** zu verwenden, da dies normalerweise in der gesamten Anwendung verwendet wird, während der 'UserServiceImpl' wahrscheinlich nur verwendet wird zum Beispiel in einer Fabrik, die eine konkrete Instanz zurückgibt (wenn nicht eine Fabrik, dann wahrscheinlich immer noch nur an sehr wenigen Stellen in Ihrer Anwendung, verglichen mit der Anzahl der Vorkommen der Schnittstelle). –

2

Es gibt keinen Grund, etwas zu tun oder nicht zu tun, außer weil es idiomatisch ist. Wenn Sie möchten, dass Ihr Code passt, folgen Sie den Regeln, die alle anderen in der von Ihnen verwendeten Sprache befolgen, und denken Sie nicht darüber nach (oder wählen Sie eine andere Sprache).

Soweit speziell warum nicht ein Präfix setzen, gibt es drei sehr gute Gründe:

  1. Interfaces implizit erstellt, wenn Sie das class Schlüsselwort verwenden und werden auch erstellt, wenn Sie das type Schlüsselwort verwenden. Wenn Sie Ihren explizit deklarierten Schnittstellen ein Präfix hinzufügen, haben Sie jetzt einige Schnittstellen mit einem Präfix (die Sie selbst mit dem Präfix erstellt haben) plus eine Tonne mehr Schnittstellen ohne Präfix. Dies ist verwirrend und inkonsistent.
  2. Typen (Schnittstellen) und Code sind in unabhängigen Namespaces im Compiler vorhanden, sodass Sie einen Typnamen und einen Variablennamen nicht in Konflikt setzen können. Daher gibt es keinen Grund zu versuchen, Schnittstellennamen durch Voranstellen eindeutig zu machen.
  3. I Präfix ist nur eine andere Form von Systemen ungarische Notation; sagen, ein Typ ist eine Schnittstelle bietet Null zusätzliche Informationen für den Menschen den Code schreiben.
+1

@C Snover Sagt es dem Programmierer nicht, dass sie mit etwas arbeiten, das sich polymorph verhält? – gravidThoughts

+0

Es ist erwähnenswert, dass Microsoft das "I" Präfix in C# ab März 2017 weiterhin empfiehlt: https://docs.microsoft.com/en-us/dotnet/standard/design-guidelines/names-of-classes-structs- and-interfaces –

+0

TypeScript und C# sind nicht dieselbe Sprache, daher haben sie nicht die gleichen Konventionen. Das ist verwirrend, ich weiß. ;) [Die Codierungsrichtlinien von Microsoft für TypeScript selbst] (https://github.com/Microsoft/TypeScript/wiki/Coding-guidelines#names) verbieten das I-Präfix. –

1

Zwei weitere Gründe

Modularisierung Da der Code-Basis wächst, modularisiert der Code beginnt zu werden. Das übliche Konstruktionsziel mit Modulen ist das Freilegen von Verträgen und das Ausblenden der Interna. Verträge werden am besten über Schnittstellen ausgedrückt und nach einer Weile sind die meisten, wenn nicht alle exponierten Artefakte Schnittstellen und Fabriken. Für die Verbraucher dieser Module ist es schöner mit Users s zu arbeiten und Credentials statt IUsers und ICredentials

Alphabetische Reihenfolge Zum Beispiel eines schnellen Zugriff auf Schnittstellen und Klassen in Listen in alphabetischer Reihenfolge in einer Datei Navigator sortieren. Wenn mit Benutzern arbeiten, ist es am besten haben User, UserService und UserImpl in der Liste nebeneinander, statt, obwohl die I Einträge zu gehen, dann sind die C Einträge dann die Service Einträge

+0

Danke dafür. Ich habe mich jetzt daran gewöhnt und stelle jetzt auch fest, dass Interfaces in TypeScript auch etwas allgemeiner sind als in einer Sprache wie C#. – peterc

Verwandte Themen