¿Son los nombres de método "más" y "menos" apropiados?

21

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.

Luigi Cortese
fuente
22
Creo que estás viendo esto demasiado técnicamente. El objetivo real de los nombres de los métodos es dejar en claro lo que hace y hacerlo legible. Simplemente resulta que nombrarlos con verbos normalmente logra estos dos objetivos. Sin embargo, considere un método llamado sqrtque toma la raíz cuadrada. Nombrar este método takeSqrtpuede parecer tener sentido de acuerdo con su regla, pero nombrarlo no hará que el método sea más legible ni lo aclarará.
Brandin
2
La programación no es "inglés". Por ejemplo, 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, digamos isIllicitque 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.
Brandin
18
sumSuena mal en este contexto. Prefiero .net's AddDays.
CodesInChaos
3
@LuigiCortese Los nombres de los métodos se eligen para que coincidan con el orden común de las palabras en inglés. Math.addExact(1, 2)porque dices "suma 1 y 2". tomorrow.plusDays(2)porque dices "mañana más 2 días". Si addExactfuera miembro de Integeralguna manera lo hubiera sido 1.plusExact(2).
Tavian Barnes
8
Personalmente, esperaría plusDaysdevolver una nueva fecha x número de días en el futuro, mientras addDaysque podría esperar mutar el objeto original. Sin embargo, solo soy yo, no estoy tan familiarizado con Java.
Ajedi32

Respuestas:

52

La única razón por la que puedo pensar es que las fechas son objetos inmutables, por lo que al llamar a plusDays no agrega días al objeto original, sino que crea uno nuevo con nuevas propiedades, pero eso es muy sutil.

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:

var workdaySchedule = initialSchedule.withoutWeekends();

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:

var workdaySchedule = initialSchedule.removeWeekends();

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 caso withoutWeekendsserí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 que tomorrowestá siendo mutado, mientras que tomorrow.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 .

Ben Aaronson
fuente
13
En realidad, tuve un problema con addDaysrespecto plusDaysayer! En .NET, la DateTimeclase tiene métodos llamados addDays, addMonthsy addYears. 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 el DateTimeobjeto actual . Cada fecha en la base de datos terminó el 8 de junio de 2015. "Eso es gracioso", pensé. Fue entonces cuando recordé que addDaysno modifica el DateTimeobjeto, devuelve uno nuevo . Entonces + 1 está por todas partes para esta pregunta.
Greg Burghardt
1
@GregBurghardt Como usuario de .NET, tengo expectativas exactamente opuestas. Supongo que esto solo significa que "más" y "agregar" son intercambiables, no asignaciones directas a +y+=
Agent_L
2
@Agent_L Eso es interesante. Dejando de lado las convenciones de .NET, "agregar" y "más" no son intercambiables en inglés.
Ben Aaronson
1
Además, para fechas y horas, es común hablar de D + 1, H + 12 y así sucesivamente al tiempo de referencia relativo a un origen específico (también, para vuelos espaciales T-10, T-9, etc.). Comúnmente, esto se lee como D-plus-1, H-plus-12, T-minus-10. Quizás centrado en los Estados Unidos, pero así es como me parece.
Kristian H
44
Puede encontrar interesante esta vieja pregunta de StackOverflow de Jon Skeet: ¿Cuál es el mejor nombre para un método "agregar" no mutante en una colección inmutable? .
MicSim
2

En .NET el nombre es diferente, aunque el resultado es exactamente el mismo. En lugar de:

tomorrow = LocalDateTime.plusDays(1);

Ahi esta:

tomorrow = DateTime.Now.AddDays(1);

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:)

Agent_L
fuente
-1

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ía methoduna 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.

MSalters
fuente