“加号”和“减号”是否合适?


21

的Java SE 8自带的日期,引入了新的机制LocalDateLocalTime以及LocalDateTime类来表示的时刻。为了操纵这些瞬间,给出了一组方法:LocalDate.plusDays(...)LocalDate.minusDays(...)依此类推。

我一直认为,好的做法是在动词后描述方法的目的来命名方法,因为方法实际上是要执行的操作,它们会执行某种动作。刚才说了,如果你考虑类,比如StringBuilder,例如,方法的名字是appendinsertdelete...

这就是为什么我不健全的权利命名的方法plusDays来代替sumDaysminusDays而不是subtractDays。只是我觉得很烦吗?你怎么看?

我能想到的唯一原因是日期是不可变的对象,因此通过调用plusDays您不是在原始对象上添加日期,而是创建具有新属性的新对象,但这非常微妙。


22
我认为您是从技术角度来看这个问题。方法名称的实际目标是明确其作用并使其可读。事实证明,用动词命名通常可以实现这两个目标。但是,考虑一种称为sqrt平方根的方法。takeSqrt根据您的规则,命名此方法似乎很有意义,但是命名它不会使方法更具可读性,也不会使其更清晰。
布兰丁

2
编程不是“英语”。例如,sqrt这只是程序员应该认识并知道的一个单词。顺带一提,英语单词是“ square root”。但是,按照英语的自然命名方式不好。以“非法”一词为例,这是一个非常好的英语单词。但是,如果有人命名了他们的方法,请说isIllicit我想我想在每次查看此方法调用时都将眼球撕掉。它看起来很糟糕,必须有一种更好的方式来表达这个想法。
布兰丁

18
sum在这种情况下听起来是错误的。我更喜欢.net的AddDays
CodesInChaos 2015年

3
@LuigiCortese选择方法名称以匹配常见的英语单词顺序。 Math.addExact(1, 2)因为您说“加1和2”。 tomorrow.plusDays(2)因为您说“明天再加上2天”。如果addExactInteger某种原因的成员1.plusExact(2)
塔维安·巴恩斯

8
就个人而言,我希望plusDays返回一个新的日期x未来的天数,而addDays我可能希望对原始对象进行突变。虽然那只是我,但我对Java并不那么熟悉。
Ajedi32

Answers:


52

我能想到的唯一原因是日期是不可变的对象,因此,调用plusDays不会在原始对象上添加日期,而是创建具有新属性的新对象,但这非常细微。

这正是原因。想象一下,您有某种用于调度日期范围的api。它可能会公开一些使您做出如下声明的方法:

var workdaySchedule = initialSchedule.withoutWeekends();

这与英文陈述非常相似:“工作日时间表是没有周末的初始时间表”。这并不意味着更改初始计划,而是意味着工作计划是另一种新事物。

现在假设它被命名为:

var workdaySchedule = initialSchedule.removeWeekends();

这很混乱。初始时间表是否已修改?听起来确实像这样,因为听起来好像我们要从中删除周末。但是,为什么我们将其分配给新变量呢?尽管这两种命名方案非常相似,但这种命名方式对所发生的事情的回想要少得多。如果removeWeekends 确实更改了初始计划,并返回了void,则这种方法会更合适- 在这种情况下,这withoutWeekends将是令人困惑的选择。


这本质上是声明式与命令式的区别。我们是在声明workdaySchedule是一件特定的事情,还是在执行命令指令列表(例如“删除”)来制造一件特定的事情?通常,命令变量在更改值时更有意义,而声明式则在不可变值时更有意义,如上面的示例所示。

就您而言,您拥有完全相同的东西。如果我看到:tomorrow.plusDays,我不会认为这tomorrow是突变的,而tomorrow.addDays我认为可能是这样。这有些微妙,但不一定是不好的方式。不必太费力地思考,这种命名自然可以使您根据是否要变异来正确思考。为了使这些命令式和声明式之间的区别更清楚:“ add”(和“ remove”)是动词,而“ plus”(和“ without”)是介词


13
addDaysplusDays昨天真的有问题!在.NET中,DateTime类有方法叫addDaysaddMonthsaddYears。我创建了一种方法来解析相对日期(1年,2个月,3天前),并称上述方法为它们正在修改当前DateTime对象。数据库中的每个日期最终都是2015年6月8日。“这很有趣,”我想。那是在我记得addDays没有修改该DateTime对象时,它返回了一个对象。所以+1都是这个问题。
Greg Burghardt

1
@GregBurghardt作为.NET用户,我有完全相反的期望。我猜这仅意味着“ plus”和“ add”是可交换的,而不是直接映射到+and+=
Agent_L 2015年

2
@Agent_L有趣。除了.NET约定外,“ add”和“ plus”在英语中不可互换。
Ben Aaronson

1
同样,对于日期和时间,通常会说D + 1,H + 12等相对于特定起点的参考时间(对于航天飞机T-10,T-9等)。通常,这被读为D加1,H加12,T减10。也许以美国为中心,但这对我来说就是这样。
克里斯蒂安H

4
您可能会发现Jon Skeet的这个古老的StackOverflow问题很有趣:在不可变集合上使用不变异的“ add”方法的最佳名称是什么?
MicSim 2015年

2

在.NET中,命名是不同的,尽管结果是完全相同的。代替:

tomorrow = LocalDateTime.plusDays(1);

有:

tomorrow = DateTime.Now.AddDays(1);

这仅意味着对“加”和“加”的理解之间的差异最终取决于个人意见。振作起来,您并不孤单,至少您可以选择对您更有吸引力的语言:)


-1

这可能是Java的人工产物,可.Method用于所有方法,包括修改对象的方法和未修改方法的方法。

想象一下一种语言,它具有一种object=>method语法,该语法可以提供method要处理的对象的副本。现在用这种语言,startDate=>plusDays(5)显然是毫不含糊的。它采用原始日期,并创建5天后的新日期。

无关紧要的是,sumDays这里没有意义。LocalDate是一个时间,而不是持续时间。您可以对任意多个持续时间求和(结果是另一个持续时间),可以添加一个时间点和一个持续时间(结果是另一个时间点),但是不能对时间点求和。

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.