Cara memberi nama variabel saat kata tersebut berupa kata benda dan kata kerja

48

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 batterymemiliki chargedan Anda juga dapat charge()memiliki baterai.

Saya pikir memiliki keduanya Battery.Chargedan 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 Batteryvariabel objek dan fungsi untuk chargetidak 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.

Komunitas
sumber
3
buat fungsi pengisian addCharge mudah dan cukup jelas
ratchet freak
2
Bisakah Anda memberi awalan variabel nomina dengan "Current-"? Jadi "CurrentCharge" vs "Charge ()"?
Brian Snow
6
atau hanya ChargeLevel untuk mendapatkan muatan saat ini
ratchet freak
5
Buat sebuah kata. WordNet tidak berpikir enqueueitu kata, tetapi kata kerjanya di Jawa. Bagaimana dengan doCharge? Itu masih akan gagal tes simetri karena metode Anda yang lain tidak akan memiliki awalan ini
Miserable Variable
5
"Saat ini" = sekarang, atau "saat ini" = aliran biaya. Satu-satunya solusi nyata adalah mengganti bahasa Inggris dengan bahasa yang lebih masuk akal!
DarenW

Jawaban:

38

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.

kevin cline
sumber
2
Poin luar biasa pada unit. Unit secara eksplisit ditinggalkan dalam kasus ini karena mereka dapat berubah tergantung pada analisis yang kami jalankan. Yaitu, kami menggunakan skala waktu yang berbeda dan Baterai menyesuaikan operasinya dalam hal skala analisis.
1
Saya lebih suka kata kerja untuk fungsi yang mahal dan tidak bermutasi. Misalnya, fungsi yang menjalankan kueri pada database.
Brian
20

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.

mortalapeman
sumber
6
Ini bukan pemikiran yang buruk, tetapi dalam hal ini Batteryadalah abstraksi untuk sistem pengisian baterai +. Aplikasi kami tidak perlu memecah dua aspek menjadi objek yang terpisah, jadi keduanya digulung menjadi satu (alias Battery) untuk kenyamanan. Pada akhirnya, fisika baterai yang diisi dapat menentukan bahwa ia memiliki semacam fungsi untuk menerima muatan.
Dalam hal ini, saya serahkan jawaban kevin cline itu yang Anda cari. Untuk lebih jelasnya, saya akan menggunakan Isi Ulang dan Pelepasan untuk fungsi yang bermutasi dan Biaya untuk nama properti. Mungkin ChargePercent juga bagus.
mortalapeman
Apakah Anda mungkin seorang programmer Java? Ini jelas merupakan pelanggaran Jangan Ulangi Diri Sendiri. Bahkan, Anda mengulangi SEGALANYA kecuali parameter "50". Saya tidak dapat menemukan contoh pelanggaran KERING yang lebih buruk jika saya mencoba.
Kemas
@boxed. Apakah Anda mengambil contoh saya? Karena saya tidak yakin bagaimana Anda dapat mengklaim saya melanggar KERING ketika saya tidak memiliki implementasi. Saya adalah pendukung besar prinsip-prinsip SOLID dan hanya tidak melihat bagaimana Anda sampai pada kesimpulan itu.
mortalapeman
Anda melanggar KERING dengan membuat kelas BatteryCharger yang tidak perlu yang entah bagaimana kemudian akan menyebabkan perubahan status pada Baterai. Jadi BatteryCharger akan menerima beberapa input yang kemudian akan segera diteruskan ke Battery.
kevin cline
9

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 dapat phoneseseorang, atau Anda dapat memiliki phonedi saku Anda.

Gunakan Getters and Setters

Penamaan standar untuk sebagian besar objek adalah metode getter / pengaturan untuk properti.

Battery.Charge            // would be a property
Battery.setCharge(value)  // would set the property
Battery.getCharge()       // would get the property

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 Batteryadalah objek, dan itu Chargeadalah keadaan. Jadi itu akan menjadi properti dari objek, tetapi ini tergantung pada konteks bagaimana itu digunakan.

Jika Anda harus dapat Chargemenggunakan baterai, dan juga tahu apa arusnya Charge, 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.

Batter._charge            // a hidden private property
Battery.setCharge(value)  // would set the private property
Battery.getCharge()       // would get the private property
Battery.Charge()          // would perform the Charge action

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 Chargeadalah kata kerja, tetapi juga kata benda. Ketika digunakan untuk memanggil metode tindakan, menjadi jelas bahwa kata kerja sedang digunakan Battery.Charge(....).

Tapi, konteks itu sangat penting. Meskipun kata Charge()itu kata kerja, itu tidak bermakna startCharging().

Metode yang valid untuk Batterydapat mencakup Charging, Discharging, setCharge, getCharge, hasCharge, Dischargedan Charged.

Metode sederhana satu kata seringkali tidak secara eksplisit menyatakan tindakan mereka, tetapi ada beberapa kasus seperti opendan di closemana 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.

Reactgular
sumber
2
Sebagai catatan, klien adalah orang yang menggunakan terminologi yang ambigu. Saya tidak membuat kekacauan itu. :-) Saya mengajukan pertanyaan karena saya pikir saya mungkin bukan satu-satunya orang yang berjalan dalam situasi seperti itu. Anda memiliki beberapa poin yang valid dalam jawaban Anda. Dalam kasus khusus ini, kami tidak bekerja pada rincian waktu itu StartCharge()dan EndCharge()akan menyiratkan. Bahkan, terminologi itu akan menambah overhead yang signifikan untuk menangani sistem baterai. Pada setiap interval dapat Charge()atau Discharge().
1
Perjuangan utama adalah dalam menjaga semantik pemrograman internal sinkron dengan terminologi yang digunakan klien. Chargekebetulan merupakan kata ambigu yang paling mudah dipahami untuk domain ini. Ada beberapa yang lain.
6

Tambahkan mereka dengan kata kerja yang akan membuat kata kerja atau kata benda.

Battery.doCharge()

Battery.getCharge()
Jürgen Paul
sumber
4

Untuk kasus kata kerja, saya pikir Chargetidak apa-apa. Untuk kasus nomina, apakah akan getCurrentChargeLevelberhasil untuk Anda?

FrustratedWithFormsDesigner
sumber
Tidak yakin tentang itu. Karena kita menggunakan C #, kita dapat mendeklarasikan get and set pada Property alih-alih membutuhkan fungsi yang terpisah. Terlepas dari itu, saya khawatir tentang pemeliharaan dan bagaimana kelihatannya setelah saya lupa apa yang saya tulis. Tidakkah getCurrentChargeLevel()masih perlu merujuk ke variabel internal Battery, dan apa nama variabel itu?
Apakah mengisi tegangan atau persentase?
mhoran_psprep
1
@ GlenH7: Ah, begitu. Anda tidak menentukan C # dan otak saya dalam mode Java. Yah baik cara, saya pikir bahwa untuk kata benda mewakili jumlah muatan saat ini di baterai, sesuatu di sepanjang garis Battery.currentChargeLevelmungkin bekerja. Anda dapat mencoba menggunakan Battery.coloumbsatau Battery.ampereHourstetapi itu mungkin tidak sejelas ...
FrustratedWithFormsDesigner
1
@mhoran_psprep - keduanya. ;-) Chargeadalah Energyyang Power(Volts * Amps == Watts) dikalikan waktu. Jadi dalam hal ini, biaya adalah angka. Ada juga status biaya yang terjadi dalam persen.
@FrustratedWithFormsDesigner - ya, saya meninggalkan C # karena saya pikir kasus sudut yang lebih luas dapat diterapkan terlepas dari bahasa. Watt*timepasti tidak akan selaras dengan percakapan desain, tetapi ChargeLevelakan.
0

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

Jeff Langemeier
sumber
0

Notasi Hongaria untuk penyelamatan. Anda dapat memiliki intChargedan fcnCharge(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.

Ryathal
sumber
+1 untuk perspektif unik tentang jawabannya. Sayangnya, notasi Hungaria secara eksplisit verboten sesuai pedoman gaya kode kami. Itu tidak mengubah potensi manfaat jawaban Anda, hanya saja saya tidak dapat menggunakannya sebagai solusi saya yang sebenarnya.