Harap Cantumkan Satuan di Nama

atau gunakan tipe kuat

ditulis oleh Ruud van Asseldonkditerbitkan

Ada satu jebakan keterbacaan kode yang mudah dihindari begitu Anda menyadarinya, namun jebakan itu meresap: menghilangkan unit. Pertimbangkan tiga cuplikan berikut dalam Python, Java, dan Haskell:

Berapa lama program ini tidur? Program Python tidur selama lima menit, program Java tidur selama 0,3 detik, dan program Haskell tidur selama 0,3 milidetik.

Bagaimana Anda bisa mengetahuinya dari kode ? Anda tidak bisa. Anda hanya perlu hafal bahwa time.sleep

membutuhkan beberapa detik, sedangkan threadDelay

membutuhkan waktu mikrodetik. Jika Anda cukup sering mencarinya, pada akhirnya pengetahuan itu akan melekat, tetapi bagaimana kita bisa menjaga agar kode tetap dapat dibaca bahkan untuk orang yang belum pernah bertemu time.sleep sebelumnya?

Opsi 1: pasang unit dalam nama

Alih-alih ini:

def frobnicate(batas waktu: int) -> Tidak ada:   ...  frobnicate(300)

Melakukan hal ini:

def frobnicate(*, timeout_seconds: int) - > Tidak ada:  
# memaksa penelepon untuk menggunakan argumen bernama # untuk semua argumen setelah *. ... frobnicate(timeout_seconds=300)

Dalam kasus pertama, kami bahkan tidak dapat mengatakan di situs panggilan bahwa 300 adalah batas waktu, tetapi bahkan jika kita tahu itu, itu adalah batas waktu 300, apa? Milidetik? Detik? hari di Mars? Sebaliknya, situs panggilan kedua sepenuhnya cukup jelas.

Menggunakan argumen bernama bagus untuk bahasa yang mendukungnya, tetapi ini tidak selalu memungkinkan. Bahkan dalam Python, di mana time.sleep didefinisikan dengan satu argumen bernama dtk

, kami tidak bisa menelepon tidur (dtk=300)

karena alasan implementasi. Dalam hal ini, kita dapat memberikan nilai sebuah nama sebagai gantinya.

Alih-alih ini:

Melakukan hal ini:

sleep_seconds = 300 waktu.tidur(sleep_seconds)

Sekarang kodenya tidak ambigu, dan dapat dibaca tanpa harus membaca dokumentasi.

Opsi 2: gunakan tipe kuat

Alternatif untuk menempatkan unit di name, adalah menggunakan tipe yang lebih kuat daripada integer atau float. Misalnya, kita mungkin menggunakan tipe durasi.

Alih-alih ini:

def frobnicate(batas waktu: int) -> Tidak ada: ...
frobnicate( 300)

Melakukan hal ini:

def frobnicate(batas waktu: timedelta) -> Tidak ada: ... batas waktu = delta waktu(detik=300)

frobnicate(batas waktu)

Untuk angka floating-point tertentu, Anda perlu diberi tahu di luar pita apa unit untuk dapat menafsirkannya . Jika Anda beruntung, informasi ini ada dalam nama variabel atau argumen, tetapi jika Anda tidak beruntung, informasi ini hanya ditentukan dalam dokumentasi — atau tidak ditentukan sama sekali. Tetapi untuk nilai timedelta, tidak ada ambiguitas tentang bagaimana menafsirkannya, ini adalah bagian dari jenisnya. Ini juga menghilangkan ambiguitas dari kode.

Cakupan

Saran untuk menggunakan tipe kuat atau untuk menempatkan unit dalam nama tidak terbatas pada variabel dan argumen fungsi , ini berlaku untuk API s, nama metrik, format serialisasi, file konfigurasi, flag baris perintah, dll. Dan meskipun nilai durasi adalah kasus yang paling umum, saran ini tidak terbatas pada itu, tetapi juga berlaku untuk jumlah moneter, panjang, data ukuran, dll.

Misalnya, jangan kembalikan ini:

{ "error_code" : "E429", "pesan eror ": "Batas tarif terlampaui", "coba_setelah": 100, }

Kembalikan ini sebagai gantinya:

{ "error_code":
"E429", "pesan eror": "Batas tarif terlampaui", "coba lagi_setelah_detik": 100, }

Jangan mendesain konfigurasi Anda file seperti ini:

request_timeout=10

Terima satu dari ini sebagai gantinya:

request_timeout=10 detik request_timeout_seconds=10

Dan jangan mendesain CLI Anda aplikasi akuntansi seperti ini:

tampilkan transaksi --jumlah minimum 32

Terima salah satu dari ini sebagai gantinya:

show-transactions --minimum-amount-eur 32 show-transactions --minimum-amount "32 EUR"

Baca selengkapnya