如何命名父 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 派生自 Grid 和 Ball 派生来自 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。
我创建了一个通常用作父级的自定义库 class。
使用1个月后,我开始对它的可读性感到困难。
最好用一个简化的真实例子来描述。
图书馆级别
有我的 c++ 库来管理二维对象 space。
它有 2 个 classes:Grid(space)和 GridMember(对象 space).
游戏逻辑关卡
我创建了一个 Table 派生自 Grid 和 Ball 派生来自 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。