Czy „plus” i „minus” są odpowiednimi nazwami metod?

21

Java SE 8 jest wyposażony w nowy mechanizm dat wprowadzenia LocalDate, LocalTimei LocalDateTimeklas do reprezentowania chwilach czasu. Manipulować takie momenty, zestaw metod podano: LocalDate.plusDays(...), LocalDate.minusDays(...)i tak dalej.

Zawsze myślałem, że dobrą praktyką było nazywanie metod po czasownikach opisujących ich cel, ponieważ metody są w rzeczywistości operacjami do wykonania, czymś, co wykona akcję. Wystarczy wspomnieć, jeśli wziąć pod uwagę zajęcia jak StringBuilderna przykład nazwy metod są append, insert, delete...

Dlatego dla mnie to nie brzmi prawo nazywania metodę plusDayszamiast sumDays, minusDayszamiast subtractDays. Po prostu uważam to za bardzo irytujące? Co myślisz?

Jedynym powodem, dla którego mogę wymyślić, jest to, że daty są niezmiennymi obiektami, więc dzwoniąc plusDays, nie dodajesz dni do oryginalnego obiektu, ale tworzysz nowy z nowymi właściwościami, ale to bardzo subtelne.

Luigi Cortese
źródło
22
Myślę, że patrzysz na to zbyt technicznie. Rzeczywistym celem dla nazw metod jest wyjaśnienie, co robi i uczynienie go czytelnym. Okazuje się, że nazywanie ich czasownikami zwykle pozwala osiągnąć te dwa cele. Rozważ jednak metodę o nazwie sqrtpierwiastek kwadratowy. Nazywanie tej metody takeSqrtmoże wydawać się sensowne zgodnie z twoją regułą, ale nazywanie jej nie uczyni tej metody bardziej czytelną ani nie uczyni jej bardziej zrozumiałą.
Brandin,
2
Programowanie nie jest po angielsku. Na przykład sqrtto tylko słowo, które programiści powinni rozpoznać i poznać. Nawiasem mówiąc, angielskie słowo to „pierwiastek kwadratowy”. Ale nazywanie rzeczy zgodnie z tym, co naturalne w języku angielskim, nie jest dobre. Weźmy na przykład słowo „niedozwolone”, na przykład doskonale angielskie słowo angielskie. Jeśli jednak ktoś isIllicitnazwałby tę metodę, powiedz, że myślę, że chciałbym oderwać oczy za każdym razem, gdy patrzę na to wywołanie metody. Wygląda to po prostu okropnie i musi istnieć lepszy sposób na wyrażenie tego pomysłu.
Brandin,
18
sumw tym kontekście brzmi źle. Wolę .net AddDays.
CodesInChaos
3
@LuigiCortese Nazwy metod są wybierane tak, aby pasowały do ​​typowej angielskiej kolejności słów. Math.addExact(1, 2)ponieważ mówisz „dodaj 1 i 2”. tomorrow.plusDays(2)ponieważ mówisz „jutro plus 2 dni”. Gdyby addExactbył jakimś członkiem, Integertak by było 1.plusExact(2).
Tavian Barnes,
8
Osobiście spodziewałbym plusDayssię zwrócić nową datę x liczbę dni w przyszłość, podczas addDaysgdy mógłbym oczekiwać mutacji oryginalnego obiektu. To tylko ja, ale ja nie znam się na Javie.
Ajedi32,

Odpowiedzi:

52

Jedynym powodem, dla którego mogę wymyślić, jest to, że daty są niezmiennymi obiektami, więc wywołując plusDays, nie dodajesz dni do oryginalnego obiektu, ale tworzysz nowy z nowymi właściwościami, ale to bardzo różni się subtelnie.

To jest dokładnie powód. Wyobraź sobie, że masz jakiś interfejs API do manipulowania zakresami dat do celów planowania. Może to ujawnić metody pozwalające na złożenie oświadczenia takiego jak:

var workdaySchedule = initialSchedule.withoutWeekends();

Brzmi to bardzo podobnie do angielskiego stwierdzenia: „Harmonogram dnia roboczego jest harmonogramem początkowym bez weekendów”. Nie oznacza to zmiany początkowego harmonogramu, oznacza, że ​​harmonogram pracy jest inną, nową rzeczą.

Teraz wyobraź sobie, że to się nazywa:

var workdaySchedule = initialSchedule.removeWeekends();

To jest mylące. Czy modyfikowany jest początkowy harmonogram? Z pewnością tak to brzmi, ponieważ wygląda na to, że usuwamy z niego weekendy. Ale dlaczego przypisujemy ją do nowej zmiennej? Chociaż te dwa schematy nazewnictwa są bardzo podobne, ten o wiele mniej wyraźnie wskazuje na to, co się dzieje. To byłoby bardziej odpowiednie, jeśli removeWeekends nie zmienić początkowy harmonogram i wrócił void- w takim przypadku withoutWeekendsbyłaby opcja mylące.


Jest to zasadniczo rozróżnienie deklaratywne i rozkazujące. Czy oświadczamy, że workdaySchedulejest to konkretna rzecz, czy też wykonujemy listę instrukcji rozkazujących (takich jak „usuń”), aby dokonać tej konkretnej rzeczy? Zwykle nadawanie nazw imperatywnych ma większy sens, gdy mutujesz wartości, a deklaratywne ma więcej sensu z niezmiennymi wartościami, jak pokazuje powyższy przykład.

W twoim przypadku masz dokładnie to samo. Gdybym zobaczył: tomorrow.plusDaysnie wyobrażam sobie, że tomorrowto jest mutacja tomorrow.addDays, ale sądzę, że tak może być. Jest to nieco subtelne, ale niekoniecznie złe. Bez zbytniego zastanawiania się nad tym, nazywanie to naturalnie ustawia twoje myślenie we właściwej linii, jeśli chodzi o to, czy mutujesz, czy nie. Aby wyraźniej odróżnić te imperatywne i deklaratywne style: „dodaj” (i „usuń”) są czasownikami , podczas gdy „plus” (i „bez”) są przyimkami .

Ben Aaronson
źródło
13
I rzeczywiście miał problem z addDaysversus plusDayswczoraj! W .NET DateTimeklasa ma metody o nazwie addDays, addMonthsi addYears. Stworzyłem metodę parsowania względnej daty (1 rok, 2 miesiące, 3 dni temu) i nazwałem wyżej wymienione metody myśląc, że modyfikują one bieżący DateTimeobiekt. Każda data w bazie danych kończyła się 8 czerwca 2015 r. „To zabawne” - pomyślałem. Wtedy przypomniałem sobie, że addDaysnie modyfikuje DateTimeobiektu, zwraca nowy . Więc +1 wokół tego pytania.
Greg Burghardt,
1
@GregBurghardt Jako użytkownik .NET mam dokładnie przeciwne oczekiwania. Myślę, że to oznacza tylko, że „plus” i „dodaj” są wymienne, a nie bezpośrednie mapowania na +i+=
Agent_L
2
@Agent_L To interesujące. Poza konwencjami .NET, „add” i „plus” nie są wymienne w języku angielskim.
Ben Aaronson,
1
Ponadto w przypadku dat i godzin często mówi się o D + 1, H + 12 i tak dalej w odniesieniu do czasu odniesienia w stosunku do określonego miejsca początkowego (również w przypadku lotu kosmicznego T-10, T-9 itp.). Zwykle jest to odczytywane jako D-plus-1, H-plus-12, T-minus-10. Może koncentruje się na USA, ale tak mi się wydaje.
Kristian H
4
Ciekawe może być to stare pytanie StackOverflow Jona Skeeta: Jaka jest najlepsza nazwa niemutującej metody „dodawania” w niezmiennej kolekcji? .
MicSim
2

W .NET nazewnictwo jest inne, chociaż wynik jest dokładnie taki sam. Zamiast:

tomorrow = LocalDateTime.plusDays(1);

jest:

tomorrow = DateTime.Now.AddDays(1);

Oznacza to tylko, że różnice między rozumieniem „plus” i „dodaj” skończyły się na osobistej opinii. Pociesz się, nie jesteś sam, przynajmniej możesz wybrać język, który bardziej ci odpowiada:)

Agent_L
źródło
-1

Jest to prawdopodobnie artefakt języka Java używanego .Methoddo wszystkich metod, zarówno tych, które modyfikują obiekt, jak i tych, które tego nie robią.

Wyobraź sobie język, który również ma object=>methodskładnię, która dałaby methodkopię obiektu do pracy. Teraz w takim języku startDate=>plusDays(5)jest wyraźnie jednoznaczne. Pobiera oryginalną datę i tworzy nową datę, która jest 5 dni później.

W odniesieniu do niepowiązanej nuty sumDaysnie ma tutaj sensu. LocalDatejest punktem czasowym , a nie czasem trwania . Możesz zsumować dowolną liczbę czasów trwania (a wynikiem jest inny czas trwania), a także możesz dodać punkt czasowy i czas trwania (wynikiem jest inny punkt czasowy), ale nie możesz sumować punktów czasowych.

MSalters
źródło