Java SE 8 поставляется с новым механизмом дат, введения LocalDate
, LocalTime
и LocalDateTime
классов для представления моментов времени. Для того, чтобы управлять такими мгновениями, набор методов Дано: LocalDate.plusDays(...)
, LocalDate.minusDays(...)
и так далее.
Я всегда думал, что хорошей практикой было называть методы после глаголов, описывающих их назначение, так как на самом деле методы - это выполняемые операции, то, что будет выполнять действие. Просто говоря, если рассматривать классы как StringBuilder
, например, имена методы являются append
, insert
, delete
...
Вот почему мне кажется неправильным называть метод plusDays
вместо sumDays
, minusDays
вместо subtractDays
. Просто я нахожу это очень раздражающим? Что вы думаете?
Единственная причина, по которой я могу придумать, состоит в том, что даты являются неизменяемыми объектами, поэтому, вызывая, plusDays
вы не добавляете дни к исходному объекту, а создаете новый с новыми свойствами, но это очень и очень тонко.
источник
sqrt
который называется квадратный корень. Наименование этого методаtakeSqrt
может показаться целесообразным в соответствии с вашим правилом, но его наименование не сделает метод более читабельным и не сделает его более понятным.sqrt
это просто слово, которое программисты должны распознавать и знать. Кстати, английское слово «квадратный корень». Но называть вещи в соответствии с тем, что естественно в английском языке, не очень хорошо. Возьмите слово «незаконный», например, прекрасно английское слово. Однако, если кто-то назвал свой метод, скажем,isIllicit
я бы хотел вырвать себе глазные яблоки каждый раз, когда я смотрел на этот вызов метода. Это выглядит просто ужасно, и должен быть лучший способ выразить идею.sum
звучит неправильно в этом контексте. Я предпочитаю .netAddDays
.Math.addExact(1, 2)
потому что вы говорите «добавить 1 и 2».tomorrow.plusDays(2)
потому что вы говорите "завтра плюс 2 дня". Если быaddExact
был членомInteger
каким-то образом, это было бы1.plusExact(2)
.plusDays
бы вернуть новую дату x количество дней в будущем, тогда какaddDays
я мог бы ожидать изменить исходный объект. Хотя это только я, я не настолько знаком с Java.Ответы:
Это как раз причина. Представьте, что у вас есть какой-то API для манипулирования диапазонами дат в целях планирования. Это может предоставить методы, позволяющие вам сделать заявление вроде:
Это очень похоже на английское утверждение: «Расписание рабочего дня - это начальное расписание без выходных». Это не означает изменение первоначального графика, это подразумевает, что график работы - это нечто новое, новое.
Теперь вместо этого представьте, что он был назван:
Это смущает. Изменяется ли первоначальное расписание? Это , конечно , звучит , как это, потому что это звучит , как мы удаление уикэнды из него. Но тогда почему мы присваиваем его новой переменной? Хотя эти две схемы именования очень похожи, эта схема гораздо менее отчетливо напоминает о происходящем. Это было бы более уместно, если
removeWeekends
бы изменилось начальное расписание и вернулось void - в этом случаеwithoutWeekends
будет непонятный вариант.По сути, это декларативное и обязательное различие. Должны ли мы объявить , что
workdaySchedule
это особая вещь, или мы проведение перечень императивных инструкций (как «удалить») , чтобы сделать эту конкретную вещь? Как правило, императивное именование имеет больше смысла, когда вы изменяете значения, а декларативное имеет больше смысла с неизменяемыми значениями, как демонстрирует приведенный выше пример.В твоем случае у тебя точно так же. Если бы я увидел:
tomorrow.plusDays
я бы не подумал, что этоtomorrow
мутировало, тогда какtomorrow.addDays
, я думаю, это могло бы быть. Это несколько неуловимо, но не обязательно плохо. Не думая об этом слишком усердно, это наименование естественным образом настраивает ваше мышление в соответствии с тем, мутируете вы или нет. Чтобы сделать это различие между этими императивными и деклятивными стилями более ясными: «добавить» (и «удалить») - глаголы , тогда как «плюс» (и «без») - предлоги .источник
addDays
противplusDays
вчерашнего дня! В .NET, тоDateTime
класс имеет методы , называемыеaddDays
,addMonths
иaddYears
. Я создал метод для анализа относительной даты (1 год, 2 месяца, 3 дня назад) и вызвал вышеупомянутые методы, думая, что они модифицируют текущийDateTime
объект. Каждая дата в базе данных заканчивалась 8 июня 2015 года. «Это забавно», - подумала я. Вот когда я вспомнил, чтоaddDays
не изменяетDateTime
объект, он возвращает новый . Так что +1 на этот вопрос.+
+=
В .NET наименование отличается, хотя результат точно такой же. Вместо того:
есть:
Это только означает, что различия между пониманием «плюс» и «добавить» заканчивались как личное мнение. Поднимите настроение, вы не одиноки, по крайней мере, вы можете выбрать язык, который вам больше нравится :)
источник
Вероятно, это артефакт Java, используемый
.Method
для всех методов, как тех, которые изменяют объект, так и тех, которые этого не делают.Представьте себе язык, который также имеет
object=>method
синтаксис, который даетmethod
копию объекта для работы. Теперь на таком языке,startDate=>plusDays(5)
явно однозначно. Он берет исходную дату и создает новую дату, которая через 5 дней.На несвязанной ноте,
sumDays
здесь не имеет смысла.LocalDate
это время точка , а не время продолжительности . Вы можете суммировать любое количество длительностей (и результат будет другой продолжительностью), и вы можете добавить точку времени и продолжительность (результат - другая точка времени), но вы не можете суммировать точки времени.источник