Lies mal die von Günther verlinkte Diskussion, die behandelt das Thema nochmals.
Habe ich. Meiner Meinung nach wird hier mit Kanonenkugeln auf Spatzen geschossen.
Thema Stadtmusikanten:
Delphi-Quellcode:
TAnimal = (hund, katze, maus, affe, baer);
TAnimalSet = set of TAnimal;
TAnimalStadtMusikant = [hund, maus];
Wenn ich irgendwo ein Case habe, welches nur die Stadtmusikanten behandeln soll, dann schreibe ich folgendes.
Delphi-Quellcode:
if myAnimal in TAnimalStadtMusikant then
begin
case myAnimal of
hund:TrittDenHund;
maus:VerfuettereDieMaus;
else
MachException;
end;
end;
Nun wird TAnimal erweitert:
TAnimal = (hund, katze, maus, affe, baer, huhn);
.
Der Code läuft, weil das neue Tier nichts mit den Stadtmusikanten zu tun hat.
Nun werden die Stadtmusikanten erweitert
TAnimalStadtMusikant = [hund, katze, maus];
Der Code wirft eine
Exception.
Und nun dein Beispiel aus dem Thread;
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.
Was spricht gegen:
Delphi-Quellcode:
type
TPizzaToppics = (Tomatensosse, Kaese, Pilze, Salami, Pepperoni);
TPizzaToppicsSet = set of TPizzaToppics;
const
TPizzaBrot = [];
TPizzaMargeritha = [Tomatensosse, Kaese];
TPizzaFungi = [Tomatensosse, Kaese, Pilze];
...
Procedure TPizzaOfen.BelegDiePizza(TPizzaMargeritha);
Nun kannst du die So viele Pizzen zusammenstellen wie du willst. Alle Sorten stehen beisammen.
Der Code Selber muss nicht geändert werden. Ausser wenn neue Toppics hinzu kommen. Aber dann musst du auch bei dir den Code erweitern.