我创建了一个通常用作父类的自定义库 在我使用它1个月后,我开始面临其可读性方面的困难。
通过简化的实例更好地描述。
有我的c ++库来管理2D空间中的Object。
它有两个类:网格(空格)和 GridMember (空间中的对象)。
我创建了一个表派生自网格,球派生自 GridMember 。
当我想从表中调用 Grid 的功能时: -
Table* table=new Table();
table-> .... some Grid's function .... (ctrl-space)
如果所有网格的功能名称都有一些唯一签名,例如所有这些都有前缀 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但与此问题无关。
答案 0 :(得分:1)
通常,子类的任何成员实际上应该是任何超类的成员,从概念上和编程上都是如此。因此,在这种情况下,任何表实际上都是一个Grid,而任何Ball实际上都是一个GridMember。由于表格是网格,因此表格> add()应该非常清晰,而不必担心它是网格函数还是表函数。
在move_grid_to_offset的情况下,问题不在于名称中的信息太少,而是已经有太多:更好的名称是move_to_offset或offset_by。由于您已经知道它是一个调用其成员函数的网格,因此不必在它应用于网格的成员函数的名称中重复:grid.offset_by()非常清楚。而table.offset_by()也非常清楚,即使我们根本不了解Grid类。