c++ - 我如何命名父类(库)的成员以便在父类和子类中都可读?

标签 c++ readability

我创建了一个通常用作父类的自定义库。
在我使用它 1 个月后,我开始面临它的可读性问题。

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

图书馆级别

有我的 c++ 库来管理 2D 空间中的对象。

它有 2 个类:Grid(空间)和 GridMember(空间中的对象)。

游戏逻辑关卡

我创建了一个从 Grid 派生的 Table 和从 GridMember 派生的 Ball

问题

当我想像这样从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 的每个变量/函数现在都包含该 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但与此问题无关。

最佳答案

一般来说,子类的任何成员实际上应该是任何父类(super class)的成员,无论是概念上还是程序上。因此,在这种情况下,任何 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() 也非常清楚,即使我们根本不知道 Grid 类。

关于c++ - 我如何命名父类(库)的成员以便在父类和子类中都可读?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37908411/

相关文章:

c++ - 在每次迭代中创建一个结构体

c++ - 在 XCode 中用 C++ 重命名

c# - 如何在 C# 中的每个数学函数前面避免 "Math."?

performance - 应该在 for 循环中使用 < 或 <=

没有空格的 YAML 折叠

java - Java 中多个 'proxy' 方法的替代方法

nlp - 检测包含非字母字符的单词中的音节

java - 切换到新的qt和Gradle后不调用native方法

c++ - 为什么 CMake 不在库之间传播 PUBLIC 包含目录?

C++ 堆栈被指针损坏