Java SE 8 hadir dengan mekanisme baru untuk kencan, memperkenalkan LocalDate
, LocalTime
dan LocalDateTime
kelas - kelas untuk mewakili contoh waktu. Untuk memanipulasi instants tersebut, satu set metode yang diberikan: LocalDate.plusDays(...)
, LocalDate.minusDays(...)
dan sebagainya.
Saya selalu berpikir bahwa praktik yang baik adalah penamaan metode setelah kata kerja yang menggambarkan tujuan mereka, karena metode sebenarnya operasi yang akan dieksekusi, sesuatu yang akan melakukan tindakan. Hanya untuk menyebutkan, jika Anda mempertimbangkan kelas seperti StringBuilder
, misalnya, nama-nama metode yang append
, insert
, delete
...
Inilah sebabnya mengapa untuk saya itu tidak terdengar benar penamaan metode plusDays
bukan sumDays
, minusDays
bukan subtractDays
. Hanya saja saya merasa sangat menjengkelkan? Apa yang kamu pikirkan?
Satu-satunya alasan yang dapat saya pikirkan adalah bahwa tanggal adalah objek yang tidak dapat diubah, jadi dengan menelepon plusDays
Anda tidak menambahkan hari ke objek asli tetapi membuat yang baru dengan properti baru, tapi itu sangat halus.
sumber
sqrt
yang mengambil akar kuadrat. Memberi nama metode initakeSqrt
mungkin masuk akal sesuai dengan aturan Anda, tetapi memberi nama metode ini tidak akan membuat metode ini lebih mudah dibaca juga tidak akan membuatnya lebih jelas.sqrt
hanyalah sebuah kata yang diharapkan untuk dikenali dan diketahui oleh para pemrogram. Ngomong-ngomong, kata bahasa Inggrisnya adalah "akar kuadrat". Tetapi menyebutkan hal-hal yang sesuai dengan apa yang alami dalam bahasa Inggris tidak baik. Ambil kata "terlarang", misalnya, kata bahasa Inggris yang sangat bagus. Namun, jika seseorang memberi nama metode mereka, katakanisIllicit
saya pikir saya ingin merobek bola mata saya setiap kali saya melihat panggilan metode ini. Itu hanya terlihat mengerikan dan harus ada cara yang lebih baik untuk mengekspresikan ide.sum
terdengar salah dalam konteks ini. Saya lebih suka .netAddDays
.Math.addExact(1, 2)
karena Anda mengatakan "tambahkan 1 dan 2".tomorrow.plusDays(2)
karena Anda mengatakan "besok plus 2 hari". JikaaddExact
anggotaInteger
entah bagaimana itu akan terjadi1.plusExact(2)
.plusDays
untuk mengembalikan tanggal baru x jumlah hari ke depan, sedangkanaddDays
saya mungkin berharap untuk bermutasi objek asli. Tapi itu hanya saya, saya tidak begitu akrab dengan Java.Jawaban:
Inilah alasannya. Bayangkan Anda memiliki semacam api untuk memanipulasi rentang tanggal untuk tujuan penjadwalan. Itu mungkin memperlihatkan metode yang memungkinkan Anda membuat pernyataan seperti:
Ini berbunyi sangat mirip dengan pernyataan bahasa Inggris: "Jadwal hari kerja adalah jadwal awal tanpa akhir pekan". Itu tidak berarti mengubah jadwal awal, itu menyiratkan jadwal kerja menjadi hal yang berbeda dan baru.
Sekarang, bayangkan itu dinamai:
Ini membingungkan. Apakah jadwal awal sedang dimodifikasi? Jelas terdengar seperti itu, karena sepertinya kita menghilangkan akhir pekan dari itu. Tapi mengapa kita menugaskannya ke variabel baru? Meskipun kedua skema penamaan ini sangat mirip, yang satu ini jauh lebih jelas menggugah apa yang terjadi. Ini akan lebih tepat jika
removeWeekends
memang mengubah jadwal awal, dan mengembalikan batal- dalam hal iniwithoutWeekends
akan menjadi pilihan yang membingungkan.Ini pada dasarnya adalah perbedaan deklaratif vs imperatif. Apakah kita menyatakan bahwa itu
workdaySchedule
adalah hal tertentu, atau apakah kita melaksanakan daftar instruksi penting (seperti "menghapus") untuk membuat hal itu? Biasanya, penamaan imperatif lebih masuk akal ketika Anda mengubah nilai, dan deklaratif lebih masuk akal dengan nilai yang tidak dapat diubah, seperti ditunjukkan contoh di atas.Dalam kasus Anda, Anda memiliki hal yang persis sama. Jika saya melihat:,
tomorrow.plusDays
saya tidak akan membayangkantomorrow
itu dimutasi, sedangkantomorrow.addDays
, saya pikir itu mungkin terjadi. Ini agak halus - tetapi tidak harus dengan cara yang buruk. Tanpa harus memikirkannya terlalu keras, penamaan ini secara alami membuat Anda berpikir sepanjang garis yang benar dalam hal apakah Anda bermutasi atau tidak. Untuk membuat perbedaan antara gaya imperatif dan deklaritif ini menjadi lebih jelas: "add" (dan "remove") adalah kata kerja , sedangkan "plus" (dan "tanpa") adalah preposisi .sumber
addDays
versusplusDays
kemarin! Di .NET,DateTime
kelas memiliki metode yang disebutaddDays
,addMonths
danaddYears
. Saya membuat metode untuk menguraikan tanggal relatif (1 tahun, 2 bulan, 3 hari yang lalu) dan memanggil metode yang disebutkan di atas dengan berpikir bahwa mereka memodifikasiDateTime
objek saat ini . Setiap tanggal dalam database berakhir pada 8 Juni 2015. "Itu lucu," pikirku. Saat itulah saya ingat bahwaaddDays
tidak memodifikasiDateTime
objek, itu mengembalikan yang baru . Jadi +1 ada di sekitar untuk pertanyaan ini.+
dan+=
Dalam .NET penamaannya berbeda walaupun hasilnya persis sama. Dari pada:
ada:
Ini hanya berarti bahwa perbedaan antara pemahaman "plus" dan "tambah" berakhir sebagai masalah pendapat pribadi. Bergembiralah, Anda tidak sendirian, setidaknya Anda dapat memilih bahasa yang lebih menarik bagi Anda :)
sumber
Ini mungkin artefak Jawa yang digunakan
.Method
untuk semua metode, baik yang memodifikasi objek maupun yang tidak.Bayangkan sebuah bahasa yang juga memiliki
object=>method
sintaks, yang akan memberikanmethod
salinan objek untuk dikerjakan. Sekarang dalam bahasa seperti itu,startDate=>plusDays(5)
jelas tidak ambigu. Dibutuhkan tanggal asli, dan buat tanggal baru 5 hari kemudian.Pada nada yang tidak terkait,
sumDays
tidak masuk akal di sini.LocalDate
adalah titik waktu , bukan durasi waktu . Anda dapat menjumlahkan jumlah durasi (dan hasilnya adalah durasi lain), dan Anda dapat menambahkan titik waktu dan durasi (hasilnya adalah titik waktu lain), tetapi Anda tidak dapat menjumlahkan poin waktu.sumber