Di tim saya, kami bekerja erat dengan beberapa arsitek perangkat lunak. Mereka menyetujui semua keputusan desain proyek kami, melakukan beberapa tinjauan kode dll.
Proyek kami sebagian besar terdiri dari fungsi backend yang diimplementasikan dalam PHP menggunakan kerangka kerja Symfony 2. Jadi secara sintaksis, kode, konvensi penamaan dan struktur proyek terlihat hampir sama dengan apa yang akan terlihat seperti Java (Symfony 2 mendorong struktur seperti itu). Saya menyebutkan ini karena konvensi khusus Java juga berlaku dalam kasus kami (jika mungkin).
Baru-baru ini, mereka menyarankan sesuatu yang saya temukan sangat aneh: semua metode harus memiliki kata sambung dalam nama mereka misalnya getEntityOrNull
, setValueOrException
dll.
Konvensi penamaan seperti itu terasa sangat salah bagi saya, tetapi saya tidak dapat mengemukakan argumen konkret atau artikel / halaman online yang secara khusus menentang hal ini.
Satu-satunya hal yang saya pikirkan adalah:
- informasi tersebut harus ada dalam anotasi metode, seperti
@return
atau@throws
- penggunaan kata sambung ("dan", "atau" dll.) dalam nama metode biasanya menyarankan bahwa Prinsip Tanggung Jawab Tunggal tidak dihormati dengan benar
Apa beberapa argumen konkret lainnya yang menentang konvensi penamaan ini?
sumber
the use of conjunctions ("and", "or" etc.) in method names usually suggest that the Single Responsibility Principle is not properly respected
Ini bukan kasus untuk contoh yang Anda daftarkan, di mana hubungannya digunakan untuk memperjelas mekanisme yang digunakan untuk menangani kegagalan, bukan untuk menunjukkan bahwa ia dapat melakukan satu atau lain hal. Bahkan fungsi yang paling sempit dapat memiliki kondisi kegagalan yang sah, misalnya memunculkan tumpukan kosong.Int32.TryParse
danInt32.Parse
- keduanya mengurai string menjadi integer, tetapi yang pertama mengembalikan Boolean yang menunjukkan keberhasilan dan yang terakhir melempar pada kegagalan.Try...
,...OrNull
,...OrDefault
. @EricLippert Itu bukan satu-satunya konvensi di .net. PertimbangkanSingle
vs.SingleOrDefault
, yang sangat dekat denganOrNull
OP yang disarankan.Jawaban:
Mereka mungkin melakukannya karena penamaan konflik. Saya berasumsi bahwa Anda tidak dapat memiliki dua metode bernama
getEntity
, satu yang mungkin melempar pengecualian dan satu laginull
. Karena itu, Anda harus memberi nama sesuai.Pertama, saya tidak suka praktik memiliki banyak cara berbeda memanggil metode yang sama kecuali jika melakukan beberapa perubahan yang hanya dapat dilakukan oleh kelas tertentu.
Dengan kata lain, jika
getValueOrNull
hanya menelepongetValueOrException
, menangkap pengecualian, dan dalam kasus itu kembalinull
, ini dapat dilakukan oleh penelepon. Ini mengacaukan kelas dengan metode yang tidak benar-benar menyumbangkan sesuatu yang bermanfaat. Sebaliknya saya lebih sukagetValue
, dan tahu bahwa itu melempar pengecualian. Lebih baik lagi, saya lebih suka mengetahui bahwa semua metode yang berpotensi membuang pengecualian, dan tidak ada yang kembalinull
sehingga perilaku seragam di seluruh proyek saya, atau berbalikannull
, semua berpotensi kembali , dan tahu bahwa penelepon harus mengeluarkan pengecualian jika yang diinginkan.Namun, juga benar bahwa Anda tidak bertanggung jawab atas itu. Saran saya adalah untuk mengangkatnya, tetapi jangan memusingkan hal-hal kecil. Pada akhirnya, tanggung jawab dari konvensi penamaan seperti itu berada di pundak mereka, terlepas dari apakah mereka menerima saran Anda atau tidak, dan karena itu adalah penilaian mereka di telepon, saya percaya itu adalah hak prerogatif mereka untuk mengatakan tidak, menurut pendapat saya yang rendah hati.
sumber
null
(atau lebih baik lagi, jenis Opsional / Mungkin) karena melempar relatif mahal. Menulis pembantu yang memeriksa apakah suatu nilai tidak valid dan lemparan tidak menambah banyak overhead. Namun ketika Anda menginginkan versi tanpa-lemparan, menelan pengecualian tidak akan mengembalikan performa yang Anda ambil saat melemparnya.null
adalah yangnull
mungkin benar-benar merupakan pengembalian yang valid dalam beberapa kasus sehingga Anda harus menyimpang dari norma dan melemparkan pengecualian dalam kasus tersebut.Meskipun penggunaan konjungsi sering menunjukkan pelanggaran SRP, dalam hal ini hanya menunjukkan nilai kembali tipe data aljabar pria miskin yang bisa menjadi salah satu dari dua nilai, baik
null
atau nilai "sukses".Mereka menggunakan semacam Notasi Hongaria untuk mengkompensasi kelemahan dalam sistem tipe, yaitu kurangnya jenis yang tidak dapat dibatalkan. Dengan kata lain, tidak ada cara untuk menentukan dalam
@return
anotasi Anda bahwa fungsi tidak akan pernah kembalinull
, dan sebaliknya, tidak ada cara untuk menentukan dalam@return
anotasi Anda bahwa fungsi tersebut dapat kembalinull
.Juga, saya percaya bahwa
@throws
anotasi tidak wajib dalam php, jadi tidak adanya anotasi tidak mengindikasikan tidak adanya pengecualian, meskipun itu lebih baik diselesaikan dengan membuat anotasi wajib dalam panduan gaya Anda.Mengingat keterbatasan bahasa yang Anda gunakan, itu bukan gaya yang sepenuhnya tidak masuk akal.
sumber
Dalam kode saya, kadang-kadang saya membuat pasangan metode dengan nama-nama seperti getEntity () dan getEntityOrNull (). Nama tersebut membuat perilaku yang diharapkan menjadi jelas. Jika getEntity () tidak menemukan entitas maka pengecualian dilemparkan. getEntityOrNull () akan mengembalikan nol.
Dengan melakukan ini, kode panggilan menjadi sedikit lebih jelas. Jika kode panggilan harus memiliki entitas maka getEntity akan melakukan trik. Jika entitas adalah semacam hal opsional maka getEntityOrNull adalah metode pilihan.
Hal yang sama dapat diselesaikan dengan satu metode tetapi itu kemudian mengalihkan sebagian beban ke program panggilan. Anda selalu perlu menguji nol atau Anda perlu mencoba / menangkap blok. Either way itu kode tambahan yang perlu digandakan setiap kali metode ini dipanggil.
Jika arsitek Anda tidak menggunakan pasangan metode semacam ini maka ya, saya akan mempertanyakan kebutuhan untuk akhiran.
Tidak pernah benar-benar melihat metode setValueOrException. Tidak dapat memikirkan kasus penggunaan umum yang baik untuk itu.
Anda mungkin mempertimbangkan untuk bertanya kepada arsitek mengapa. Yang saya tahu selalu senang menjelaskan keputusan mereka. Seringkali dengan sangat detail (dan kadang-kadang menyiksa).
sumber
Dua argumen Anda masuk akal. Tetapi jika merekalah yang bertanggung jawab memutuskan konvensi penamaan, cobalah untuk tidak merasa terlalu buruk tentang hal itu menjadi sesuatu yang tidak Anda setujui.
Saat Anda melakukannya, Anda harus meyakinkan mereka untuk tidak menggunakan bagian "dapatkan" dan "set" kecuali metode itu benar-benar secara langsung mengatur atau mendapatkan variabel anggota.
sumber