Na in dem Beispiel mit den Tieren aus Bremen wäre das Case-Switch
imho noch annehmbar. Deswegen gleich eine Klassenfamilie aufzumachen, wäre dann doch etwas Overkill. Lesbar soll das ja noch bleiben. Aber der Hinweis auf die Pattern ist sicherlich hilfreich (Sobald eine zweites Case ins Spiel kommt oder etwas mehr passiert, als einen Return-Wert zu setzen, sollte man aber ansetzen).
Abschließend vielleicht noch das Stichwort: Factory. Das ist das, was Uwe und Stevie meinen. In der (Klassen)Fabrik wird anhand einer Eigenschaft der Spezialist (also die Klasse) ausgewählt, der die Verarbeitung übernimmt.
Einfaches Beispiel: Pizza.
Delphi-Quellcode:
Type
TPizza = (Margeritha, Funghi, QuatroStattione, MitWienerWurstUndSenf);
// Anstatt
Case Pizza of
Margeritha: begin PackdieTomatesoßerauf; UndKäse; end;
Funghi : begin PackdieTomatesoßerauf; Pilze; UndKäse; end;
...
...
end;
//schreibt man
PizzaFactory.CreateRecipe(Pizza).BelegDiePizza();
// Und dieser Code ändert sich dann niemals wieder.
Man stelle sich vor, aus der kleinen Klitsche, die 4 Pizzas macht, wird mal eine, die 30 Sorten kann. Dann würde das Case-Statement ziemlich schrottig aussehen, wohingegen bei der Factory alles immer noch so aufgeräumt ist, wie am ersten Tag.
Merke: Mit sauberem Code kaschiert man auch das eigene Chaos (mach ich jedenfalls so)