Es ist mir wichtig, dass meine Syntax andere Entwickler nicht verwirrt.
In diesem Beispiel muss ich wissen, ob ein Parameter ein bestimmter Typ ist.
Ich habe das schon mal getroffen; Was ist der eleganteste und klarste Ansatz, um "nicht ist" zu testen?
Methode 1:
%Vor%Methode 2:
%Vor%Methode 3:
%Vor%Methode 4:
%Vor%[EDIT] Methode 5:
%Vor%Was ist der einfachste Ansatz?
Dies ist offensichtlich eine Frage der persönlichen Meinung und des Stils, also gibt es keine richtige Antwort, aber ich denke, das ist am deutlichsten:
%Vor% Das == false
ist nur mehr offensichtlich als das!
Die Methoden 1 und 3 wären meine Wahl, je nachdem, was ich eigentlich wollte.
Methode 1 "tut etwas" genau dann, wenn das übergebene Objekt nicht vom erwarteten Typ ist. Das bedeutet, dass das übergebene Objekt null sein und trotzdem übergeben werden kann.
Methode 3 "tut etwas", wenn das übergebene Objekt nicht vom erwarteten Typ ist ODER wenn das Objekt null ist. Dies ist im Grunde eine Überprüfung in einem Durchgang, dass Sie eine "gültige" Instanz der Klasse haben, mit der Sie weiterarbeiten können.
Also, ob ich 1 oder 3 wollte, hängt davon ab, was ich vorhatte. Normalerweise, wenn die Variable nicht vom erwarteten Typ ist oder null ist, möchte ich eine Ausnahme auslösen. Wenn ich nur mit einer Art von Ausnahme (sagen wir nur eine ArgumentException) zufrieden wäre, würde ich Methode 3 verwenden. Wenn ich separat nach Null suchen und eine ArgumentNullException werfen wollte, würde ich Methode 1 verwenden und die Nullprüfung hinzufügen.
Methode 2 ist funktional korrekt, aber ich würde lieber die if-Bedingung wie in Methode 1 invertieren, da ein if-Block, der nichts tut, redundant ist.
Ich würde niemals Methode 4 machen. Eine switch-Anweisung, die an die Stelle eines einfachen if-else tritt, ist unnötig und verwirrend, besonders in der Art, wie Sie es benutzen.
Für mich ist Methode 1 die einfachste, sowohl für sich selbst als auch für die Konvention. Dies ist die Syntax, die ich am meisten gesehen habe, wenn Sie nur wissen müssen, ob ein Objekt "ist-eine" bestimmte Klasse ist.
Wenn Sie tatsächlich etwas mit dem Objekt "als-eine" bestimmte Klasse tun müssen, dann ist Methode 3 der Weg zu gehen.
Methode 1 ist meiner Meinung nach die beste. Es ist sehr offensichtlich, was der Code tut und ich kann direkt folgen. Methode 2 führt unnötige Syntax ein, die von Methode 1 leicht korrigiert werden kann. Methode 3 erfordert, dass ich mehr als die anderen zwei (marginal, aber immer noch!) Denke, und es verwendet zusätzlichen Speicherplatz, der nicht benötigt wird.
Erinnern Sie sich, dass der Code für die Benutzer geschrieben wurde und erst danach für die auszuführenden Maschinen. Immer mit Klarheit gehen.
Wenn Sie Eleganz und Lesbarkeit wollen:
%Vor%Ich habe immer mein Bestes versucht, nicht zu viel Logik in eine einzige Codezeile zu schreiben, besonders unter bestimmten Bedingungen. Ich denke, dass der Typcheck- und Negationsoperator auf den ersten Blick störend sein könnte.
Ich würde der Meinung sein, dass die ausgerichtete Funktionalität immer mit dem in Ihrer Anwendung verwendeten Klammermuster übereinstimmen sollte. Zum Beispiel im Fall von Iteration oder bedingten Blöcken, wenn Sie Folgendes verwenden:
%Vor%Nun, das sollte so sein, wie Sie zu jeder Zeit Klammer-gemusterte Funktionalität verwenden. Einer meiner größten Bugbears beim Lesen anderer Leute Code (und das ist besonders wahr, wenn sie CodeRush oder Resharper verwenden) ist die unnötige Knappheit, die Leute aus keinem anderen Grund hinzufügen, als Zauberei zu zeigen.
Ich sage nicht, dass das obige das beste Klammer-Matching-Muster ist, aber benutze das, mit dem du dich wohl fühlst, was ich vermitteln möchte ist, dass das Muster nicht so sehr von Bedeutung ist als die Konsistenz seiner Verwendung.
Da C # eine knappe Sprache im Vergleich zu zB VB.Net ist, würde ich lange form Anweisungen oder Zuweisungen (mit Ausnahme von var initialisierend) über mehr Kondensatsyntax verwenden, um die spätere Lesbarkeit zu unterstützen.
Ich mag einen Ansatz, der von einem der NUnit Assert's verwendet wird:
%Vor%BTW, Wenn Sie eine Reihe von Überprüfungen haben, ob das Objekt einen bestimmten Typ hat, wie:
%Vor%Es sollte einige Design-Probleme geben, wie zum Beispiel die gekoppelte Kopplung zwischen wenigen Typen. Betrachten Sie daher einen anderen Ansatz wie die injizierte Assoziationszuordnung oder die kartenähnliche Algorithmusmethode pro Typ
%Vor%