命名函数以提供规律性时,我应该放弃语法正确性吗?

时间:2019-03-22 10:50:11

标签: naming-conventions

我在我们的库中实现了几个看起来像这样的全局函数:

void init_time();
void init_random();
void init_shapes();

我想添加函数以检查是否已调用这些函数:

bool is_time_initialized();
bool is_random_initialized();
bool are_shapes_initialized();

但是,正如您所见,由于are_shapes_initialized是复数,因此shapes不在行内,因此函数名称必须以 are 开头,而不是 。这可能是一个问题,因为该库很大,并且在相同的命名约定下没有统一的方式来对相似的函数进行分组可能会令人困惑/烦恼。

例如使用IntelliSense的用户快速查找函数名称,以查看库是否提供了一种方法来检查其初始化调用是否发生:

IntelliSense only displaying "is_" functions

除非在数百个其他函数/类名中滚动,否则他们不会在这里找到 are_shapes_initialized()

只需配合 is_shapes_initialized() 即可提供清晰说明:

IntelliSense displaying now all "is_initialized" functions

现在将显示所有功能。

但是使用错误的语法怎么能成为一个好的方法呢?我是否应该只是假设用户也应该向IntelliSense询问“ are_initialized”,还是只是首先查看文档?可能不是吧?我应该放弃语法正确性吗?

3 个答案:

答案 0 :(得分:4)

按照我的看法,变量是单个实体。也许该实体是其他实体的集合,例如数组或集合,在这种情况下,给它一个复数名称是有意义的,例如一组Shape对象可以称为shapes。即使这样,它仍然是单个对象。从这种角度来看,将其称为单数在语法上是可以接受的。毕竟,is_shapes_initialized的实际含义是“变量'shapes'是否已初始化?”

这就是我们说“ 巴哈马是”或“ 荷兰是”的原因,因为我们指的是单数国家,而不是单数国家包括。因此,可以肯定is_shapes_initialized在语法上是正确的。

答案 1 :(得分:2)

这更多地取决于个人喜好。我建议将“ is”放在返回布尔值的函数之前。看起来更像是:

bool is_time_initialized();
bool is_random_initialized();
bool is_shapes_initialized();

这使它们更容易找到和搜索,即使它们在语法上不正确。

您可以使用“ are”找到函数,以在诸如DuckDuckGo应用之类的地方将其显示为复数形式,

areItemsTheSame(...)
areContentsTheSame(...)

在DuckDuckGo应用中,它还使用“ is”来显示函数返回布尔值和布尔变量:

val isFullScreen: Boolean = false
isAssignableFrom(...)

在OpenTK(一个C#图形库)中,我还发现了“ are”的用法:

AreTexturesResident(...)
AreProgramsResident(...)

在同一OpenTK库中,对于返回布尔值和布尔变量的函数,它们单独使用“ is”:

IsEnabledGenlock(...)
bool isControl = false;

两种用法都可以。语法上使用复数形式“ are”会更有意义,而效率或简化布尔函数则复数使用“ if”会更有意义。

答案 2 :(得分:2)

这就是我要做的,假设您试图避免在每个形状上调用此函数。

void init_each_shape();

bool is_each_shape_initialized();

还假设您需要这些函数,如果函数不成功,则使它们抛出异常似乎更有意义。