I nomi dei metodi appropriati sono "più" e "meno"?

21

Java SE 8 viene fornito con un nuovo meccanismo per le date, che introduce LocalDate , LocalTime e LocalDateTime per rappresentare istanti di tempo. Per manipolare questi istanti, viene fornito un insieme di metodi: LocalDate.plusDays(...) , LocalDate.minusDays(...) e così via.

Ho sempre pensato che la buona pratica fosse denominare i metodi dopo i verbi che descrivono il loro scopo, poiché i metodi sono, in realtà, operazioni da eseguire, qualcosa che eseguirà un'azione. Solo per citare, se consideri classi come StringBuilder , per esempio, i nomi dei metodi sono append , insert , delete ...

Questo è il motivo per cui non sembra corretto nominare un metodo plusDays invece di sumDays , minusDays invece di subtractDays . Sono solo io a trovarlo molto fastidioso? Cosa ne pensi?

L'unica ragione per cui posso pensare è che le date sono oggetti immutabili, quindi chiamando plusDays non aggiungi giorni all'oggetto originale ma ne crei uno nuovo con nuove proprietà, ma è molto molto sottile.

    
posta Luigi Cortese 09.06.2015 - 13:30
fonte

3 risposte

52

The only reason I can think of is that dates are immutable objects, so by calling plusDays you're not adding days to the original object but creating a new one with new properties, but that's very vary subtle.

Questa è esattamente la ragione. Immagina di avere una sorta di API per la manipolazione di intervalli di date per scopi di pianificazione. Potrebbe esporre metodi che ti consentono di formulare una dichiarazione del tipo:

var workdaySchedule = initialSchedule.withoutWeekends();

Questo si legge in modo molto simile alla dichiarazione inglese: "Il programma di lavoro è il programma iniziale senza fine settimana". Non implica modificare la pianificazione iniziale, implica che il programma di lavoro sia una cosa nuova e diversa.

Ora immagina che sia stato nominato:

var workdaySchedule = initialSchedule.removeWeekends();

Questo è confuso. La pianificazione iniziale è stata modificata? Suona sicuramente, perché sembra che stiamo rimuovendo fine settimana da esso. Ma allora perché lo assegniamo a una nuova variabile? Sebbene questi due schemi di denominazione siano molto simili, questo è molto meno evocativo di ciò che sta accadendo. Ciò sarebbe più appropriato se removeWeekends ha modificato la pianificazione iniziale e restituito nulla, in questo caso withoutWeekends sarebbe l'opzione di confusione.

Questa è essenzialmente una distinzione dichiarativa rispetto all'imperativo. Siamo dichiarando che la workdaySchedule è una cosa particolare, o stiamo eseguendo una lista di istruzioni imperative (come "remove") per rendere quella cosa particolare? Solitamente, la denominazione imperativa ha più senso quando si stanno modificando i valori e il dichiarativo ha più senso con valori immutabili, come dimostra l'esempio precedente.

Nel tuo caso, hai esattamente la stessa cosa. Se vedessi: tomorrow.plusDays , non immaginerei che tomorrow sia stato mutato, mentre tomorrow.addDays , penserei che potrebbe essere. Questo è un po ' sottile - ma non necessariamente in modo negativo. Senza doverci pensare troppo, questa denominazione naturalmente imposta il tuo pensiero lungo le linee giuste in termini di se stai mutando o meno. Per rendere più chiara questa distinzione tra questi stili imperativo e dichiarativo: "aggiungi" (e "rimuovi") sono verbi , mentre "più" (e "senza") sono preposizioni .

    
risposta data 09.06.2015 - 13:55
fonte
2

In .NET la denominazione è diversa sebbene il risultato sia esattamente lo stesso. Invece di:

tomorrow = LocalDateTime.plusDays(1);

c'è:

tomorrow = DateTime.Now.AddDays(1);

Questo significa solo che le differenze tra la comprensione di "più" e "aggiungi" sono finite come questioni di opinione personale. Rallegrati, non sei solo, almeno puoi scegliere la lingua che ti piace di più:)

    
risposta data 09.06.2015 - 16:34
fonte
-1

Questo è probabilmente un artefatto di Java che usa .Method per tutti i metodi, sia quelli che modificano l'oggetto che quelli che non lo fanno.

Immagina una lingua che anche ha una sintassi object=>method , che darebbe a method una copia dell'oggetto su cui lavorare. Ora in un tale linguaggio, startDate=>plusDays(5) è chiaramente non ambiguo. Prende la data originale e crea una nuova data che è 5 giorni dopo.

Su una nota non correlata, sumDays non ha senso qui. LocalDate è un tempo punto , non un tempo durata . Puoi sommare qualsiasi numero di durate (e il risultato è un'altra durata), e puoi aggiungere un punto temporale e una durata (il risultato è un altro punto temporale), ma non puoi sommare i punti temporali.

    
risposta data 09.06.2015 - 16:28
fonte

Leggi altre domande sui tag