Saya bingung memilih nama untuk fungsi saya di Python . Terkadang fungsi bawaan Python sangat penting seperti: print
fungsi dan metode string find
. Kadang-kadang mereka tidak seperti: len
namanya tidak penting seperti calculate_len
, misalnya, dan type
tidak find_type
.
Saya dapat memahami bahwa print
mengembalikan nilai yang tidak kami gunakan (yaitu None
) dan melakukan sesuatu (yaitu menunjukkan string di layar), jadi namanya sangat penting.
Tetapi len
mengembalikan nilai yang kami gunakan dan melakukan sesuatu (yaitu menghitung berapa banyak item yang ada dalam urutan atau pemetaan.) Dan namanya tidak penting . Di sisi lain, find
metode string (as len
) mengembalikan nilai yang kami gunakan dan melakukan sesuatu, dan namanya sangat penting .
Apa yang membuat menanyakan pertanyaan ini adalah bahwa saya menempatkan skrip yang mengenkripsi dan mendekripsi string menggunakan cipher Caesar untuk ditinjau. Peninjau mengatakan:
Hanya firasat: fungsi berfungsi. Jadi nama yang bagus untuk suatu fungsi adalah keharusan: Saya akan menggunakan
rotate_letter
alih-alihrotated_letter
.
rotated_letter
mengembalikan string huruf tunggal yang mewakili huruf yang dirotasi oleh angka. Saya tidak tahu apa yang lebih baik, saya gunakan rotated_letter
karena mengembalikan nilai, seperti randint
fungsi dalam modul acak , bukan generate_randint
.
Jadi, dalam hal ini, bagaimana saya harus memberi nama fungsi yang mengembalikan nilai yang akan digunakan? Haruskah saya membuat nama imperatif atau hanya kata benda . Dalam kasus lain jelas bagaimana melakukannya, seperti fungsi boolean , seperti is_even
dan is_palindrome
kami hanya membuatnya seperti pertanyaan ya / tidak , dan juga fungsi yang hanya melakukan dan mengembalikan nilai yang tidak digunakan (yaitu None
), seperti print
dan metode daftar sort
.
sumber
len
, misalnya, lebih baik dianggap sebagai "panjang" - Anda mendapatkan deskripsi meta-level dari argumennya.Jawaban:
Gunakan kata kerja yang wajar, kata benda jika lebih pendek dan tidak ambigu
Sebagian besar waktu, fungsi harus berupa kata kerja (imperatif) dan kelas, variabel, dan parameter harus berupa kata benda. Atribut juga harus berupa kata benda, termasuk yang dibuat menggunakan
@property
. Ini terutama terjadi pada fungsi yang memiliki efek samping. [1] Jika suatu fungsi mengembalikan sesuatu, Anda harus mengevaluasi apakah kata kerjanya menambahkan sesuatu atau hanya "noise":make_list(foo)
vslist(foo)
.: Kata benda lebih mudah dibaca daripada kata kerja. Juga,list
sebenarnya adalah kelas, dan kelas harus menjadi kata benda.open(foo)
vsfile(foo)
.: Kata kerja lebih mudah dibaca daripada kata benda, dan lebih masuk akal untuk memberikan "opsi" ke kata kerja daripada kata benda, jadi kata benda itu dihapus dengan Python 3.open()
tetap menjadi satu-satunya "standar" [2] cara untuk membuat objek file dalam Python 3.foo.get_bar()
vs.foo.bar()
vs.foo.bar
(anggapfoo
danbar
keduanya kata benda): Opsi pertama adalah benar, karena "get" tidak menambahkan apa pun yang kita belum tahu. Yang kedua adalah tepat jikabar
keluar darifoo
operasi berpotensi mahal dan / atau membawa efek samping (Anda mungkin juga mempertimbangkanBar(foo)
jikaBar
kelas). Yang ketiga sesuai jika ini adalah operasi yang murah tanpa efek samping, dan implementasi alternatif tidak mungkin membuatnya mahal .xs.sort()
vs.sorted(xs)
ifxs
adalah daftar: Yang pertama adalah keharusan: Urutkan daftar. Ini mengubah daftar di tempat dan tidak mengembalikan apa pun. Yang kedua adalah deklaratif: Daftar yang diurutkan, yang persis apa yang dikembalikan. Keduanya adalah kata kerja.[1]: Biasanya mengembalikan nilai dan memiliki efek samping sama-sama eksklusif kecuali Anda memiliki alasan desain yang menarik untuk menggabungkannya. Jadi fungsi yang memiliki efek samping mungkin seharusnya tidak mengembalikan apa pun dan karenanya membuatnya menjadi kata benda akan sangat sedikit masuk akal.
[2]: Ada beberapa operasi tingkat-lebih rendah di
io
modul yang dapat digunakan untuk menambah atau menghapus buffering file, teks otomatis / decoding, dll, dan ini sebagian besar kata benda karena mereka adalah kelas berorientasi objek. Sebagian besar pengguna tidak perlu bermain-main dengan hal-hal ini secara langsung; sebagai gantinya,open()
pilih kelas yang sesuai dan instantiate secara otomatis.sumber
foo.get_bar()
vs.` foo.bar ()` vs.foo.bar
" apa perbedaan antara yang kedua dan yang ketiga ?rotated_letter
imperatif dan tetap deklaratif, kan?letter
tersirat oleh konteks.list
adalah kelasrotated_letter
tidak terlihat seperti metode. Sepertinya properti. Yang berarti bahwa ide pertama adalah melakukan:berharap
letter
mengandung nilai tipe string, bukan fungsi. Dari sana, Anda memilih nama yang berbeda, seperti:atau Anda menggunakan properti sebagai gantinya:
len
dantype
dinamai seperti itu karena nama lain akan panjang untuk diketik. Mereka banyak digunakan, dan mereka memiliki status khusus fungsi inti Python yang setiap programmer Python akan belajar pula, membuat nama mereka jauh lebih tidak relevan daripada nama perpustakaan pihak ketiga.len
, Terutama, adalah contoh yang baik dari apa yang Anda tidak harus melakukan di Anda kode: Anda diharapkan untuk menggunakan nama lengkap sepertilength
(kecuali bentuk pendek sangat populer, sepertimax
), dan menggunakan kata kerja, seperticompute_length
. Atau bisa juga berupa properti:len([1, 5, 6])
menjadi[1, 5, 6].length
. Misalnya, di C #, bentuk kemudian digunakan:new [] { ... }.Length
.Perhatikan bahwa mungkin ada alasan historis juga untuk
len
: bahasa lain, seperti C #, lebih disukaiCount
, yang biasanya merupakan metode (meskipun sayangnya perilaku tersebut tidak konsisten melalui .NET Framework).Count
adalah kata kerja, jadi secara intuitif, Anda cenderung menyebutnya sebagai metode.Mengembalikan nilai atau melakukan suatu tindakan
Suatu fungsi selalu diharapkan untuk melakukan suatu tindakan. Jika hampir tidak mengembalikan nilai, itu harus berupa properti. Anda memiliki petunjuk bahwa fungsi tersebut harus diubah menjadi properti ketika:
Fungsi ini hampir tidak mengandung
return ...
pernyataan,Nama fungsi yang muncul secara alami di pikiran Anda adalah
get_something
, seperti padaproduct.get_price()
.Sekarang, jika Anda memiliki fungsi, itu bisa salah satu dari empat jenis:
Itu bisa murni, yaitu mengembalikan nilai tanpa mempengaruhi lingkungan. Contoh:
road.measure_distance()
.Ini dapat mempengaruhi lingkungan tanpa mengembalikan apa pun. Contoh:
product_database.remove_record(1234)
.Ini dapat mempengaruhi lingkungan dan mengembalikan nilai. Contoh:
value.increment()
digunakan sepertivalue++
.Ia tidak dapat melakukan apa-apa dan tidak mengembalikan apa pun. Contoh:
time.sleep(1)
.Ada beberapa kasus di mana nama bisa memberikan petunjuk kuat tentang jenis fungsi, tetapi dalam banyak kasus, Anda tidak akan dapat mengetahui jenisnya dari namanya.
sumber
getSomething
dansetSomething
merupakan nama yang biasa digunakan alih-alih properti.