Menerapkan prinsip-prinsip Kode Bersih ke bahasa fungsional

16

Saya sedang membaca Kode Bersih Robert Martin . Saya pikir itu hebat, dan ketika menulis kode OO saya mengambil pelajarannya ke dalam hati. Secara khusus, saya pikir sarannya untuk menggunakan fungsi-fungsi kecil dengan nama-nama bermakna membuat aliran kode saya jauh lebih lancar. Yang terbaik disimpulkan oleh kutipan ini:

[W] e ingin dapat membaca program seolah-olah itu adalah seperangkat paragraf TO, masing-masing menggambarkan tingkat abstraksi saat ini dan referensi paragraf TO berikutnya pada tingkat berikutnya ke bawah.

( Kode Bersih , halaman 37: "TO paragraf" adalah paragraf yang dimulai dengan kalimat yang disuarakan dalam infinitif. "Untuk melakukan X, kita melakukan langkah Y dan Z." "Untuk melakukan Y, kita ..." dll. ) Sebagai contoh:

UNTUK RenderPageWithSetupsAndTeardowns, kami memeriksa untuk melihat apakah halaman tersebut adalah halaman pengujian dan jika demikian, kami menyertakan pengaturan dan teardown. Dalam kedua kasus kami membuat halaman dalam HTML

Saya juga menulis kode fungsional untuk pekerjaan saya. Contoh-contoh Martin dalam buku jelas dibaca seolah-olah mereka adalah seperangkat paragraf, dan mereka sangat jelas - tetapi saya tidak begitu yakin bahwa "dibaca seperti seperangkat paragraf" adalah kualitas yang diinginkan untuk kode fungsional untuk memiliki .

Mengambil contoh dari perpustakaan standar Haskell :

maximumBy               :: (a -> a -> Ordering) -> [a] -> a
maximumBy _ []          =  error "List.maximumBy: empty list"
maximumBy cmp xs        =  foldl1 maxBy xs
                        where
                           maxBy x y = case cmp x y of
                                       GT -> x
                                       _  -> y

Itu kira-kira sejauh mungkin dari saran Martin, tapi itu singkat, Haskell idiomatis. Tidak seperti contoh-contoh Jawa dalam bukunya, saya tidak dapat membayangkan cara apa pun untuk memperbaiki itu menjadi sesuatu yang memiliki jenis irama yang ia minta. Saya menduga bahwa Haskell yang ditulis dengan standar Kode Bersih akan dianggap bertele-tele dan tidak wajar.

Apakah saya salah untuk menganggap (setidaknya sebagian dari) Clean Code bertentangan dengan praktik terbaik pemrograman fungsional? Apakah ada cara yang masuk akal untuk menafsirkan kembali apa yang dia katakan dalam paradigma yang berbeda?

Patrick Collins
sumber
1
Pemrogram fungsional cenderung untuk menulis kode yang terlalu singkat, itu benar. Saya tidak akan menganggap itu praktik terbaik, bahkan di lingkungan itu.
Telastyn
Maafkan ketidaktahuan, tapi apa paragraf TO?
Shashank Gupta
4
Seperti yang disebutkan dalam pertanyaan lain baru-baru ini, Dijkstra menulis tentang kebodohan "pemrograman bahasa alami" dan saya cenderung setuju dengannya bahwa kode yang berbunyi seperti prosa adalah mimpi pipa. Saya pikir ini terutama benar dalam Haskell yang, karena murni, secara simbolis mengekspresikan persamaan antara nilai daripada urutan langkah-langkah untuk menghasilkan efek. Saya pikir yang penting adalah bahwa kode yang dikutip adalah idiomatik. Misalnya xsadalah jenis nama yang buruk tetapi itu sama umum dalam bahasa fungsional seperti iuntuk variabel loop.
Doval
@ShashankGupta Saya mengedit pertanyaan dengan tautan ke halaman spesifik di buku ini serta pemahaman saya sendiri tentang apa yang ditulis Paman Bob.
@ShashankGupta Dia memberikan beberapa contoh, tetapi idenya adalah bahwa itu harus dibaca seperti prosa. "Untuk menemukan daftar maksimum, Anda memeriksa setiap elemen ..."
Patrick Collins

Jawaban:

11

Clean Code adalah yang pertama dan terutama adalah manual gaya. Strunk and White tidak berlaku ketika Anda menulis di Klingon. Idenya adalah Anda ingin menjelaskan kepada programmer yang mungkin akan membaca kode Anda. Anda ingin memiliki kode yang termodulasi dan mudah disusun ulang. Ada cara untuk melakukan ini di Haskell sama seperti ada cara untuk melakukan ini dalam bahasa lain tetapi rincian tepatnya akan bervariasi.

Yang sedang berkata, ada sejumlah pedoman gaya di luar sana untuk Haskell. Stack Overflow memiliki panduan yang cukup komprehensif juga. Mempertahankan logika pengodean secara langsung dan singkat tampaknya cukup konstan. Generalisasi fungsi juga ditekankan karena mengarah pada modularitas. Kode KERING juga ditekankan, sama seperti dengan Kode Bersih.

Pada akhirnya, Clean Code dan pedoman pengkodean Haskell berusaha untuk hal yang sama tetapi akhirnya mengambil jalan mereka sendiri untuk sampai ke sana.

Insinyur Dunia
sumber
1
Saya merasa seperti jawaban ini mengabaikan prinsip-prinsip yang diajarkan oleh Clean Code yang sangat berlaku lintas bahasa, dan itulah inti dari pertanyaan yang diajukan. Saya dapat melihat mengapa orang-orang menganggap Clean Code sebagai manual gaya, dan saya pikir itu sebagian benar, tetapi tidak cukup benar untuk mengabaikan keseluruhan buku sebagai satu.
Allan
Saya tidak menganggap buku Kode Bersih Martin sebagai manual gaya. Saya merasa ajaran buku ini benar-benar cocok di suatu tempat antara panduan gaya dan pola desain.
Michael R
15

Saya tidak yakin saya mengikuti apa yang Anda maksudkan dengan teladan Anda. Paragraf, seperti yang dia gambarkan, tidak membutuhkan panjang lebar. Dia tidak berarti kode harus dibaca seperti bahasa Inggris. Bagian yang penting adalah pengelompokan fungsi pada tingkat abstraksi yang sama, dalam perkembangan logis. Itu konsep struktural teoretis yang melampaui paradigma pemrograman.

Disajikan dalam format "TO paragraf" Bob Martin, saya membaca contoh Anda sebagai:

  • Untuk menghitung maximumBy , Anda memerlukan fungsi pemesanan dan daftar, dan hasilnya adalah elemen dari daftar itu.
  • Untuk menghitung maximumBy daftar kosong dan fungsi pemesanan adalah kesalahan.
  • Untuk menghitung maximumBydaftar xs, Anda melipat daftar itu menggunakan maxByfungsi.
  • Untuk menghitung maxBydua elemen daftar, Anda membandingkannya menggunakan fungsi pemesanan yang diberikan. Jika elemen pertama lebih besar, pilihlah. Kalau tidak pilih yang kedua.

Anda mulai dengan konsep yang paling umum dan berkembang ke lebih detail, seperti dalam contoh penting. Gagasan "TO paragraf" adalah Anda dapat berhenti membaca pada titik tertentu ketika Anda sudah mendapatkan cukup detail, tanpa harus melompat-lompat halaman. Itu yang terjadi di sini.

Beberapa nama mungkin bisa lebih baik, tetapi mereka adalah konvensi umum dari bahasa tersebut, terutama ketika menulis fungsi-fungsi umum tingkat tinggi. Nama fungsi tingkat tinggi juga tidak menerjemahkan dengan baik ke dalam frase kata kerja imperatif seperti contoh dalam buku ini, karena mereka lebih menggambarkan hubungan antara kata kerja.

Ada beberapa cara untuk menerapkan ini yang tidak mengikuti pedoman "KE paragraf". Meninggalkan tanda tangan tipe eksplisit akan menghilangkan kalimat "ikhtisar" tingkat tinggi. Anda bisa menggunakan ekspresi if untuk penanganan kesalahan alih-alih pencocokan pola, yang akan membingungkan yang tidak sesuai dengan tingkat abstraksi lain. Anda bisa sebaris maxBysebagai fungsi anonim alih-alih memberikannya nama yang dapat dijelaskan nanti secara lebih rinci.

Bahkan, saya pikir konstruk seperti wheresebenarnya lebih cocok untuk format paragraf, karena Anda dapat menggunakannya untuk memberikan nama ke detail yang lebih dalam dengan cara yang mendekati cara kami mengekspresikannya dalam bahasa Inggris, dan juga membatasi cakupannya dalam cara yang jelas untuk konteks "paragraf."

Karl Bielefeldt
sumber