Saya mengalami masalah sudut dengan pedoman umum:
- kata benda untuk variabel
- kata kerja untuk fungsi
Secara khusus, saya memiliki kasus di mana kata tersebut ambigu - bisa berupa kata kerja atau kata benda. Dan dalam beberapa kasus ketika kita membahas aplikasi, itu akan digunakan dua arah dalam kalimat yang sama.
Maksud saya adalah memastikan program akan tetap dapat dibaca oleh pengembang di masa depan dan juga saya sendiri ketika saya kembali ke bagian kode beberapa bulan kemudian.
Salah satu contohnya adalah dengan a battery
. A battery
memiliki charge
dan Anda juga dapat charge()
memiliki baterai.
Saya pikir memiliki keduanya Battery.Charge
dan Battery.Charge(value)
akan membingungkan pengembang masa depan.
Solusi saya saat ini adalah dengan memilih kata yang berbeda untuk satu atau kedua kasus tersebut (variabel dan fungsinya). Masalah saya dengan pendekatan itu adalah Battery
variabel objek dan fungsi untuk charge
tidak selaras dengan diskusi desain yang melibatkan Battery
.
Pertanyaan saya adalah apakah ada cara lain / lebih baik untuk menangani konflik ini dalam penamaan konvensi?
Beberapa bacaan tambahan tentang masalah ini. Tidak ada yang benar-benar menjawab pertanyaan saya.
enqueue
itu kata, tetapi kata kerjanya di Jawa. Bagaimana dengandoCharge
? Itu masih akan gagal tes simetri karena metode Anda yang lain tidak akan memiliki awalan iniJawaban:
Dalam situasi yang sama saya mencoba mencari sinonim. Dalam hal ini saya akan menggunakan "isi ulang" untuk kata kerja. "Re-" sedikit berlebihan, tetapi artinya jelas. Menggunakan "pengisian" sederhana untuk mengisi daya yang tersisa di baterai bersifat ambigu karena tidak menentukan unit fisik apa pun. Saya lebih suka "availableAmpHours", "hoursUntilRecharge" atau yang serupa. Unit akan tergantung pada apa pun yang nyaman untuk aplikasi.
Preferensi pribadi saya adalah menggunakan kata kerja hanya untuk fungsi yang mengubah status. Saya menggunakan kata benda untuk fungsi yang tidak bermutasi. Saya kira itu tergantung pada sudut pandang Anda. Pada level mesin, fungsi yang tidak bermutasi melakukan sesuatu, tetapi pada level model, tidak.
sumber
Hanya melempar ini di luar sana, tapi mungkin solusi untuk contoh penamaan ambiguitas ini adalah untuk menghapus fungsi itu dari baterai sepenuhnya. Saya belum pernah melihat baterai yang diisi sendiri dan akan lebih masuk akal bagi saya untuk memiliki kelas BatteryCharger. Ini akan membantu menjaga kekhawatiran Anda lebih terpisah dan membuat tindakan lebih eksplisit.
battery.Charge(50)
vs.batteryCharger.Charge(battery, 50)
Bagi saya, bentuk kedua jauh lebih mudah dipahami dan menyimpan semua kode "Pengisian" Anda di satu tempat daripada menaburkannya di semua kelas baterai Anda.
sumber
Battery
adalah abstraksi untuk sistem pengisian baterai +. Aplikasi kami tidak perlu memecah dua aspek menjadi objek yang terpisah, jadi keduanya digulung menjadi satu (aliasBattery
) untuk kenyamanan. Pada akhirnya, fisika baterai yang diisi dapat menentukan bahwa ia memiliki semacam fungsi untuk menerima muatan.Hindari Makna Ganda
Anda telah dengan sengaja memilih kata yang memiliki lebih dari satu makna, dan keputusan pertama adalah masalahnya. Ada banyak kata yang bermasalah untuk programmer. Contoh lain adalah
phone
. Anda dapatphone
seseorang, atau Anda dapat memilikiphone
di saku Anda.Gunakan Getters and Setters
Penamaan standar untuk sebagian besar objek adalah metode getter / pengaturan untuk properti.
Properti Adalah Negara Bukan Kata Benda
Saya pikir Anda salah dengan mengklasifikasikan properti objek sebagai kata benda, dan variabel juga bisa dianggap negara. Mereka adalah negara yang relevan dengan ruang lingkup lokal keberadaan mereka.
Anda bisa menggambarkan nilai yang mereka pegang sebagai kata benda, tapi saya tidak yakin itu benar dalam semua kasus.
Dalam OOP terminologi, properti objek menggambarkan keadaan objek itu. Dalam kasus Anda ini
Battery
adalah objek, dan ituCharge
adalah keadaan. Jadi itu akan menjadi properti dari objek, tetapi ini tergantung pada konteks bagaimana itu digunakan.Jika Anda harus dapat
Charge
menggunakan baterai, dan juga tahu apa arusnyaCharge
, maka Anda memiliki masalah.Menggunakan Lingkup Untuk Memberlakukan Konteks
Konteks adalah apa yang akan menjelaskan arti kata yang Anda maksudkan metode atau properti untuk disampaikan. Lingkup adalah mengatur aksesibilitas properti / metode dari luar objek.
Metode adalah kata kerja
Anda bisa menggambarkan metode suatu objek sebagai kata kerja, tetapi kata action lebih cocok. Dalam terminologi OOP Anda melakukan tindakan terhadap objek menggunakan metode mereka. Ini bentuk yang buruk untuk mengubah properti objek dari luar objek. Lebih disukai memanggil metode yang melakukan tindakan yang diperlukan yang menyebabkan statusnya berubah.
Kata itu
Charge
adalah kata kerja, tetapi juga kata benda. Ketika digunakan untuk memanggil metode tindakan, menjadi jelas bahwa kata kerja sedang digunakanBattery.Charge(....)
.Tapi, konteks itu sangat penting. Meskipun kata
Charge()
itu kata kerja, itu tidak bermaknastartCharging()
.Metode yang valid untuk
Battery
dapat mencakupCharging
,Discharging
,setCharge
,getCharge
,hasCharge
,Discharge
danCharged
.Metode sederhana satu kata seringkali tidak secara eksplisit menyatakan tindakan mereka, tetapi ada beberapa kasus seperti
open
dan diclose
mana sedikit penjelasan diperlukan.Jadi sebenarnya tidak ada jawaban yang benar tentang bagaimana menamai jenis properti / metode ini. Kecuali bahwa Anda perlu menggunakan teknik di atas dengan bijak untuk memastikan tidak ada kebingungan.
sumber
StartCharge()
danEndCharge()
akan menyiratkan. Bahkan, terminologi itu akan menambah overhead yang signifikan untuk menangani sistem baterai. Pada setiap interval dapatCharge()
atauDischarge()
.Charge
kebetulan merupakan kata ambigu yang paling mudah dipahami untuk domain ini. Ada beberapa yang lain.Tambahkan mereka dengan kata kerja yang akan membuat kata kerja atau kata benda.
sumber
Untuk kasus kata kerja, saya pikir
Charge
tidak apa-apa. Untuk kasus nomina, apakah akangetCurrentChargeLevel
berhasil untuk Anda?sumber
getCurrentChargeLevel()
masih perlu merujuk ke variabel internalBattery
, dan apa nama variabel itu?Battery.currentChargeLevel
mungkin bekerja. Anda dapat mencoba menggunakanBattery.coloumbs
atauBattery.ampereHours
tetapi itu mungkin tidak sejelas ...Charge
adalahEnergy
yangPower
(Volts * Amps == Watts) dikalikan waktu. Jadi dalam hal ini, biaya adalah angka. Ada juga status biaya yang terjadi dalam persen.Watt*time
pasti tidak akan selaras dengan percakapan desain, tetapiChargeLevel
akan.Dalam kebanyakan kasus, menambahkan kata kerja, kata keterangan, atau kata sifat cukup baik untuk membedakan mereka dan benar-benar dapat membantu dengan pemahaman. Dengan kasus Pengisian dan Pengisian daya () pada baterai yang membuatnya DeltaCharge () dapat menunjukkan bahwa itu adalah fungsi yang dapat menangani pengisian atau pengosongan.
Delta (dalam kasus di mana ada perubahan tetapi ambigu) adalah pengubah yang saya gunakan dan rekomendasikan kepada orang lain setiap saat untuk menyerahkan perubahan dalam keadaan (bahkan jika kata kerjanya semi-jelas).
sumber
Notasi Hongaria untuk penyelamatan. Anda dapat memiliki
intCharge
danfcnCharge(value)
, sehingga menghindari kebingungan dan tidak menambahkan nama panjang gila ketika tiga huruf akan bekerja dengan baik.Atau Anda bisa menggunakan nama yang sama dan membiarkan IDE menanganinya. Membuat nama yang lebih panjang atau berbeda mungkin sama membingungkannya dalam jangka panjang.
sumber