Java SE 8 jest wyposażony w nowy mechanizm dat wprowadzenia LocalDate
, LocalTime
i LocalDateTime
klas 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 StringBuilder
na przykład nazwy metod są append
, insert
, delete
...
Dlatego dla mnie to nie brzmi prawo nazywania metodę plusDays
zamiast sumDays
, minusDays
zamiast 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.
źródło
sqrt
pierwiastek kwadratowy. Nazywanie tej metodytakeSqrt
może wydawać się sensowne zgodnie z twoją regułą, ale nazywanie jej nie uczyni tej metody bardziej czytelną ani nie uczyni jej bardziej zrozumiałą.sqrt
to 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śisIllicit
nazwał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.sum
w tym kontekście brzmi źle. Wolę .netAddDays
.Math.addExact(1, 2)
ponieważ mówisz „dodaj 1 i 2”.tomorrow.plusDays(2)
ponieważ mówisz „jutro plus 2 dni”. GdybyaddExact
był jakimś członkiem,Integer
tak by było1.plusExact(2)
.plusDays
się zwrócić nową datę x liczbę dni w przyszłość, podczasaddDays
gdy mógłbym oczekiwać mutacji oryginalnego obiektu. To tylko ja, ale ja nie znam się na Javie.Odpowiedzi:
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:
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:
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 przypadkuwithoutWeekends
byłaby opcja mylące.Jest to zasadniczo rozróżnienie deklaratywne i rozkazujące. Czy oświadczamy, że
workdaySchedule
jest 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.plusDays
nie wyobrażam sobie, żetomorrow
to jest mutacjatomorrow.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 .źródło
addDays
versusplusDays
wczoraj! W .NETDateTime
klasa ma metody o nazwieaddDays
,addMonths
iaddYears
. 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żącyDateTime
obiekt. Każda data w bazie danych kończyła się 8 czerwca 2015 r. „To zabawne” - pomyślałem. Wtedy przypomniałem sobie, żeaddDays
nie modyfikujeDateTime
obiektu, zwraca nowy . Więc +1 wokół tego pytania.+
i+=
W .NET nazewnictwo jest inne, chociaż wynik jest dokładnie taki sam. Zamiast:
jest:
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:)
źródło
Jest to prawdopodobnie artefakt języka Java używanego
.Method
do 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=>method
składnię, która dałabymethod
kopię obiektu do pracy. Teraz w takim językustartDate=>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
sumDays
nie ma tutaj sensu.LocalDate
jest 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.źródło