Sollten wir immer zugunsten Polymorphismus über enums?
Nachdem gerade: Die Clean Code Talks -- Vererbung, Polymorphismus, & Tests
Ich habe meine code und bemerkte ein paar switch-Anweisungen umgestaltet werden kann in Polymorphismus, aber ich habe auch bemerkt, dass ich nur benutzt, switch-Anweisungen mit enums. Bedeutet das, dass enums sind "böse" in OO-design und sollten beseitigt werden, mit Polymorphismus?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist nicht so, dass Enumerationen, die böse sind, ist switch-Anweisungen. Es gibt eine lange Diskussion über diese in der C++ - FAQ-Buch, aber das wesentliche ist: außer für die begrenzten Bereichen --- zum Beispiel die interpretation von Daten aus einem register auf ein Gerät -zu-einer großen-Schalter Kamm deutet darauf hin, dass man anhand von Daten zu unterscheiden Subtypen. Anstelle von, dass, sollten Sie gerade verwenden die Subtypen, um die compiler-Hilfe, um es zu korrigieren, und auch die Bedeutung, die der compiler automatisch hinzufügen neuer Fälle, wenn man (zwangsläufig) ändern Sie die Menge von Fällen.
Zunächst Java hat tatsächlich große enums verwendet werden können polymorph. Ich bin kein Java Programmierer, also jemand anderes kann das sicherlich geben ein gutes Beispiel (ich kann nicht). Bedenken Sie auch, dass Polymorphismus ist oft einfach nur overkill. Ich habe auch gerade gesehen, die sprechen, und es ist toll, aber es stellt nur Richtlinien, keine silberne Kugel.
Ist es besonders nicht wahr, dass alle
switch
Aussagen ersetzt werden kann. State-machines ist tatsächlich ein Fall, wo enums viel Sinn machen. Ich verwenden moderne Maschinen, eine Menge in der Analyse. Sicher, diese kann getan werden, mit einem design-Muster und Klasse Polymorphismus. Aber es ist viel (viel) mehr code führt den gleichen job, nur langsamer, es ist nicht ein jota besser lesbar und es ist eine Lösung, die nur benötigt, in einem einzigen Ort, ohne code-recycling. Die Verwendung von Unterklassen, hier hat einfach keinen Vorteil.Dann wieder, das ist eine Ausnahme. Im Allgemeinen, das erstellen von Unterklassen ist oft die bessere Lösung in Sprachen, die Sie unterstützen sowie.
EDIT: ich habe bemerkt, dass diese mitunter Anlass zu kontroversen. Natürlich gibt es viele gute Lösungen, Kapseln Parsen von regulären Ausdrücken parser-generator-frameworks wie Antlr. Nichts falsch mit Ihnen, und in allen außer in den trivialen Fällen sind diese die bessere Lösung. Aber ich arbeite viel mit low-level-code (nicht in Java natürlich), wo reguläre Ausdrücke werden nicht unterstützt und parser-Generatoren auch eine Gebühr overhead.
Enums sind in Ordnung.
var day = DayOfWeek.Tuesday; var localized = CultureInfo.CurrentCulture.DateTimeFormat.DayNames[(int)day];
Ich zögern, rufen Sie alles, was böse. Es ist eine Frage des "Wie schwer willst du Ingenieur werden."
Enums/Schalter sind in Ordnung, in einigen Bereichen. Aufbau einer Klassen-Hierarchie ist-Aufwand, der nicht immer erforderlich, für das problem. Aber der weitere code in der case-Anweisung, desto wahrscheinlicher ist es, dass, ja, vielleicht sind Sie sollte annähert, und eine schwerere Ansatz.
Meine classic Erfahrung ist ein compiler schrieb ich für eine Klasse vor ein paar Jahren. Mein Mitbewohner hatte den gleichen Klasse mit mir, und wir gingen auf den es in zwei sehr unterschiedliche Weise. Ich nahm einen extra-OO-Ansatz, voll von polymophism. Er nahm einen schweren-C-Ansatz, mit enums und unions. Sein code war ~1/2 der Größe der mine LOC-Weise, seinen code war schneller compiler, und der code gearbeitet. Sein code war flexibel, weil es war nicht overengineered. Das war eine wertvolle Lektion für mich im software-design.
"Bedeutet das, dass enums sind "böse" in OO-design und sollten beseitigt werden, mit Polymorphismus?"
In der Regel.
switch/enum-Konstrukte können eine beliebige Anzahl von polymorphen Strukturen: Zustand und Strategie sind die beiden häufigsten diejenigen, die kommen meistens.
Ich denke, Enums sind nützlich, wenn die Werte bekannt sind & einige an der Zahl.
Auch Enums sind benannte Konstanten in einer Weise.
Enumerationen, die nicht einem anderen Staat hinterlegt (außer den Wert der it).
Polymorphie wäre hilfreich, wenn Sie unterschiedliche Zustände der Bedingungen (und-Bedingungen erfordern mehr Zustand, als sich in einer einzigen Variablen).