处理类中的函数,为了清楚起见,应该将其分解为函数?

jma*_*erx 4 c++ oop

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

class Human
{
   public:
   void eat(Food food);
   void drink(Liquid liquid);
   String talkTo(Human human);
}
Run Code Online (Sandbox Code Playgroud)

假设这是本课程应该做的,但实际上这些可能会产生超过10,000行的函数.所以你会打破他们.问题是,许多辅助函数不应该被它们所服务的函数调用.这使得代码在某种程度上令人困惑.例如,咀嚼(食物食品); 将由eat()调用,但不应该由类的用户调用,并且可能不应该在其他任何地方调用.

这些案件如何处理?我正在看一些真实的视频游戏,看起来像这样:

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)
Run Code Online (Sandbox Code Playgroud)

所有这些看起来都是相当高级的功能,这意味着它们的源代码必须非常冗长.这样做的好处在于,一眼就可以清楚地了解这个类可以做什么,并且该类看起来很容易使用.但是,这些函数的代码可能非常大.

程序员在这些情况下应该做些什么; 什么是这些类型的情况的适当做法.

Fre*_*Foo 11

例如,咀嚼(食物食品); 将由eat()调用,但不应该由类的用户调用,并且可能不应该在其他任何地方调用.

然后在实现模块内的匿名命名空间中创建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);
}
Run Code Online (Sandbox Code Playgroud)

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

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

  • @ AJG85:同意,有一句话,即`detail`命名空间在模板库中最有用,匿名命名空间应该在别处优先使用. (2认同)