如何命名父 class(库)的成员以便在父 classes 和子 classes 中可读?

How do I name members of a parent class (library) for readability in both parent and child classes?

我创建了一个通常用作父级的自定义库 class。
使用1个月后,我开始对它的可读性感到困难。

最好用一个简化的真实例子来描述。

图书馆级别

有我的 c++ 库来管理二维对象 space。

它有 2 个 classes:Grid(space)和 GridMember(对象 space).

游戏逻辑关卡

我创建了一个 Table 派生自 GridBall 派生来自 GridMember.

问题

当我想从 Table 调用 Grid 的函数时,像这样:-

Table* table=new Table();
table-> .... some Grid's function .... (ctrl-space)

如果所有 Grid 的函数名称都有一些 独特的签名 例如它们都有前缀 grid_,
...代码将获得更高的可读性。

如您所见,它令人着迷:-

table->grid_add(new Ball());               //Grid's function member
table->grid_moveTo(ball1,VecInteger(3,4)); //Grid's function member
table->flip();                             //not Grid's function member

但是,看里面Grid.h,现在很脏。
Grid 的每个 variable/function 现在都包含 grid_.

这是最严重的症状之一:-

class Grid{
    //--------- old version -------
    void move_grid_to_offset(){...} //move the world
    //^ I prefer this name to moveGridToOffset, because it is easier to read

    //--------- new version ---------
    void grid_move_grid_to_offset(){...} 
    //^ After a long day, I read it as  grid......grid(again)..  
    //         not sure what it is doing
}

因此可读性降低。

问题

如何在两处都做到高可读性?

类似问题:Why use prefixes on member variables in C++ classes但与此问题无关。

一般来说,subclass 的任何成员实际上应该是任何 superclass 的成员,无论是在概念上还是在编程上。因此,在这种情况下,任何 Table 实际上都是一个 Grid,而任何 Ball 实际上都是一个 GridMember。由于 Table 是一个 Grid,因此 Table->add() 应该非常清楚,而不用担心它是 Grid 函数还是 Table 函数。

在 move_grid_to_offset 的情况下,问题不是名称中的信息太少,而是已经太多了:更好的名称是 move_to_offset 或 offset_by.由于您已经知道它是一个正在调用其成员函数的网格,因此无需重复它应用于该网格的成员函数的名称:grid.offset_by() 非常清楚。 table.offset_by() 也非常清楚,即使我们根本不知道网格 class。