在命名我的函数以提供规律性时,我应该放弃语法正确性吗?
Should I give up grammatical correctness when naming my functions to offer regularity?
我在我们的库中实现了几个全局函数,如下所示:
void init_time();
void init_random();
void init_shapes();
我想添加函数来检查是否已调用这些函数:
bool is_time_initialized();
bool is_random_initialized();
bool are_shapes_initialized();
但是,正如您所看到的,由于 shapes
是复数,因此函数名称必须以 [=38= 开头,因此 are_shapes_initialized
不在行中]是而不是是。这可能是个问题,因为该库相当大,并且没有统一的方法将相似的函数分组在相同的命名约定下可能会令人困惑/不安。
例如使用 IntelliSense 的用户快速查找函数名称以查看库是否提供了一种方法来检查他们的初始化调用是否发生:
他们不会在这里找到 are_shapes_initialized()
,除非滚动浏览数百个附加函数/class 名称。
仅使用 is_shapes_initialized()
可以提供清晰度:
既然这显示了所有功能,现在。
但是使用错误的语法怎么可能是一个好方法呢?我不应该只是假设用户也应该向 IntelliSense 询问 "are_initialized" 或者只是首先查看文档吗?可能不是,对吧?我应该放弃语法正确性吗?
更多的是个人品味问题。我建议将 "is" 放在 return 布尔值的函数之前。这看起来更像:
bool is_time_initialized();
bool is_random_initialized();
bool is_shapes_initialized();
这使得它们更容易查找和搜索,即使它们在语法上不正确。
您可以在 DuckDuckGo 应用等地方使用 "are" 查找函数以显示它是复数形式,其中:
areItemsTheSame(...)
areContentsTheSame(...)
在 DuckDuckGo 应用程序中,它还使用 "is" 来显示函数 return 布尔值和布尔变量:
val isFullScreen: Boolean = false
isAssignableFrom(...)
在C#图形库OpenTK中,我也发现了"are"的用法:
AreTexturesResident(...)
AreProgramsResident(...)
在同一个 OpenTK 库中,他们单独使用 "is" 用于 return 布尔和布尔变量的函数:
IsEnabledGenlock(...)
bool isControl = false;
这两种用法都可以。使用 "are" 的复数形式在语法上更有意义,而使用 "if" 的复数形式对于效率或简化布尔函数更有意义。
在我看来,变量是一个单一的实体。也许该实体是其他实体的集合,例如数组或集合,在这种情况下,给它一个复数名称是有意义的,例如一组 Shape
个对象可以称为 shapes
。即便如此,它仍然是一个单一的对象。这样看,将其称为单数在语法上是可以接受的。毕竟,is_shapes_initialized
实际上意味着"Is the variable 'shapes' initialized?"
这与我们说“巴哈马是”或“荷兰是”的原因相同,因为我们指的是单数国家,而不是它所包含的任何复数实体。所以是的,is_shapes_initialized
在语法上可以被认为是正确的。
假设您试图避免在每个形状上调用此函数,我会这样做。
void init_each_shape();
bool is_each_shape_initialized();
还假设您需要这些函数,如果函数不成功则抛出异常似乎更有意义。
我在我们的库中实现了几个全局函数,如下所示:
void init_time();
void init_random();
void init_shapes();
我想添加函数来检查是否已调用这些函数:
bool is_time_initialized();
bool is_random_initialized();
bool are_shapes_initialized();
但是,正如您所看到的,由于 shapes
是复数,因此函数名称必须以 [=38= 开头,因此 are_shapes_initialized
不在行中]是而不是是。这可能是个问题,因为该库相当大,并且没有统一的方法将相似的函数分组在相同的命名约定下可能会令人困惑/不安。
例如使用 IntelliSense 的用户快速查找函数名称以查看库是否提供了一种方法来检查他们的初始化调用是否发生:
他们不会在这里找到 are_shapes_initialized()
,除非滚动浏览数百个附加函数/class 名称。
仅使用 is_shapes_initialized()
可以提供清晰度:
既然这显示了所有功能,现在。
但是使用错误的语法怎么可能是一个好方法呢?我不应该只是假设用户也应该向 IntelliSense 询问 "are_initialized" 或者只是首先查看文档吗?可能不是,对吧?我应该放弃语法正确性吗?
更多的是个人品味问题。我建议将 "is" 放在 return 布尔值的函数之前。这看起来更像:
bool is_time_initialized();
bool is_random_initialized();
bool is_shapes_initialized();
这使得它们更容易查找和搜索,即使它们在语法上不正确。
您可以在 DuckDuckGo 应用等地方使用 "are" 查找函数以显示它是复数形式,其中:
areItemsTheSame(...)
areContentsTheSame(...)
在 DuckDuckGo 应用程序中,它还使用 "is" 来显示函数 return 布尔值和布尔变量:
val isFullScreen: Boolean = false
isAssignableFrom(...)
在C#图形库OpenTK中,我也发现了"are"的用法:
AreTexturesResident(...)
AreProgramsResident(...)
在同一个 OpenTK 库中,他们单独使用 "is" 用于 return 布尔和布尔变量的函数:
IsEnabledGenlock(...)
bool isControl = false;
这两种用法都可以。使用 "are" 的复数形式在语法上更有意义,而使用 "if" 的复数形式对于效率或简化布尔函数更有意义。
在我看来,变量是一个单一的实体。也许该实体是其他实体的集合,例如数组或集合,在这种情况下,给它一个复数名称是有意义的,例如一组 Shape
个对象可以称为 shapes
。即便如此,它仍然是一个单一的对象。这样看,将其称为单数在语法上是可以接受的。毕竟,is_shapes_initialized
实际上意味着"Is the variable 'shapes' initialized?"
这与我们说“巴哈马是”或“荷兰是”的原因相同,因为我们指的是单数国家,而不是它所包含的任何复数实体。所以是的,is_shapes_initialized
在语法上可以被认为是正确的。
假设您试图避免在每个形状上调用此函数,我会这样做。
void init_each_shape();
bool is_each_shape_initialized();
还假设您需要这些函数,如果函数不成功则抛出异常似乎更有意义。