Kasus : Saya bekerja di sebuah perusahaan, menulis aplikasi dengan Python yang menangani banyak data dalam array. Saya satu-satunya pengembang program ini saat ini, tetapi mungkin akan digunakan / dimodifikasi / diperpanjang di masa depan (1-3 tahun) oleh beberapa programmer lain, pada saat ini tidak saya kenal. Saya mungkin tidak akan ada di sana secara langsung untuk membantu, tetapi mungkin memberikan dukungan melalui email jika saya punya waktu untuk itu.
Jadi, sebagai pengembang yang telah mempelajari pemrograman fungsional (Haskell), saya cenderung menyelesaikan, misalnya, memfilter seperti ini:
filtered = filter(lambda item: included(item.time, dur), measures)
Sisa kode adalah OO, hanya beberapa kasus kecil di mana saya ingin menyelesaikannya seperti ini, karena jauh lebih sederhana dan lebih indah menurut saya.
Pertanyaan : Apakah boleh hari ini menulis kode seperti ini?
- Bagaimana pengembang yang belum menulis / mempelajari FP bereaksi terhadap kode seperti ini?
- Apakah bisa dibaca?
- Dapat dimodifikasi?
Haruskah saya menulis dokumentasi seperti menjelaskan kepada seorang anak apa garis itu?
# Filter out the items from measures for which included(item.time, dur) != True
Saya telah bertanya kepada bos saya, dan dia hanya mengatakan "FP adalah ilmu hitam, tetapi jika itu berhasil dan merupakan solusi yang paling efisien, maka boleh saja menggunakannya."
Apa pendapat Anda tentang ini? Sebagai programmer non-FP, bagaimana Anda bereaksi terhadap kode? Apakah kode itu "googable" sehingga Anda dapat mengerti apa fungsinya? Saya ingin umpan balik tentang ini.
# Select the item's from measures for which included(item.time, dur) == True
:, menghindari negatif ganda selalu meningkatkan pemahaman.Jawaban:
Bagi saya: Ya, tetapi saya mulai mengerti, bahwa komunitas Python sering menganggap daftar pemahaman sebagai solusi yang lebih bersih daripada menggunakan
map()
/filter()
.Bahkan, GvR bahkan mempertimbangkan untuk menjatuhkan fungsi-fungsi itu sama sekali.
Pertimbangkan ini:
Lebih lanjut, ini memiliki manfaat bahwa pemahaman daftar akan selalu mengembalikan daftar.
map()
danfilter()
di sisi lain akan mengembalikan iterator dengan Python 3.Catatan: Jika Anda ingin memiliki iterator, gantinya sesederhana mengganti
[]
dengan()
:Sejujurnya, saya melihat sedikit atau tidak ada alasan untuk menggunakan
map()
ataufilter()
dengan Python.Ya, tentu saja, ada satu hal untuk membuatnya lebih mudah: Jadikan fungsi, bukan lambda.
Jika kondisi Anda menjadi lebih kompleks, skala ini akan jauh lebih mudah, memungkinkan Anda untuk menggunakan kembali cek Anda. (Perhatikan bahwa Anda dapat membuat fungsi di dalam fungsi lain, ini dapat membuatnya lebih dekat ke tempat di mana ia digunakan.)
Dia mencari dokumentasi Python dan tahu cara kerjanya lima menit kemudian. Kalau tidak, dia seharusnya tidak pemrograman dengan Python.
map()
danfilter()
yang sangat sederhana. Bukannya Anda meminta mereka untuk memahami monad. Itu sebabnya saya pikir Anda tidak perlu menulis komentar seperti itu. Gunakan nama variabel dan fungsi yang baik, maka kodenya hampir jelas. Anda tidak dapat mengantisipasi fitur bahasa mana yang tidak diketahui pengembang. Sejauh yang Anda tahu, pengembang berikutnya mungkin tidak tahu apa itu kamus.Apa yang tidak kita mengerti biasanya tidak dapat dibaca oleh kita. Dengan demikian, Anda bisa berargumen itu tidak lebih mudah dibaca daripada pemahaman daftar jika Anda belum pernah melihat salah satu dari mereka sebelumnya. Tetapi seperti yang disebutkan Joshua dalam komentarnya, saya juga percaya bahwa penting untuk konsisten dengan apa yang digunakan pengembang lain - setidaknya jika alternatifnya tidak memberikan keuntungan substansial.
sumber
map
danfilter
lakukan dengan python 3.reduce
sebagai contoh tandingan untuk Anda selalu dapat menggunakan argumen pemahaman daftar , karena relatif sulit untuk digantireduce
dengan generator inline atau daftar pemahaman.Karena komunitas pengembang mendapatkan kembali minat dalam pemrograman fungsional, tidak jarang melihat beberapa pemrograman fungsional dalam bahasa yang awalnya sepenuhnya berorientasi objek. Contoh yang baik adalah C #, di mana tipe anonim dan ekspresi lambda memungkinkan untuk menjadi lebih pendek dan ekspresif melalui pemrograman fungsional.
Ini dikatakan, pemrograman fungsional aneh untuk pemula. Sebagai contoh, ketika selama kursus pelatihan, saya menjelaskan kepada para pemula bagaimana mereka dapat meningkatkan kode mereka melalui pemrograman fungsional dalam C #, beberapa dari mereka tidak yakin, dan beberapa mengatakan bahwa kode asli lebih mudah dimengerti untuk mereka. Contoh yang saya berikan kepada mereka adalah sebagai berikut:
Kode sebelum refactoring:
Kode yang sama setelah refactoring dengan menggunakan FP:
Ini membuat saya berpikir bahwa:
Anda tidak perlu khawatir jika Anda tahu bahwa pengembang berikutnya yang akan menjaga kode Anda akan memiliki pengalaman keseluruhan yang cukup dan beberapa pengetahuan tentang pemrograman fungsional, tetapi:
jika tidak, hindari pemrograman fungsional, atau berikan komentar verbose yang menjelaskan sintaksis, kelebihan, dan kemungkinan peringatan dari pendekatan Anda pada saat yang bersamaan dibandingkan dengan pemrograman non-fungsional.
sumber
Saya seorang programmer non-FP dan baru-baru ini saya memodifikasi kode kolega saya dalam JavaScript. Ada permintaan-Http dengan panggilan balik yang sangat mirip dengan pernyataan yang disertakan oleh Anda. Saya harus mengatakan bahwa saya butuh waktu (seperti setengah jam) untuk menyelesaikannya (kode semuanya tidak terlalu besar).
Tidak ada komentar, dan saya pikir tidak ada keharusan untuk itu. Saya bahkan tidak meminta kolega saya untuk membantu saya memahami kodenya.
Dengan mempertimbangkan bahwa saya bekerja selama sekitar 1,5 tahun, saya pikir sebagian besar programmer akan dapat memahami dan memodifikasi kode seperti itu, sejak saya melakukannya.
Selain itu, seperti yang dikatakan Joachim Sauer dalam komentarnya, sering ada potongan-potongan FP dalam banyak bahasa, seperti C # (indexOf, misalnya). Begitu banyak programmer non-FP menangani hal ini cukup sering, dan potongan kode yang Anda masukkan bukanlah sesuatu yang mengerikan atau tidak dapat dipahami.
sumber
Saya akan mengatakan ya!
Ada banyak aspek pemrograman fungsional, dan menggunakan fungsi tingkat tinggi, seperti dalam contoh Anda, hanya salah satunya.
Sebagai contoh, saya menganggap menulis fungsi murni menjadi sangat penting untuk setiap perangkat lunak yang ditulis dalam bahasa apa pun (di mana "murni" maksud saya tidak ada efek samping), karena:
Saya juga sering menghindari mutasi nilai dan variabel - konsep lain yang dipinjam dari FP.
Kedua teknik ini berfungsi dengan baik dalam Python dan bahasa lain yang umumnya tidak diklasifikasikan sebagai fungsional. Mereka bahkan sering didukung oleh bahasa itu sendiri (yaitu
final
variabel di Jawa). Dengan demikian, programmer pemeliharaan di masa depan tidak akan menghadapi hambatan besar untuk memahami kode.sumber
Kami melakukan diskusi yang sama tentang perusahaan tempat saya bekerja tahun lalu.
Diskusi tersebut membahas "kode magis" dan apakah itu didorong atau tidak. Ketika melihat lebih dalam lagi, tampaknya orang memiliki pandangan yang sangat berbeda tentang apa yang sebenarnya merupakan "kode magis". Orang-orang yang mengemukakan diskusi tampaknya sebagian besar berarti bahwa ekspresi (dalam PHP) yang menggunakan gaya fungsional adalah "kode magis" sedangkan pengembang yang berasal dari bahasa lain yang menggunakan lebih banyak gaya FP dalam kode mereka tampaknya berpikir bahwa kode magis agak ketika Anda membuat inklusi dinamis file melalui nama file dan sebagainya.
Kami tidak pernah sampai pada kesimpulan yang bagus tentang hal ini, lebih dari itu kebanyakan orang berpikir kode yang terlihat asing adalah "ajaib" atau sulit dibaca. Jadi, apakah itu ide yang baik untuk menghindari kode yang tampaknya asing bagi pengguna lain? Saya pikir itu tergantung di mana ia digunakan. Saya akan menahan diri dari menggunakan ekspresi fp-style (inklusi file dinamis dan sebagainya) dalam metode utama (atau bagian sentral penting dari aplikasi) di mana data harus berupa terowongan dengan cara yang jelas dan mudah dibaca, intuitif, cara. Di sisi lain, saya tidak berpikir seseorang harus takut untuk mendorong amplop, pengembang lain mungkin akan belajar FP dengan cepat jika mereka dihadapkan dengan kode FP dan mungkin memiliki sumber daya yang baik di rumah untuk berkonsultasi tentang masalah tersebut.
TL; DR: Hindari di bagian tengah aplikasi tingkat tinggi (yang perlu dibaca untuk tinjauan umum fungsionalitas aplikasi). Kalau tidak gunakan itu.
sumber
Komunitas C ++ baru-baru ini mendapatkan lambda juga, dan saya percaya mereka memiliki pertanyaan yang kira-kira sama. Namun, jawabannya mungkin tidak sama. Setara dengan C ++ adalah:
Sekarang
std::copy
bukan hal baru, dan_if
variasinya juga tidak baru, tetapi lambda adalah. Namun itu didefinisikan dengan cukup jelas dalam konteks:dur
ditangkap dan karenanya konstan,Item i
bervariasi dalam loop, danreturn
pernyataan tunggal melakukan semua pekerjaan.Ini terlihat dapat diterima oleh banyak pengembang C ++. Saya belum mencicipi pendapat tentang lambda tingkat tinggi, dan saya berharap penerimaan jauh lebih sedikit.
sumber
Posting potongan kode ke sesama dev yang tidak lancar menggunakan python, dan tanyakan padanya apakah dia bisa menghabiskan 5 menit memeriksa kode untuk melihat apakah dia memahaminya.
Jika ya, Anda mungkin baik untuk pergi. Jika tidak, Anda harus membuatnya lebih jelas.
Bisakah kolega Anda menjadi bodoh dan tidak mengerti sesuatu yang harus jelas? Ya, tetapi Anda harus selalu memprogram sesuai dengan KISS.
Mungkin kode Anda lebih efisien / tampan / elegan daripada pendekatan yang lebih mudah, idiot-bukti? Maka Anda perlu bertanya pada diri sendiri: apakah saya perlu melakukan ini? Sekali lagi, jika jawabannya tidak, maka jangan lakukan itu!
Jika setelah semua ini, Anda masih berpikir Anda perlu dan ingin melakukannya dengan cara FP, maka tentu saja lakukanlah. Percayai insting Anda, mereka lebih cocok untuk kebutuhan Anda daripada kebanyakan orang di forum apa pun :)
sumber