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?
sumber
xs
adalah jenis nama yang buruk tetapi itu sama umum dalam bahasa fungsional sepertii
untuk variabel loop.Jawaban:
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.
sumber
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:
maximumBy
, Anda memerlukan fungsi pemesanan dan daftar, dan hasilnya adalah elemen dari daftar itu.maximumBy
daftar kosong dan fungsi pemesanan adalah kesalahan.maximumBy
daftarxs
, Anda melipat daftar itu menggunakanmaxBy
fungsi.maxBy
dua 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
maxBy
sebagai fungsi anonim alih-alih memberikannya nama yang dapat dijelaskan nanti secara lebih rinci.Bahkan, saya pikir konstruk seperti
where
sebenarnya 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."sumber