我创建了一个通常用作父类的自定义库。
在我使用它 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/