命名一个展示“如果不相等”行为的函数

时间:2011-01-06 00:10:11

标签: naming-conventions

这可能是一个奇怪的问题,但我正在寻找一个在函数名称中使用的单词。我通常擅长提出简洁,有意义的功能名称,但是这个让我难过,所以我觉得我会求助。

该函数将一些所需的状态作为参数,并将其与当前状态进行比较。如果不需要更改,函数将正常退出而不执行任何操作。否则,该函数将采取一些操作来实现所需的状态。

例如,如果想确保前门关闭,我可能会说:

my_house.<something>_front_door('closed')

应使用什么词或术语代替某事?我希望它简短,可读,并最大限度地减少惊讶因素。

一些澄清点......

我希望有人调用该函数直观地知道他们不需要将函数包装为检查当前状态的'if'。例如,这会很糟糕:

if my_house.front_door_is_open():
    my_house.<something>_front_door('closed')

此外,他们应该知道,如果所需的状态与当前状态匹配,该函数不会抛出异常。所以这绝不会发生:

try:
    my_house.<something>_front_door('closed')
except DoorWasAlreadyClosedException:
    pass

以下是我考虑的一些选项:

my_house.set_front_door('closed')
my_house.setne_front_door('closed') # ne=not equal, from the setne x86 instruction
my_house.ensure_front_door('closed')
my_house.configure_front_door('closed')
my_house.update_front_door('closed')
my_house.make_front_door('closed')
my_house.remediate_front_door('closed')

我对其他形式持开放态度,但大多数人都认为不提高可读性。比如...

my_house.ensure_front_door_is('closed')
my_house.conditionally_update_front_door('closed')
my_house.change_front_door_if_needed('closed')

感谢您的任何意见!

3 个答案:

答案 0 :(得分:2)

我会使用“ensure”作为其简洁,描述性和重点:

EnsureCustomerExists(CustomerID)
EnsureDoorState(DoorStates.Closed)
EnsureUserInterface(GUIStates.Disabled)

答案 1 :(得分:1)

有趣的问题!

根据您提供的信息,在我看来,setstate(或简称为set,如果您要设置除状态之外的其他内容)会很好,但ensure是如果你想真正强调if的冗余,那就太好了。

然而,对我而言,设置状态不会引发异常或需要if是非常直观的。考虑设置任何其他变量的状态:

在C:

int i;

i = 5;  // Would you expect this to throw an exception if i was already 5? 

// Would you write
if (i != 5)
    i = 5;
// ?

此外,只需要一个句子来记录此行为:

  

如果是,该函数什么都不做   当前状态等于请求的   状态。

编辑:实际上,考虑一下,如果对你(由于某种原因)对用户并不感到困惑,那么我实际上会选择ensure(或其他一些非标准名称) )。为什么?因为作为一个用户,这样的名字会让我刮一点头脑并查看文档(“这不仅仅是一个普通的集合函数,显然”)。

编辑2:只有您知道如何设计程序,以及哪个函数名称最适合。根据您的说法,您的设置功能似乎有时会抛出异常,并且您需要命名一个不设置的设置功能 - 例如set_missile_target。如果是这种情况,我认为您应该考虑set_ifset_whenset_condcond_set名称。哪一个会依赖于你的其余代码。我还要添加一行文档(或两行,如果你是慷慨的),这澄清了整个事情。

例如:

    // Sets missile target if current target is not already the requested target, 
    // in which case it does nothing. No exceptions are thrown.
    function cond_set_missile_target ()
or  function cond_set_MissileTarget ()
or  function condSet_MissileTarget ()
or  function condSetMissileTarget ()

ensure并不是那么糟糕,但对我而言,它只意味着设置状态需要额外的逻辑(例如,多个状态捆绑在一起,或其他并发症)。它有助于使用户避免添加不必要的if,但它对异常问题没有多大帮助。我希望ensure函数比set函数更早地抛出异常,因为ensure函数显然有更多的责任,确保这个设置操作实际上是正确的。

答案 2 :(得分:0)

我会为你描述的功能寻找ensure。我也使用camelCase,但我想你可能会选择一种喜欢下划线的语言。

您可以随时记录(震惊!)您的API,以便其他人不会犯您所描述的错误。