Java SE 8 est livré avec un nouveau mécanisme pour les dates, l' introduction LocalDate
, LocalTime
et des LocalDateTime
classes pour représenter instants de temps. Pour manipuler ces instants, un ensemble de méthodes sont données: LocalDate.plusDays(...)
, LocalDate.minusDays(...)
et ainsi de suite.
J'ai toujours pensé que la bonne pratique consistait à nommer les méthodes après des verbes décrivant leur objectif, car les méthodes sont, en fait, des opérations à exécuter, quelque chose qui exécutera une action. Il suffit de mentionner, si l' on considère les classes comme StringBuilder
, par exemple, les noms de méthodes sont append
, insert
, delete
...
C'est pourquoi pour moi cela ne sonne pas juste de nommer une méthode plusDays
au lieu de sumDays
, minusDays
au lieu de subtractDays
. C'est juste que je trouve ça très ennuyeux? Qu'est-ce que tu penses?
La seule raison pour laquelle je peux penser est que les dates sont des objets immuables, donc en appelant, plusDays
vous n'ajoutez pas de jours à l'objet d'origine mais en créez un nouveau avec de nouvelles propriétés, mais c'est très très subtil.
la source
sqrt
qui prend la racine carrée. Nommer cette méthodetakeSqrt
peut sembler logique selon votre règle, mais la nommer ne rendra pas la méthode plus lisible ni plus claire.sqrt
n'est qu'un mot que les programmeurs doivent reconnaître et connaître. Le mot anglais est "racine carrée" soit dit en passant. Mais nommer les choses en fonction de ce qui est naturel en anglais n'est pas bon. Prenez le mot «illicite», par exemple, un mot anglais parfaitement fin. Cependant, si quelqu'un a nommé sa méthode, disons queisIllicit
je pense que je voudrais arracher mes globes oculaires chaque fois que je regarde cet appel de méthode. Cela a l'air horrible et il doit y avoir une meilleure façon d'exprimer l'idée.sum
sonne mal dans ce contexte. Je préfère les .netAddDays
.Math.addExact(1, 2)
parce que vous dites "ajoutez 1 et 2".tomorrow.plusDays(2)
parce que vous dites "demain plus 2 jours". Si j'avaisaddExact
été membre d'uneInteger
manière ou d'une autre, cela aurait été le cas1.plusExact(2)
.plusDays
à retourner une nouvelle date x nombre de jours dans le futur, alors queaddDays
je pourrais m'attendre à muter l'objet d'origine. C'est juste moi cependant, je ne suis pas très familier avec Java.Réponses:
C'est exactement la raison. Imaginez que vous disposiez d'une sorte d'API pour manipuler des plages de dates à des fins de planification. Il peut exposer des méthodes vous permettant de faire une déclaration comme:
Cela se lit de manière très similaire à la déclaration en anglais: "L'horaire de travail est l'horaire initial sans week-end". Cela n'implique pas de modifier l'horaire initial, cela implique que l'horaire de travail est une chose nouvelle et différente.
Imaginez maintenant qu'il s'appelle:
Ceci est déroutant. L'horaire initial est-il en train d'être modifié? Cela ressemble certainement à cela, car il semble que nous en supprimions les week-ends. Mais alors pourquoi l'attribuons-nous à une nouvelle variable? Bien que ces deux schémas de dénomination soient très similaires, celui-ci évoque beaucoup moins clairement ce qui se passe. Ce serait plus approprié si
removeWeekends
cela changeait le calendrier initial et renvoyait le vide - auquel cas cewithoutWeekends
serait une option déroutante.Il s'agit essentiellement d'une distinction déclarative vs impérative. Est -ce que nous annonçons que la
workdaySchedule
est une chose particulière, ou sommes - nous menons une liste des impératifs instructions pour faire cette chose en particulier (comme « enlever »)? Habituellement, la dénomination impérative a plus de sens lorsque vous mutez des valeurs et déclarative a plus de sens avec des valeurs immuables, comme le montre l'exemple ci-dessus.Dans votre cas, vous avez exactement la même chose. Si je voyais:,
tomorrow.plusDays
je n'imaginerais pas que celatomorrow
est en train de muter, alors quetomorrow.addDays
je pense que c'est possible. C'est quelque peu subtil, mais pas nécessairement dans le mauvais sens. Sans avoir à y penser trop fort, cette dénomination oriente naturellement votre réflexion dans la bonne direction en termes de mutation. Pour clarifier cette distinction entre ces styles impératifs et déclaratifs: "ajouter" (et "supprimer") sont des verbes , tandis que "plus" (et "sans") sont des prépositions .la source
addDays
versusplusDays
hier! Dans .NET, laDateTime
classe a des méthodes appeléesaddDays
,addMonths
etaddYears
. J'ai créé une méthode pour analyser une date relative (il y a 1 an, 2 mois, 3 jours) et j'ai appelé les méthodes susmentionnées en pensant qu'elles modifiaient l'DateTime
objet actuel . Chaque date dans la base de données a fini par être le 8 juin 2015. «C'est drôle», ai-je pensé. C'est alors que je me suis souvenu queaddDays
cela ne modifie pas l'DateTime
objet, il en renvoie un nouveau . Donc, +1 est tout autour pour cette question.+
et+=
Dans .NET, la dénomination est différente bien que le résultat soit exactement le même. Au lieu de:
il y a:
Cela signifie seulement que les différences entre la compréhension de «plus» et «ajouter» sont devenues une question d'opinion personnelle. Réjouissez-vous, vous n'êtes pas seul, au moins vous pouvez choisir la langue qui vous convient le mieux :)
la source
Il s'agit probablement d'un artefact que Java utilise
.Method
pour toutes les méthodes, à la fois celles qui modifient l'objet et celles qui ne le font pas.Imaginez un langage qui possède également une
object=>method
syntaxe, qui donneraitmethod
une copie de l'objet à travailler. Maintenant, dans une telle langue,startDate=>plusDays(5)
est clairement sans ambiguïté. Il prend la date d'origine et crée une nouvelle date qui est 5 jours plus tard.Sur une note indépendante, cela
sumDays
n'a pas de sens ici.LocalDate
est un point temporel , pas une durée . Vous pouvez additionner n'importe quel nombre de durées (et le résultat est une autre durée), et vous pouvez ajouter un point temporel et une durée (le résultat est un autre point temporel), mais vous ne pouvez pas additionner des points temporels.la source