Java SE 8 kommt mit einem neuen Mechanismus für Daten, die Einführung LocalDate
, LocalTime
und LocalDateTime
Klassen Zeitmomente darzustellen. Um einen solchen Zeitpunkten eine Reihe von Methoden zu manipulieren sind gegeben: LocalDate.plusDays(...)
, LocalDate.minusDays(...)
und so weiter.
Ich habe immer gedacht, dass gute Praxis darin besteht, Methoden nach Verben zu benennen, die ihren Zweck beschreiben, da Methoden tatsächlich auszuführende Operationen sind, die eine Aktion ausführen . Nur zu erwähnen, wenn Sie Klassen wie betrachten StringBuilder
, zum Beispiel Methoden Namen sind append
, insert
, delete
...
Aus diesem Grunde ist es mir nicht richtig klingen , ein Verfahren zu benennen plusDays
statt sumDays
, minusDays
statt subtractDays
. Ich finde es nur sehr ärgerlich? Was denkst du?
Der einzige Grund, den ich mir vorstellen kann, ist, dass Datumsangaben unveränderliche Objekte sind. Wenn Sie also aufrufen plusDays
, fügen Sie dem ursprünglichen Objekt keine Tage hinzu, sondern erstellen ein neues Objekt mit neuen Eigenschaften. Dies ist jedoch sehr subtil.
quelle
sqrt
die die Quadratwurzel nimmt. Die Benennung dieser MethodetakeSqrt
mag nach Ihrer Regel sinnvoll erscheinen, aber die Benennung würde die Methode weder lesbarer noch klarer machen.sqrt
ist es nur ein Wort, das Programmierer erkennen und kennen müssen. Das englische Wort ist übrigens "Quadratwurzel". Aber Dinge nach dem zu benennen, was im Englischen selbstverständlich ist, ist nicht gut. Nehmen wir zum Beispiel das Wort "illegal", ein perfektes englisches Wort. Wenn jedoch jemand seine Methode benennt, kannisIllicit
ich sagen, dass ich bei jedem Blick auf diesen Methodenaufruf meine Augäpfel herausreißen möchte. Es sieht einfach schrecklich aus und es muss einen besseren Weg geben, die Idee auszudrücken.sum
klingt in diesem Zusammenhang falsch. Ich bevorzuge .netAddDays
.Math.addExact(1, 2)
weil du sagst "addiere 1 und 2".tomorrow.plusDays(2)
weil du sagst "morgen plus 2 tage". WennaddExact
ein Mitglied vonInteger
irgendwie gewesen wäre, wäre es gewesen1.plusExact(2)
.plusDays
, ein neues Datum x Anzahl von Tagen in die Zukunft zurückzugeben, wohingegenaddDays
ich erwarten könnte, das ursprüngliche Objekt zu mutieren. Das bin nur ich, ich kenne mich mit Java nicht so gut aus.Antworten:
Das ist genau der Grund. Stellen Sie sich vor, Sie hätten eine Art API, um Datumsbereiche für Planungszwecke zu bearbeiten. Möglicherweise werden Methoden angezeigt, mit denen Sie eine Aussage machen können wie:
Dies liest sich sehr ähnlich wie die englische Aussage: "Der Arbeitstag-Zeitplan ist der ursprüngliche Zeitplan ohne Wochenenden". Dies bedeutet nicht, dass der anfängliche Zeitplan geändert wird, sondern dass der Arbeitszeitplan eine andere, neue Sache ist.
Stellen Sie sich stattdessen vor, es wurde benannt:
Das ist verwirrend. Wird der ursprüngliche Zeitplan geändert? Es klingt auf jeden Fall so, denn es klingt so, als würden wir die Wochenenden davon abhalten. Aber warum ordnen wir es dann einer neuen Variablen zu? Obwohl diese beiden Benennungsschemata sehr ähnlich sind, ist dieses viel weniger deutlich, was passiert. Dies wäre besser geeignet , wenn
removeWeekends
tat den ursprünglichen Zeitplan ändern, und kehrte void- wobei in diesem FallwithoutWeekends
die verwirrende Option wäre.Dies ist im Wesentlichen eine Unterscheidung zwischen deklarativ und imperativ. Erklären wir , dass die
workdaySchedule
eine bestimmte Sache ist, oder führen wir eine Liste von zwingenden Anweisungen (wie "Entfernen") aus, um diese bestimmte Sache zu machen? Normalerweise ist die imperative Benennung sinnvoller, wenn Sie Werte ändern, und die deklarative Benennung ist sinnvoller, wenn Sie unveränderliche Werte verwenden, wie das obige Beispiel zeigt.In Ihrem Fall haben Sie genau das gleiche. Wenn ich sehen
tomorrow.plusDays
würde, würde ich mir nicht vorstellen, dasstomorrow
das mutiert ist, obwohltomorrow.addDays
ich denke, dass es das sein könnte. Das ist etwas subtil, aber nicht unbedingt schlecht. Ohne zu sehr darüber nachdenken zu müssen, setzt diese Benennung Ihr Denken natürlich in Bezug darauf, ob Sie mutieren oder nicht, in die richtige Richtung. Um diese Unterscheidung zwischen imperativem und deklarativem Stil deutlicher zu machen: "add" (und "remove") sind Verben , wohingegen "plus" (und "without") Präpositionen sind .quelle
addDays
gegenüberplusDays
gestern! In .NET, dasDateTime
hat Klasse Methoden genanntaddDays
,addMonths
undaddYears
. Ich habe eine Methode zum Auslesen eines relativen Datums (vor 1 Jahr, 2 Monaten, 3 Tagen) erstellt und die oben genannten Methoden aufgerufen, in der Annahme, dass sie das aktuelleDateTime
Objekt modifizieren . Jedes Datum in der Datenbank war der 8. Juni 2015. "Das ist lustig", dachte ich. Das war, als ich mich erinnerte, dassaddDays
dasDateTime
Objekt nicht geändert wurde , sondern ein neues zurückgegeben wurde . Für diese Frage gibt es also überall +1.+
und+=
In .NET ist die Benennung unterschiedlich, obwohl das Ergebnis genau gleich ist. Anstatt:
es gibt:
Dies bedeutet nur, dass Unterschiede zwischen dem Verständnis von "Plus" und "Addieren" als Frage der persönlichen Meinung entstanden sind. Aufmuntern, du bist nicht allein, zumindest kannst du die Sprache wählen, die dich besser anspricht:)
quelle
Dies ist wahrscheinlich ein Artefakt von Java, das
.Method
für alle Methoden verwendet wird, sowohl für diejenigen, die das Objekt ändern, als auch für diejenigen, die dies nicht tun.Stellen Sie sich eine Sprache , die auch eine hat
object=>method
Syntax, die geben würde ,method
auf einer Kopie des Objekts an der Arbeit. Jetzt in einer solchen Sprache,startDate=>plusDays(5)
eindeutig. Es wird das ursprüngliche Datum verwendet und ein neues Datum erstellt, das 5 Tage später liegt.In einem anderen
sumDays
Sinne ergibt das hier keinen Sinn.LocalDate
ist ein Zeitpunkt , eine Zeit , nicht Dauer . Sie können eine beliebige Anzahl von Dauern summieren (und das Ergebnis ist eine andere Dauer) und Sie können einen Zeitpunkt und eine Dauer hinzufügen (Ergebnis ist ein anderer Zeitpunkt), aber Sie können keine Zeitpunkte summieren.quelle