如何在父类和子类中为可读性指定父类(库)的成员?

时间:2016-06-19 14:41:20

标签: c++ readability

我创建了一个通常用作父类的自定义库 在我使用它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但与此问题无关。

1 个答案:

答案 0 :(得分:1)

通常,子类的任何成员实际上应该是任何超类的成员,从概念上和编程上都是如此。因此,在这种情况下,任何表实际上都是一个Grid,而任何Ball实际上都是一个GridMember。由于表格是网格,因此表格> add()应该非常清晰,而不必担心它是网格函数还是表函数。

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