J'ai un arrière-plan C et je suis novice en C++. J'ai une question de conception de base. J'ai une classe (je vais l'appeler « chef » b/c le problème que j'ai semble très analogue à cela, tant en termes de complexité et des problèmes) qui fonctionne essentiellement commeAide C++ sur la refactorisation d'une classe monstre
class chef
{
public:
void prep();
void cook();
void plate();
private:
char name;
char dish_responsible_for;
int shift_working;
etc...
}
dans le code pseudo, ce soit mis en oeuvre le long des lignes de:
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();
}
}
la classe de chef ici semble être une classe de monstre, et a le potentiel de devenir un. le chef semble également violer le principe de responsabilité unique, donc nous devrions plutôt avoir quelque chose comme:
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...
}
et
class plater : kitchen_worker
{
public:
void plate();
}
etc ...
Je suis certes encore du mal avec la façon le mettre en œuvre au moment de l'exécution de sorte que, si par exemple plater (ou "chef en sa qualité de plater") décide de rentrer à la maison à mi-chemin du service de table, alors le chef doit travailler un nouveau quart. Cela semble être lié à une question plus large: si la même personne fait invariablement la préparation, la cuisson et le placage dans cet exemple, quel est l'avantage pratique réel d'avoir cette hiérarchie de classes pour modéliser ce qu'un seul chef Est-ce que? Je suppose que cela se heurte à la «peur d'ajouter des classes», mais en même temps, en ce moment ou dans un avenir prévisible, je ne pense pas que le maintien de la classe de chef dans son ensemble est terriblement lourd. Je pense aussi qu'il est vraiment plus facile pour un lecteur naïf du code de voir les trois méthodes différentes dans l'objet chef et de passer à autre chose. Je comprends que cela pourrait menacer de devenir lourd quand/si nous ajoutons des méthodes comme "cut_onions()", "cut_carrots()", etc ..., peut-être chacune avec leurs propres données, mais il semble que celles-ci peuvent être distribuées avec en ayant la fonction prep(), disons, plus modulaire. De plus, il semble que le SRP, mené à sa conclusion logique, créerait une classe "onion_cutters" "carrot_cutters" etc ... et j'ai encore du mal à voir la valeur de cela, étant donné que le programme doit s'assurer que le même employé coupe les oignons et les carottes, ce qui aide à garder la même variable d'une méthode à l'autre (p. ex., si l'employé coupe son oignon, il n'est plus autorisé à couper les carottes), alors que tout ce qui est pris en charge. Bien sûr, je comprends que cela devient moins une question de «conception orientée objet», mais il me semble que si nous devons avoir des objets séparés pour chacune des tâches du chef (ce qui semble anormal, étant donné que la même personne fait les trois fonctions), ce qui semble donner la priorité à la conception de logiciels plutôt qu'au modèle conceptuel. Je pense qu'une conception orientée objet est utile ici si nous voulons avoir, disons, "meat_chef" "sous_chef" "three_star_chef" qui sont probablement des personnes différentes. De plus, en ce qui concerne le problème d'exécution, il semble qu'il y ait une surcharge en termes de complexité. Il semble que les données sous-jacentes qui composent l'employé de base soient modifiées et que ce changement soit reflété dans les pas de temps suivants. Je suis donc plutôt tenté de le laisser plus ou moins tel quel. Si quelqu'un pouvait clarifier pourquoi ce serait une mauvaise idée (et si vous avez des suggestions sur la meilleure façon de procéder), je serais très obligé.
cartographie parfois réels rôles mondiaux/responsabilités/tâches à des objets dans le code ne fonctionne tout simplement pas. Peut-être que vous avez besoin d'une fonction générique qui prend une personne et une action. Cette fonction permet à la personne d'appliquer l'action. –
module sur chaque interface de classe peut vous donner plus d'indices? comme ce qu'un plater peut faire? Qu'est-ce que cook_food peut faire? ont-ils besoin d'hériter ou c'est juste une compétence (appel de fonction)? – billz
Regardez la méthode de composition. Ou peut-être que vous avez besoin d'un modèle d'état ici? –