Java SE 8 viene con un nuevo mecanismo de fechas, la introducción LocalDate
, LocalTime
y LocalDateTime
clases para representar instantes de tiempo. Para manipular esos instantes, se dan una serie de métodos: LocalDate.plusDays(...)
, LocalDate.minusDays(...)
y así sucesivamente.
Siempre he pensado que una buena práctica era nombrar métodos después de los verbos que describen su propósito, ya que los métodos son, en realidad, operaciones a ejecutar, algo que realizará una acción. Solo por mencionar, si se tiene en cuenta las clases como StringBuilder
, por ejemplo, los nombres de los métodos son append
, insert
, delete
...
Es por eso que para mí no suena bien nombrar un método en plusDays
lugar de sumDays
, en minusDays
lugar de subtractDays
. ¿Solo a mí me resulta muy molesto? ¿Qué piensas?
La única razón por la que puedo pensar es que las fechas son objetos inmutables, por lo que al llamar plusDays
no agrega días al objeto original, sino que crea uno nuevo con nuevas propiedades, pero eso es muy sutil.
fuente
sqrt
que toma la raíz cuadrada. Nombrar este métodotakeSqrt
puede parecer tener sentido de acuerdo con su regla, pero nombrarlo no hará que el método sea más legible ni lo aclarará.sqrt
es solo una palabra que los programadores deben reconocer y conocer. La palabra inglesa es "raíz cuadrada" por cierto. Pero nombrar las cosas según lo que es natural en inglés no es bueno. Tome la palabra "ilícito", por ejemplo, una palabra inglesa perfectamente buena. Sin embargo, si alguien nombra su método, digamosisIllicit
que creo que me gustaría arrancarme los globos oculares cada vez que mirara esta llamada al método. Simplemente se ve horrible y tiene que haber una mejor manera de expresar la idea.sum
Suena mal en este contexto. Prefiero .net'sAddDays
.Math.addExact(1, 2)
porque dices "suma 1 y 2".tomorrow.plusDays(2)
porque dices "mañana más 2 días". SiaddExact
fuera miembro deInteger
alguna manera lo hubiera sido1.plusExact(2)
.plusDays
devolver una nueva fecha x número de días en el futuro, mientrasaddDays
que podría esperar mutar el objeto original. Sin embargo, solo soy yo, no estoy tan familiarizado con Java.Respuestas:
Esta es exactamente la razón. Imagine que tiene algún tipo de API para manipular rangos de fechas con fines de programación. Podría exponer métodos que le permitan hacer una declaración como:
Esto se lee de manera muy similar a la declaración en inglés: "El horario de trabajo es el horario inicial sin fines de semana". No implica cambiar el horario inicial, implica que el horario de trabajo es algo nuevo y diferente.
Ahora, en cambio, imagine que se llamaba:
Esto es confuso. ¿Se modifica el horario inicial? Ciertamente suena así, porque parece que estamos eliminando los fines de semana. Pero entonces, ¿por qué lo estamos asignando a una nueva variable? Aunque estos dos esquemas de nomenclatura son muy similares, este es mucho menos claramente evocador de lo que está sucediendo. Esto sería más apropiado si
removeWeekends
lo hizo cambiar la programación inicial, y regresó invalidaría en cuyo casowithoutWeekends
sería la opción confuso.Esto es esencialmente una distinción declarativa versus imperativa. ¿Estamos declarando que
workdaySchedule
es una cosa particular, o estamos llevando a cabo una lista de instrucciones imperativas (como "eliminar") para hacer esa cosa en particular? Por lo general, la denominación imperativa tiene más sentido cuando está mutando valores, y la declarativa tiene más sentido con valores inmutables, como lo demuestra el ejemplo anterior.En tu caso, tienes exactamente lo mismo. Si viera:,
tomorrow.plusDays
no me imagino quetomorrow
está siendo mutado, mientras quetomorrow.addDays
, creo que podría ser. Esto es algo sutil, pero no necesariamente de mala manera. Sin tener que pensarlo demasiado, este nombre naturalmente establece su pensamiento en la línea correcta en términos de si está o no mutando. Para aclarar esta distinción entre estos estilos imperativos y declarativos: "agregar" (y "eliminar") son verbos , mientras que "más" (y "sin") son preposiciones .fuente
addDays
respectoplusDays
ayer! En .NET, laDateTime
clase tiene métodos llamadosaddDays
,addMonths
yaddYears
. Creé un método para analizar una fecha relativa (hace 1 año, 2 meses, 3 días) y llamé a los métodos antes mencionados pensando que estaban modificando elDateTime
objeto actual . Cada fecha en la base de datos terminó el 8 de junio de 2015. "Eso es gracioso", pensé. Fue entonces cuando recordé queaddDays
no modifica elDateTime
objeto, devuelve uno nuevo . Entonces + 1 está por todas partes para esta pregunta.+
y+=
En .NET el nombre es diferente, aunque el resultado es exactamente el mismo. En lugar de:
Ahi esta:
Esto solo significa que las diferencias entre la comprensión de "más" y "sumar" terminaron como una cuestión de opinión personal. Anímate, no estás solo, al menos puedes elegir el idioma que más te guste:)
fuente
Este es probablemente un artefacto del uso de Java
.Method
para todos los métodos, tanto los que modifican el objeto como los que no.Imagine un lenguaje que también tiene una
object=>method
sintaxis, que le daríamethod
una copia del objeto para trabajar. Ahora en ese lenguaje,startDate=>plusDays(5)
es claramente inequívoco. Toma la fecha original y crea una nueva fecha que es 5 días después.En una nota
sumDays
no relacionada, no tiene sentido aquí.LocalDate
es un punto de tiempo , no una duración de tiempo . Puede sumar cualquier cantidad de duraciones (y el resultado es otra duración), y puede agregar un punto de tiempo y una duración (el resultado es otro punto de tiempo), pero no puede sumar puntos de tiempo.fuente