gpt4 book ai didi

c++ - 处理一个类中的函数,为了清楚起见应该分解成函数?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:08:09 25 4
gpt4 key购买 nike

通常如何处理这种情况。例如,一个对象可能需要做非常具体的事情:

class Human
{
public:
void eat(Food food);
void drink(Liquid liquid);
String talkTo(Human human);
}

假设这是此类应该做的事情,但实际执行这些操作可能会导致函数超过 10,000 行。所以你会分解它们。问题是,许多辅助函数不应该被它们所服务的函数以外的任何东西调用。这使得代码在某种程度上令人困惑。例如,咀嚼(食物食物);将由 eat() 调用,但不应由该类的用户调用,并且可能不应在其他任何地方调用。

这些案件一般是如何处理的。我正在看一个真实视频游戏中的一些类(class),看起来像这样:

class CHeli (7 variables, 19 functions)
Variables list

CatalinaHasBeenShotDown
CatalinaHeliOn
NumScriptHelis
NumRandomHelis
TestForNewRandomHelisTimer
ScriptHeliOn
pHelis

Functions list

FindPointerToCatalinasHeli (void)
GenerateHeli (b)
CatalinaTakeOff (void)
ActivateHeli (b)
MakeCatalinaHeliFlyAway (void)
HasCatalinaBeenShotDown (void)
InitHelis (void)
UpdateHelis (void)
TestRocketCollision (P7CVector)
TestBulletCollision (P7CVectorP7CVectorP7CVector)
SpecialHeliPreRender (void)
SpawnFlyingComponent (i)
StartCatalinaFlyBy (void)
RemoveCatalinaHeli (void)
Render (void)
SetModelIndex (Ui)
PreRenderAlways (void)
ProcessControl (void)
PreRender (void)

所有这些看起来都像是相当高级的函数,这意味着它们的源代码一定很长。这样做的好处是,一眼就很清楚这个类能做什么,而且看起来很好用。但是,这些函数的代码可能非常大。

程序员在这些情况下应该怎么做;对于这些类型的情况,什么是正确的做法。

最佳答案

For example, chew(Food food); would be called by eat() but should not be called by a user of the class and probably should not be called anywhere else.

然后要么使 chew 成为一个 privateprotected 成员函数,要么在 eat< 中的匿名命名空间中成为一个独立函数 实现模块:

// eat.cc

// details of digestion
namespace {
void chew(Human &subject, Food &food)
{
while (!food.mushy())
subject.move_jaws();
}
}

void Human::eat(Food &food)
{
chew(*this, food);
swallow(*this, food);
}

private 成员函数相比,这种方法的好处是可以在不更改 header 的情况下更改 eat 的实现(需要重新编译客户端代码)。缺点是该函数不能被其模块外的任何函数调用,因此它不能被多个成员函数共享,除非它们共享一个实现文件,并且它不能访问 private直接上课。

protected 成员函数相比的缺点是派生类不能直接调用chew

关于c++ - 处理一个类中的函数,为了清楚起见应该分解成函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7983734/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com