Java SE 8 viene con un nuevo mecanismo de fechas, la introducción LocalDate, LocalTimey LocalDateTimeclases 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 plusDayslugar de sumDays, en minusDayslugar 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 plusDaysno agrega días al objeto original, sino que crea uno nuevo con nuevas propiedades, pero eso es muy sutil.
fuente

sqrtque toma la raíz cuadrada. Nombrar este métodotakeSqrtpuede parecer tener sentido de acuerdo con su regla, pero nombrarlo no hará que el método sea más legible ni lo aclarará.sqrtes 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, digamosisIllicitque 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.sumSuena 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". SiaddExactfuera miembro deIntegeralguna manera lo hubiera sido1.plusExact(2).plusDaysdevolver una nueva fecha x número de días en el futuro, mientrasaddDaysque 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
removeWeekendslo hizo cambiar la programación inicial, y regresó invalidaría en cuyo casowithoutWeekendssería la opción confuso.Esto es esencialmente una distinción declarativa versus imperativa. ¿Estamos declarando que
workdaySchedulees 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.plusDaysno me imagino quetomorrowestá 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
addDaysrespectoplusDaysayer! En .NET, laDateTimeclase tiene métodos llamadosaddDays,addMonthsyaddYears. 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 elDateTimeobjeto actual . Cada fecha en la base de datos terminó el 8 de junio de 2015. "Eso es gracioso", pensé. Fue entonces cuando recordé queaddDaysno modifica elDateTimeobjeto, 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
.Methodpara todos los métodos, tanto los que modifican el objeto como los que no.Imagine un lenguaje que también tiene una
object=>methodsintaxis, que le daríamethoduna 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
sumDaysno relacionada, no tiene sentido aquí.LocalDatees 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