Java SE 8 vem com um novo mecanismo para datas, introduzindo LocalDate
, LocalTime
e LocalDateTime
classes para representar instantes de tempo. Para manipular tais instantes, um conjunto de métodos são dadas: LocalDate.plusDays(...)
, LocalDate.minusDays(...)
e assim por diante.
Sempre achei que a boa prática era nomear métodos após verbos que descrevem seu objetivo, pois métodos são, na verdade, operações a serem executadas, algo que executará uma ação. Só para citar, se você considerar aulas como StringBuilder
, por exemplo, os nomes dos métodos são append
, insert
, delete
...
É por isso que, para mim, não parece certo nomear um método plusDays
em vez de sumDays
, minusDays
em vez de subtractDays
. Só eu acho isso muito chato? O que você acha?
A única razão pela qual consigo pensar é que as datas são objetos imutáveis; portanto, chamando plusDays
você não está adicionando dias ao objeto original, mas criando um novo com novas propriedades, mas isso é muito sutil.
fonte
sqrt
que leva a raiz quadrada. Nomear esse métodotakeSqrt
pode parecer fazer sentido de acordo com sua regra, mas nomeá-lo não tornaria o método mais legível nem mais claro.sqrt
é apenas uma palavra que os programadores devem reconhecer e conhecer. A palavra em inglês é "raiz quadrada" a propósito. Mas nomear as coisas de acordo com o que é natural em inglês não é bom. Tome a palavra "ilícito", por exemplo, uma palavra perfeitamente inglesa. No entanto, se alguém nomear seu método, digaisIllicit
que acho que gostaria de arrancar meus olhos toda vez que observasse essa chamada de método. Parece horrível e deve haver uma maneira melhor de expressar a idéia.sum
parece errado neste contexto. Eu prefiro .net'sAddDays
.Math.addExact(1, 2)
porque você diz "adicione 1 e 2".tomorrow.plusDays(2)
porque você diz "amanhã mais 2 dias". SeaddExact
fosse um membro deInteger
alguma forma, teria sido1.plusExact(2)
.plusDays
retornar uma nova data x número de dias no futuro, enquantoaddDays
eu poderia esperar que o objeto original fosse alterado. Mas sou apenas eu, não estou tão familiarizado com Java.Respostas:
Esta é exatamente a razão. Imagine que você tivesse algum tipo de API para manipular intervalos de datas para fins de agendamento. Pode expor métodos que permitem fazer uma declaração como:
É semelhante à declaração em inglês: "O horário do dia de trabalho é o horário inicial sem fins de semana". Isso não implica alterar o cronograma inicial, implica que o cronograma de trabalho seja uma coisa nova e diferente.
Agora imagine o nome:
Isso é confuso. A programação inicial está sendo modificada? Certamente parece, porque parece que estamos removendo fins de semana. Mas então por que estamos atribuindo isso a uma nova variável? Embora esses dois esquemas de nomeação sejam muito semelhantes, este é muito menos claramente evocativo do que está acontecendo. Isso seria mais apropriado se
removeWeekends
fez mudar a programação inicial, e voltou void- caso em quewithoutWeekends
seria a opção confuso.Esta é essencialmente uma distinção declarativa x imperativa. Estamos declarando que isso
workdaySchedule
é uma coisa específica ou estamos executando uma lista de instruções imperativas (como "remover") para fazer essa coisa em particular? Geralmente, a nomeação imperativa faz mais sentido quando você está alterando valores, e declarativa faz mais sentido com valores imutáveis, como o exemplo acima demonstra.No seu caso, você tem exatamente a mesma coisa. Se eu visse:,
tomorrow.plusDays
eu não imaginaria que issotomorrow
estava sendo modificado, enquantotomorrow.addDays
eu acho que poderia estar. Isso é um tanto sutil - mas não necessariamente de uma maneira ruim. Sem ter que pensar muito sobre isso, essa nomeação naturalmente define o seu pensamento na linha certa em termos de se você está ou não mudando. Para tornar mais clara essa distinção entre esses estilos imperativo e declarativo: "adicionar" (e "remover") são verbos , enquanto "mais" (e "sem") são preposições .fonte
addDays
relaçãoplusDays
ontem! No .NET, aDateTime
classe possui métodos chamadosaddDays
,addMonths
eaddYears
. Criei um método para analisar uma data relativa (1 ano, 2 meses, 3 dias atrás) e chamei os métodos mencionados pensando que estavam modificando oDateTime
objeto atual . Todas as datas no banco de dados terminavam em 8 de junho de 2015. "Isso é engraçado", pensei. Foi quando me lembrei queaddDays
não modifica oDateTime
objeto, ele retorna um novo . Então, +1 está ao redor para esta pergunta.+
e+=
No .NET, a nomeação é diferente, embora o resultado seja exatamente o mesmo. Ao invés de:
Há sim:
Isso significa apenas que as diferenças entre a compreensão de "mais" e "adicionar" acabaram sendo uma questão de opinião pessoal. Anime-se, você não está sozinho, pelo menos você pode escolher o idioma que mais lhe agrada:)
fonte
Provavelmente, este é um artefato de Java usado
.Method
para todos os métodos, tanto os que modificam o objeto quanto os que não.Imagine uma linguagem que também tenha uma
object=>method
sintaxe, que dariamethod
uma cópia do objeto no qual trabalhar. Agora, nesse idioma,startDate=>plusDays(5)
é claramente inequívoco. Leva a data original e cria uma nova data que é 5 dias depois.Em uma nota
sumDays
não relacionada, não faz sentido aqui.LocalDate
é um ponto no tempo , não uma duração . Você pode somar qualquer número de durações (e o resultado é outra duração) e adicionar um ponto no tempo e uma duração (o resultado é outro ponto no tempo), mas não é possível somar pontos no tempo.fonte