Apakah "plus" dan "minus" nama metode yang sesuai?

21

Java SE 8 hadir dengan mekanisme baru untuk kencan, memperkenalkan LocalDate, LocalTimedan LocalDateTimekelas - 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 plusDaysbukan sumDays, minusDaysbukan 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 plusDaysAnda tidak menambahkan hari ke objek asli tetapi membuat yang baru dengan properti baru, tapi itu sangat halus.

Luigi Cortese
sumber
22
Saya pikir Anda melihat ini terlalu teknis. Tujuan sebenarnya untuk nama metode adalah memperjelas apa yang dilakukannya dan membuatnya mudah dibaca. Ternyata penamaan mereka dengan kata kerja biasanya mencapai dua tujuan ini. Namun, pertimbangkan metode yang disebut sqrtyang mengambil akar kuadrat. Memberi nama metode ini takeSqrtmungkin 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.
Brandin
2
Pemrograman bukan "Bahasa Inggris". Sebagai contoh, sqrthanyalah 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, katakan isIllicitsaya 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.
Brandin
18
sumterdengar salah dalam konteks ini. Saya lebih suka .net AddDays.
CodesInChaos
3
@LuigiCortese Nama metode dipilih agar sesuai dengan urutan kata dalam bahasa Inggris. Math.addExact(1, 2)karena Anda mengatakan "tambahkan 1 dan 2". tomorrow.plusDays(2)karena Anda mengatakan "besok plus 2 hari". Jika addExactanggota Integerentah bagaimana itu akan terjadi 1.plusExact(2).
Tavian Barnes
8
Secara pribadi, saya berharap plusDaysuntuk mengembalikan tanggal baru x jumlah hari ke depan, sedangkan addDayssaya mungkin berharap untuk bermutasi objek asli. Tapi itu hanya saya, saya tidak begitu akrab dengan Java.
Ajedi32

Jawaban:

52

Satu-satunya alasan yang dapat saya pikirkan adalah bahwa tanggal adalah objek yang tidak dapat diubah, jadi dengan memanggil plusDays Anda tidak menambahkan hari ke objek asli tetapi membuat yang baru dengan properti baru, tapi itu sangat bervariasi secara halus.

Inilah alasannya. Bayangkan Anda memiliki semacam api untuk memanipulasi rentang tanggal untuk tujuan penjadwalan. Itu mungkin memperlihatkan metode yang memungkinkan Anda membuat pernyataan seperti:

var workdaySchedule = initialSchedule.withoutWeekends();

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:

var workdaySchedule = initialSchedule.removeWeekends();

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 ini withoutWeekendsakan menjadi pilihan yang membingungkan.


Ini pada dasarnya adalah perbedaan deklaratif vs imperatif. Apakah kita menyatakan bahwa itu workdayScheduleadalah 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.plusDayssaya tidak akan membayangkan tomorrowitu dimutasi, sedangkan tomorrow.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 .

Ben Aaronson
sumber
13
Saya sebenarnya punya masalah dengan addDaysversus plusDayskemarin! Di .NET, DateTimekelas memiliki metode yang disebut addDays, addMonthsdan addYears. 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 memodifikasi DateTimeobjek saat ini . Setiap tanggal dalam database berakhir pada 8 Juni 2015. "Itu lucu," pikirku. Saat itulah saya ingat bahwa addDaystidak memodifikasi DateTimeobjek, itu mengembalikan yang baru . Jadi +1 ada di sekitar untuk pertanyaan ini.
Greg Burghardt
1
@GregBurghardt Sebagai pengguna .NET, saya memiliki harapan yang sangat berlawanan. Saya kira ini hanya berarti bahwa "plus" dan "tambah" dapat ditukar, bukan pemetaan langsung ke +dan+=
Agent_L
2
@ Agent_L Itu menarik. Di samping .NET conventions, "add" dan "plus" tidak dapat dipertukarkan dalam bahasa Inggris.
Ben Aaronson
1
Juga, untuk tanggal dan waktu, itu agak umum untuk berbicara tentang D + 1, H + 12 dan seterusnya untuk referensi waktu relatif terhadap asal tertentu (juga, untuk penerbangan luar angkasa T-10, T-9, dll). Biasanya, ini dibaca sebagai D-plus-1, H-plus-12, T-minus-10. Mungkin AS sentris, tapi begitulah yang tampak bagi saya.
Kristian H
4
Anda mungkin menemukan pertanyaan StackOverflow lama dari Jon Skeet ini menarik: Apa nama terbaik untuk metode “tambahkan” yang tidak bermutasi pada koleksi yang tidak berubah? .
MicSim
2

Dalam .NET penamaannya berbeda walaupun hasilnya persis sama. Dari pada:

tomorrow = LocalDateTime.plusDays(1);

ada:

tomorrow = DateTime.Now.AddDays(1);

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 :)

Agent_L
sumber
-1

Ini mungkin artefak Jawa yang digunakan .Methoduntuk semua metode, baik yang memodifikasi objek maupun yang tidak.

Bayangkan sebuah bahasa yang juga memiliki object=>methodsintaks, yang akan memberikan methodsalinan 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, sumDaystidak masuk akal di sini. LocalDateadalah 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.

MSalters
sumber