当单词既是名词又是动词时,如何命名变量


48

我在以下一般指导下遇到了一个极端情况:

  • 变量名词
  • 功能动词

具体地讲,我有一个情况下字是不明确的-它可以是一个动词名词。在某些情况下,当我们讨论应用程序时,将在同一句子中同时使用这两种方法。

我的目的是确保当我几个月后返回代码部分时,该程序将对将来的开发人员以及我自己仍然可读。

例子之一是带有battery。A battery有一个charge,您也可以装charge()电池。

我认为,同时具有Battery.ChargeBattery.Charge(value)将是混乱的未来发展。

我当前的解决方案是为其中一种或两种情况(变量和函数)简单地选择一个不同的词。我用这种方法的问题是,Battery对象的变量和函数charge与涉及的设计讨论不一致Battery

我的问题是在命名约定中是否存在另一种/更好的方法来处理此冲突?


关于该主题的一些其他阅读。没有人真正解决我的问题。


3
使充电功能addCharge既简单又清晰
棘轮怪胎

2
可以给名词变量加上“ Current-”前缀吗?那么“ CurrentCharge”与“ Charge()”呢?
Brian Snow

6
或只是ChargeLevel即可获取当前的费用
棘轮怪胎

5
补个字。WordNet认为enqueue不是单词,而是Java中的动词。怎么doCharge样 由于您的其他方法将没有此前缀,因此它将仍然无法通过对称性测试
Miserable Variable

5
“当前” =现在,或“当前” =电荷流。唯一真正的解决方案是用更明智的语言替换英语!
2013年

Answers:


38

在类似情况下,我尝试查找同义词。在这种情况下,我将对动词使用“ recharge”。“ re-”有点多余,但是含义很清楚。对于电池中的剩余电量使用简单的“充电”是模棱两可的,因为它没有指定任何物理单位。我希望使用“ availableAmpHours”,“ hoursUntilRecharge”或类似内容。单位将取决于应用程序的便利性。

我个人的喜好是仅将动词用于更改状态的功能。我将名词用于非变异函数。我想这取决于您的观点。在机器级别,非变异函数可以执行某些操作,但是在模型级别,它们却无法执行。


2
对单位的好点。在这种情况下,单位会明确保留,因为它们可以根据我们正在运行的分析进行更改。也就是说,我们使用了不同的时间范围,并且电池根据分析范围来调整其操作。

1
对于昂贵的,不可变的功能,我更喜欢动词。例如,在数据库上运行查询的函数。
布莱恩(Brian)

20

只是将其扔在那里,但是这种命名歧义的解决方案也许是从电池中完全删除该功能。我从未见过可自我充电的电池,因此拥有BatteryCharger类对我来说更有意义。这将有助于使您的关注点更加分离,并使操作更加明确。

battery.Charge(50)batteryCharger.Charge(battery, 50)

对我来说,第二种形式更容易理解,并将所有“充电”代码都放在一个位置,而不是将其散布在所有电池类别中。


6
这不是一个坏主意,但是在这种情况下,它Battery是电池+充电系统的抽象。我们的应用程序不需要将这两个方面分解为单独的对象,因此Battery为了方便起见,将它们分为一个(又称为)。归根结底,可充电电池的物理特性决定了它具有某种接受电荷的功能。

在这种情况下,我认为kevin cline的答案就是您想要的。为了清楚起见,我将使用Recharge和Discharge作为变异函数,使用Charge作为属性名称。也许ChargePercent也将是一个不错的选择。
mortalapeman

您可能是Java程序员吗?这显然违反了“不要重复自己”。实际上,除了参数“ 50”之外,您正在重复其他所有操作。如果尝试,我无法提出更严重的违反DRY的示例。
2013年

@boxed您正在考虑我的例子吗?因为我不确定您如何声明我在没有实现时违反了DRY。我是SOLID原则的坚定拥护者,只是不明白您是如何得出这一结论的。
mortalapeman

通过创建不必要的BatteryCharger类违反了DRY,它将以某种方式导致Battery状态改变。因此BatteryCharger将接受一些输入,然后立即将其传递给Battery。
凯文·克莱恩

9

避免双重含义

您故意选择了一个词,该词的含义不止一个,而第一个决定就是问题。对于程序员来说,有很多单词是有问题的。另一个例子是phone。您可以phone有人,也可以phone在口袋里放一个。

使用getter和setter

大多数对象的标准命名是属性的吸气剂/设置方法。

Battery.Charge            // would be a property
Battery.setCharge(value)  // would set the property
Battery.getCharge()       // would get the property

属性是国家而不是名词

我认为您将对象属性归类为名词是错误的,并且变量也可能被认为是状态。它们是与其存在的地方范围相关的州。

您可以将它们持有的值描述为一个名词,但是我不确定在所有情况下都是正确的。

在OOP术语中,对象属性描述该对象的状态。在您的情况下Battery,它是一个对象,并且它Charge是一个状态。因此,这将是对象的属性,但这取决于如何使用它的上下文。

如果您需要能够给Charge电池供电,并且还知道电流Charge是多少,那么您就遇到了问题。

使用范围强制执行上下文

上下文可以澄清您打算传达一种方法或属性的单词的含义。范围是从对象外部设置属性/方法的可访问性。

Batter._charge            // a hidden private property
Battery.setCharge(value)  // would set the private property
Battery.getCharge()       // would get the private property
Battery.Charge()          // would perform the Charge action

方法是动词

您可以将对象的方法描述为动词,但“动作”一词更适合。在OOP术语中,您使用对象的方法对对象执行操作。从对象外部修改对象的属性是一种不好的形式。最好调用一个方法,该方法执行导致其状态改变的所需动作。

这个词Charge是一个动词,但它也是一个名词。当用于调用动作的方法时,很明显就是动词正在被使用Battery.Charge(....)

但是,上下文非常重要。虽然该词Charge()是动词,但意义不如startCharging()

为有效的方法Battery可能包括ChargingDischargingsetChargegetChargehasChargeDischargeCharged

简单的一个词方法往往没有明确说明他们的行动清楚,但也有一些情况下,像openclose在需要一点解释。

因此,如何命名这些类型的属性/方法并没有真正正确的答案。除了需要明智地使用上述技术以确保没有混乱之外。


2
根据记录,客户就是使用歧义术语的客户。没有创造那种混乱。:-)我提出了这个问题,因为我认为我可能不是唯一遇到这种情况的人。您的答案中有一些有效点。在这种特殊情况下,我们没有那个时间粒度工作StartCharge(),并EndCharge()会暗示。实际上,该术语将大大增加处理电池系统的开销。在每个时间间隔可以是Charge()Discharge()

1
主要的工作是保持内部编程语义与客户端使用的术语同步。 Charge恰好是该域中最容易理解的歧义词。还有其他几个。

6

给它们加上动词,使它们成为动词或名词。

Battery.doCharge()

Battery.getCharge()

4

对于动词,我认为Charge还可以。对于名词来说,getCurrentChargeLevel对您有用吗?


不确定。由于我们使用的是C#,因此我们可以在Property上声明get和set,而不需要单独的函数。无论如何,我担心维护以及一旦忘记了编写内容后的外观。会不会getCurrentChargeLevel()仍然需要参考的内部变量Battery,什么会是变量的名称是什么?

充电电压还是百分比?
mhoran_psprep

1
@ GlenH7:啊,我明白了。您没有指定C#,而我的大脑处于Java模式。无论哪种方式,我认为对于表示电池中当前电量的名词来说,类似的东西Battery.currentChargeLevel可能会起作用。您可以尝试使用Battery.coloumbs或,Battery.ampereHours但是可能不太明显...
FrustratedWithFormsDesigner 2013年

1
@mhoran_psprep-两者都不是。;-) ChargeEnergy其是Power(伏*安培==瓦特)乘以时间。因此,在这种情况下,费用是一个数字。还有一种充电状态,恰好是百分比。

@FrustratedWithFormsDesigner-是的,我忽略了C#,因为我认为更广泛的情况适用于任何语言。 Watt*time肯定不会与设计对话保持一致,但是ChargeLevel会。

0

在大多数情况下,添加帮助动词,副词或形容词足以区分它们,并且实际上可以帮助理解。如果将您的Charge和Charge()放在电池上,则DeltaCharge()可以表明它是一个可以处理充电或放电的函数。

Delta(在发生变化但模棱两可的情况下)是我经常使用的修饰语,并向其他人推荐以处理状态变化(即使动词是半明显的)。


0

匈牙利符号进行救援。您可以使用intChargeand fcnCharge(value),从而避免混淆,并且当三个字母都可以正常工作时,不要添加一个疯狂的长名。

或者,您可以只使用相同的名称并让IDE处理它。从长远来看,创建更长的名称或不同的名称可能同样令人困惑。


+1代表答案的独特视角。遗憾的是,根据我们的代码风格指南,匈牙利符号明确地受到了限制。那不会改变您答案的潜在价值,只是我不能将其用作实际解决方案。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.