Ich habe einen C-Hintergrund und bin ein Newb auf C++. Ich habe eine grundlegende Designfrage. Ich habe eine Klasse (ich nenne es werde „Chef“ b/c das Problem, das ich scheint sehr ähnlich zu dieser, und zwar sowohl im Hinblick auf die Komplexität und Ausgaben), die im Grunde wie dieseC++ Hilfe zum Refactoring einer Monsterklasse
class chef
{
public:
void prep();
void cook();
void plate();
private:
char name;
char dish_responsible_for;
int shift_working;
etc...
}
in Pseudo-Code arbeitet, Dies wird in folgende Richtung umgesetzt:
int main{
chef my_chef;
kitchen_class kitchen;
for (day=0; day < 365; day++)
{
kitchen.opens();
....
my_chef.prep();
my_chef.cook();
my_chef.plate();
....
kitchen.closes();
}
}
Die Klasse der Küchenchefs scheint hier eine Monsterklasse zu sein und hat das Potenzial, eins zu werden. Koch scheint auch die einzige Verantwortung Prinzip zu verletzen, so stattdessen sollten wir so etwas wie:
class employee
{
protected:
char name;
int shift_working;
}
class kitchen_worker : employee
{
protected:
dish_responsible_for;
}
class cook_food : kitchen_worker
{
public:
void cook();
etc...
}
class prep_food : kitchen_worker
{
public:
void prep();
etc...
}
und
class plater : kitchen_worker
{
public:
void plate();
}
etc ...
Ich bin immer noch zugegebenermaßen kämpfen mit, wie man Implementieren Sie es zur Laufzeit, so dass, wenn zum Beispiel Plater (oder "Koch in seiner Eigenschaft als Plater") beschließt, mitten beim Abendessen Service nach Hause gehen, dann muss der Koch eine neue Schicht arbeiten.
Dies scheint mit einer breiteren Frage verbunden zu sein Ich habe, dass, wenn die gleiche Person unweigerlich das Vorbereiten, Kochen und Galvanisieren in diesem Beispiel macht, was ist der wirkliche praktische Vorteil dieser Hierarchie von Klassen zu modellieren, was ein einzelner Koch tut das? Ich schätze, das läuft auf die "Angst vor dem Hinzufügen von Klassen" hinaus, aber zur gleichen Zeit, im Moment oder auf absehbare Zeit, glaube ich nicht, dass die Aufrechterhaltung der Kochklasse in ihrer Gesamtheit furchtbar mühsam ist. Ich denke auch, dass es für einen naiven Leser des Codes einfacher ist, die drei verschiedenen Methoden im Kochobjekt zu sehen und weiterzumachen.
Ich verstehe, es könnte drohen unhandlich zu werden, wenn/wenn wir Methoden wie "cut_onions()", "cut_carrots()", etc ..., vielleicht jeder mit ihren eigenen Daten hinzufügen, aber es scheint, dass diese behandelt werden können mit der Vorbereitung der prep() -Funktion, sagen wir, modularer. Außerdem scheint es, dass die SRP, die zu ihrer logischen Schlussfolgerung geführt wird, eine Klasse "onion_cutters" "carrot_cutters" usw. kreieren würde ... und es fällt mir immer noch schwer, den Wert zu sehen, da das Programm irgendwie dafür sorgen muss Derselbe Angestellte schneidet die Zwiebeln und die Karotten, was hilft, den Zustand variabel über die Methoden zu halten (zB wenn der Angestellte seinen Finger schneidet und Zwiebeln schneidet, ist er nicht länger zum Schneiden von Karotten berechtigt), während dies in der Klasse der Monsterobjekte der Fall ist all das wird erledigt.
Natürlich verstehe ich, dass es dann weniger darum geht, ein sinnvolles "objektorientiertes Design" zu haben, aber es scheint mir, dass wir für jede Aufgabe des Küchenchefs getrennte Objekte haben müssen (was unnatürlich erscheint) die gleiche Person macht alle drei Funktionen), dann scheint das Software-Design Vorrang vor dem konzeptionellen Modell zu haben. Ich finde, dass ein objektorientiertes Design hier hilfreich ist, wenn wir sagen wollen "meat_chef" "sous_chef" "three_star_chef", die wahrscheinlich unterschiedliche Leute sind. Im Zusammenhang mit dem Laufzeitproblem besteht außerdem ein Overhead in der Komplexität, der unter der strikten Anwendung des Prinzips der einheitlichen Verantwortlichkeit zu gewährleisten scheint, dass die zugrunde liegenden Daten, die den Mitarbeiter der Basisklasse ausmachen, geändert werden und dass diese Änderung erfolgt in nachfolgenden Zeitschritten wiedergegeben.
Ich bin daher eher versucht, es mehr oder weniger zu lassen, wie es ist. Wenn jemand erklären könnte, warum das eine schlechte Idee wäre (und wenn Sie Vorschläge haben, wie man am besten vorgeht), wäre ich Ihnen am meisten verpflichtet.
Manchmal reale Welt Rollen/Verantwortlichkeit Kartierungs-/Aufgaben in Code zu Objekten funktioniert einfach nicht. Vielleicht brauchen Sie eine generische Funktion, die eine Person und eine Aktion braucht. Diese Funktion ruft die Person zum Anwenden der Aktion auf. –
Modul auf jeder Klassenschnittstelle kann Ihnen mehr Hinweise geben? Wie kann ein Plater machen? was kann cook_food machen? Müssen sie vererben oder ist es nur eine Fähigkeit (Funktionsaufruf)? – billz
Schauen Sie sich die Kompositionsmethode an. Oder brauchen Sie hier ein Zustandsmuster? –