Beide switch
Aussagen und Polymorphismen haben ihre Verwendung. Beachten Sie jedoch, dass es auch eine dritte Option gibt (in Sprachen, die Funktionszeiger / Lambda und Funktionen höherer Ordnung unterstützen): Zuordnen der fraglichen Bezeichner zu Handlerfunktionen. Dies ist z. B. in C, das keine OO-Sprache ist, und in C #, das * ist, aber (noch) nicht in Java, das auch OO * ist, verfügbar.
In einigen prozeduralen Sprachen (ohne Polymorphismus oder Funktionen höherer Ordnung) waren switch
/ if-else
Anweisungen die einzige Möglichkeit, eine Klasse von Problemen zu lösen. So viele Entwickler, die sich an diese Denkweise gewöhnt hatten, verwendeten sie switch
auch in OO-Sprachen, in denen Polymorphismus oft die bessere Lösung ist. Aus diesem Grund wird häufig empfohlen, switch
Aussagen zugunsten des Polymorphismus zu vermeiden / umzugestalten .
In jedem Fall ist die beste Lösung immer fallabhängig. Die Frage ist: Mit welcher Option erhalten Sie auf lange Sicht saubereren, präziseren und wartbareren Code?
Switch-Anweisungen können oft unhandlich werden, da sie Dutzende von Fällen aufweisen und ihre Wartung schwierig machen. Da Sie sie in einer einzigen Funktion behalten müssen, kann diese Funktion sehr groß werden. In diesem Fall sollten Sie eine Umgestaltung in Richtung einer kartenbasierten und / oder polymorphen Lösung in Betracht ziehen.
Wenn dasselbe switch
an mehreren Stellen auftaucht, ist Polymorphismus wahrscheinlich die beste Option, um all diese Fälle zu vereinheitlichen und den Code zu vereinfachen. Vor allem, wenn in Zukunft weitere Fälle erwartet werden; Je mehr Stellen Sie jedes Mal aktualisieren müssen, desto mehr Fehlermöglichkeiten gibt es. Oft sind die einzelnen Fallbearbeiter jedoch so einfach, oder es gibt so viele von ihnen, oder sie sind so miteinander verbunden, dass ihre Umgestaltung in eine vollständige polymorphe Klassenhierarchie zu viel Aufwand bedeutet oder zu viel dupliziertem Code und / oder Wirrwarr führt. schwer zu Klassenhierarchie beizubehalten. In diesem Fall ist es möglicherweise einfacher, stattdessen Funktionen / Lambdas zu verwenden (sofern Ihre Sprache dies zulässt).
Wenn Sie jedoch eine switch
an einem einzigen Ort haben und nur wenige Fälle etwas Einfaches tun, ist es möglicherweise die beste Lösung, sie so zu belassen, wie sie ist.
* Ich benutze den Begriff "OO" hier locker; Ich interessiere mich nicht für konzeptuelle Debatten darüber, was "echt" oder "rein" ist.