我有 C 背景,是 C++ 的新手。我有一个基本的设计问题。我有一门课(我称它为“厨师”b/c,我遇到的问题似乎与此非常相似,无论是在复杂性还是问题上)基本上是这样工作的
class chef
{
public:
void prep();
void cook();
void plate();
private:
char name;
char dish_responsible_for;
int shift_working;
etc...
}
在伪代码中,这将按照以下方式实现:
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();
}
}
这里的厨师职业,似乎是怪物职业,有成为怪物职业的潜力。chef 似乎也违反了单一责任原则,所以我们应该有类似的东西:
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...
}
和
class plater : kitchen_worker
{
public:
void plate();
}
ETC...
诚然,我仍然在为如何在运行时实现它而苦苦挣扎,例如,如果盘子(或“以盘子身份的厨师”)决定在晚餐服务中途回家,那么厨师必须进行新的轮班.
这似乎与我有一个更广泛的问题有关,如果在这个例子中总是由同一个人进行准备、烹饪和摆盘,那么让这种层次结构来模拟单个厨师所做的真正实际优势是什么?我想这会遇到“害怕添加课程”的事情,但与此同时,现在或在可预见的将来,我不认为维护整个 chef 课程非常麻烦。我还认为,对于一个天真的代码读者来说,在真正意义上更容易看到 chef 对象中的三种不同方法并继续前进。
我知道当/如果我们添加诸如“cut_onions()”、“cut_carrots()”等方法时,它可能会变得笨拙,也许每个方法都有自己的数据,但似乎这些可以通过制作来处理prep() 函数,比如说,更加模块化。此外,似乎 SRP 得出其合乎逻辑的结论将创建一个类“onion_cutters”“carrot_cutters”等......我仍然很难看到它的价值,因为程序必须以某种方式确保同一员工切洋葱和胡萝卜,这有助于在不同方法中保持状态变量相同(例如,如果员工用手指切洋葱,他不再有资格切胡萝卜),而在怪物对象厨师类中,似乎所有这一切都得到了照顾。
当然,我理解这对于有意义的“面向对象设计”来说变得不那么重要了,但在我看来,如果我们必须为每个厨师的任务有单独的对象(这似乎不自然,因为同一个人是完成所有三个功能)然后似乎将软件设计优先于概念模型。我觉得面向对象的设计在这里很有帮助,如果我们想拥有可能是不同的人的“meat_chef”“sous_chef”“three_star_chef”。此外,与运行时问题相关的是,在严格应用单一职责原则的情况下,似乎存在复杂性开销,必须确保构成基类员工的底层数据发生变化,并且这种变化是反映在随后的时间步长中。
因此,我很想或多或少地保持原样。如果有人能澄清为什么这是一个坏主意(如果你有关于如何最好地进行的建议),我将非常感激。