Являются ли «плюс» и «минус» подходящими именами методов?

21

Java SE 8 поставляется с новым механизмом дат, введения LocalDate, LocalTimeи LocalDateTimeклассов для представления моментов времени. Для того, чтобы управлять такими мгновениями, набор методов Дано: LocalDate.plusDays(...), LocalDate.minusDays(...)и так далее.

Я всегда думал, что хорошей практикой было называть методы после глаголов, описывающих их назначение, так как на самом деле методы - это выполняемые операции, то, что будет выполнять действие. Просто говоря, если рассматривать классы как StringBuilder, например, имена методы являются append, insert, delete...

Вот почему мне кажется неправильным называть метод plusDaysвместо sumDays, minusDaysвместо subtractDays. Просто я нахожу это очень раздражающим? Что вы думаете?

Единственная причина, по которой я могу придумать, состоит в том, что даты являются неизменяемыми объектами, поэтому, вызывая, plusDaysвы не добавляете дни к исходному объекту, а создаете новый с новыми свойствами, но это очень и очень тонко.

Луиджи Кортезе
источник
22
Я думаю, что вы смотрите на это слишком технически. Фактическая цель для имен методов состоит в том, чтобы прояснить, что он делает, и сделать его читабельным. Просто получается, что присвоение им глаголов обычно выполняет эти две цели. Однако рассмотрим метод, sqrtкоторый называется квадратный корень. Наименование этого метода takeSqrtможет показаться целесообразным в соответствии с вашим правилом, но его наименование не сделает метод более читабельным и не сделает его более понятным.
Брандин
2
Программирование не "английский". Например, sqrtэто просто слово, которое программисты должны распознавать и знать. Кстати, английское слово «квадратный корень». Но называть вещи в соответствии с тем, что естественно в английском языке, не очень хорошо. Возьмите слово «незаконный», например, прекрасно английское слово. Однако, если кто-то назвал свой метод, скажем, isIllicitя бы хотел вырвать себе глазные яблоки каждый раз, когда я смотрел на этот вызов метода. Это выглядит просто ужасно, и должен быть лучший способ выразить идею.
Брандин
18
sumзвучит неправильно в этом контексте. Я предпочитаю .net AddDays.
CodesInChaos
3
@LuigiCortese Имена методов выбираются так, чтобы они соответствовали общему английскому порядку слов. Math.addExact(1, 2)потому что вы говорите «добавить 1 и 2». tomorrow.plusDays(2)потому что вы говорите "завтра плюс 2 дня". Если бы addExactбыл членом Integerкаким-то образом, это было бы 1.plusExact(2).
Тавиан Барнс
8
Лично я ожидал plusDaysбы вернуть новую дату x количество дней в будущем, тогда как addDaysя мог бы ожидать изменить исходный объект. Хотя это только я, я не настолько знаком с Java.
Ajedi32

Ответы:

52

Единственная причина, по которой я могу придумать, состоит в том, что даты являются неизменяемыми объектами, поэтому, вызывая plusDays, вы не добавляете дни к исходному объекту, а создаете новый с новыми свойствами, но это очень незначительно.

Это как раз причина. Представьте, что у вас есть какой-то API для манипулирования диапазонами дат в целях планирования. Это может предоставить методы, позволяющие вам сделать заявление вроде:

var workdaySchedule = initialSchedule.withoutWeekends();

Это очень похоже на английское утверждение: «Расписание рабочего дня - это начальное расписание без выходных». Это не означает изменение первоначального графика, это подразумевает, что график работы - это нечто новое, новое.

Теперь вместо этого представьте, что он был назван:

var workdaySchedule = initialSchedule.removeWeekends();

Это смущает. Изменяется ли первоначальное расписание? Это , конечно , звучит , как это, потому что это звучит , как мы удаление уикэнды из него. Но тогда почему мы присваиваем его новой переменной? Хотя эти две схемы именования очень похожи, эта схема гораздо менее отчетливо напоминает о происходящем. Это было бы более уместно, если removeWeekends бы изменилось начальное расписание и вернулось void - в этом случае withoutWeekendsбудет непонятный вариант.


По сути, это декларативное и обязательное различие. Должны ли мы объявить , что workdayScheduleэто особая вещь, или мы проведение перечень императивных инструкций (как «удалить») , чтобы сделать эту конкретную вещь? Как правило, императивное именование имеет больше смысла, когда вы изменяете значения, а декларативное имеет больше смысла с неизменяемыми значениями, как демонстрирует приведенный выше пример.

В твоем случае у тебя точно так же. Если бы я увидел: tomorrow.plusDaysя бы не подумал, что это tomorrowмутировало, тогда как tomorrow.addDays, я думаю, это могло бы быть. Это несколько неуловимо, но не обязательно плохо. Не думая об этом слишком усердно, это наименование естественным образом настраивает ваше мышление в соответствии с тем, мутируете вы или нет. Чтобы сделать это различие между этими императивными и деклятивными стилями более ясными: «добавить» (и «удалить») - глаголы , тогда как «плюс» (и «без») - предлоги .

Бен Ааронсон
источник
13
Я на самом деле была проблема с addDaysпротив plusDaysвчерашнего дня! В .NET, то DateTimeкласс имеет методы , называемые addDays, addMonthsи addYears. Я создал метод для анализа относительной даты (1 год, 2 месяца, 3 дня назад) и вызвал вышеупомянутые методы, думая, что они модифицируют текущий DateTimeобъект. Каждая дата в базе данных заканчивалась 8 июня 2015 года. «Это забавно», - подумала я. Вот когда я вспомнил, что addDaysне изменяет DateTimeобъект, он возвращает новый . Так что +1 на этот вопрос.
Грег Бургхардт
1
@GregBurghardt Как пользователь .NET, у меня совершенно противоположные ожидания. Я предполагаю, что это только означает, что «плюс» и «добавить» являются ++=
взаимозаменяемыми
2
@Agent_L Это интересно. Помимо соглашений .NET, «добавить» и «плюс» не являются взаимозаменяемыми на английском языке.
Бен Ааронсон
1
Кроме того, для дат и времени довольно часто говорят о D + 1, H + 12 и т. Д., Чтобы ссылаться на время относительно определенного источника (также, для космического полета T-10, T-9 и т. Д.). Обычно это читается как D-плюс-1, H-плюс-12, T-минус-10. Может быть, в США, но мне так кажется.
Кристиан Х
4
Вам может показаться интересным старый вопрос StackOverflow о Джоне Ските: как лучше всего назвать неизменяющий метод add в неизменяемой коллекции? ,
MicSim
2

В .NET наименование отличается, хотя результат точно такой же. Вместо того:

tomorrow = LocalDateTime.plusDays(1);

есть:

tomorrow = DateTime.Now.AddDays(1);

Это только означает, что различия между пониманием «плюс» и «добавить» заканчивались как личное мнение. Поднимите настроение, вы не одиноки, по крайней мере, вы можете выбрать язык, который вам больше нравится :)

Agent_L
источник
-1

Вероятно, это артефакт Java, используемый .Methodдля всех методов, как тех, которые изменяют объект, так и тех, которые этого не делают.

Представьте себе язык, который также имеет object=>methodсинтаксис, который дает methodкопию объекта для работы. Теперь на таком языке,startDate=>plusDays(5) явно однозначно. Он берет исходную дату и создает новую дату, которая через 5 дней.

На несвязанной ноте, sumDaysздесь не имеет смысла. LocalDateэто время точка , а не время продолжительности . Вы можете суммировать любое количество длительностей (и результат будет другой продолжительностью), и вы можете добавить точку времени и продолжительность (результат - другая точка времени), но вы не можете суммировать точки времени.

MSalters
источник