Selama setahun terakhir saya telah menulis kode Scala (berasal dari latar belakang Java). Saya sangat suka bagaimana Anda bisa membuat kode yang lebih sederhana dan lebih bersih, dengan vals, kelas kasus, fungsi peta / filter / lambda, implisit dan inferensi tipe. Saya telah menggunakannya sebagian besar untuk aplikasi berbasis Akka .
Tahun ini saya sedang mengerjakan proyek Scala dengan tim baru, yang sangat suka pemrograman fungsional. Mereka banyak menggunakan Scalaz , dan kode diisi di mana-mana dengan aplikatif, batas konteks, pembaca / penulis / monad negara, bahkan metode utama adalah "dibungkus" dalam monad I / O. Alasan mereka adalah bahwa ini membuat kompiler "bekerja untuk kita" dalam menyatakan bahwa kode itu benar, dan setiap fungsi bebas dari efek samping.
Meski begitu, dari sudut pandang saya semua sintaks ini benar-benar menghalangi logika bisnis. Misalnya, jenis "MyBusinessObject" baik-baik saja, juga jenis seperti "Daftar [MyBusinessObject]", "Opsi [MyBusinessObject]" atau bahkan "Future [MyBusinessObject]". Mereka semua memiliki makna dan tujuan yang jelas. Di sisi lain, kode seperti:
def method[M[_]: Applicative] = {
case (a, b) => (ca[M](a) |@| cb[M](b)) {
case t @ (ra, rb) =>
if (ra.result && rb.result) t.right
else t.left
}
}
apakah ini menambah kompleksitas pada program, atau hanya saya yang tidak terbiasa dengan cara pemrograman seperti ini?
sumber
>>=
dan<$>
, yang tidak berarti apa-apa sampai Anda tahu apa yang mereka lakukan. Namun, setelah mempelajari apa yang mereka maksud, mereka membaca dengan sangat alami dan cepat kepada saya sekarang. Bukan jawaban, hanya pengalaman obyektif saya dengan hal-hal seperti ini. Saya menggunakan Scala juga, tetapi tidak memiliki pengalaman dengan perpustakaan Scalaz.for(i=0; i<7; ++i) { trivialOperation(i); }
dengan beberapatrivialOperationCount
variabel canggung , bukan?) Sekarang, bahasa pemrograman fungsional dengan pencocokan pola kadang-kadang akan memperkenalkan beberapa variabel lagi di mana Anda baru saja menuliskan panggilan metode aksesor di OO. Hasilnya umumnya lebih ringkas; mungkin sedikit kurang jelas, tetapi melihat deklarasi data biasanya membuatnya jelas dengan cepat. Mengetik statis sangat membantu, tidak seperti di APL.Jawaban:
Ini tidak ada hubungannya dengan pemrograman fungsional - Anda dapat menemukan situasi semacam ini dalam konteks bahasa pemrograman lain - pengembang yang sangat menyukai konstruksi lanjutan bahasa "mereka" sehingga mereka mengabaikan akal sehat tentang keterbacaan dan menjaga hal-hal sederhana. Saya telah mengalami situasi seperti itu di C, C ++, Perl, Java, C #, Basic, dan bahasa non-fungsional lainnya. Bukan pemrograman fungsional yang menambah kompleksitas kode - programmer melakukannya.
Jangan salah paham, saya tidak menyarankan untuk menghindari fitur bahasa tingkat lanjut - tetapi penting untuk menemukan keseimbangan yang tepat dalam konteks yang diberikan. Saat menulis perpustakaan umum untuk penggunaan> 100.000 pengembang di seluruh dunia, ada langkah-langkah berbeda untuk diterapkan seperti ketika Anda menulis generator laporan individu hanya untuk kantor lokal Anda.
sumber
Saya akan mengatakan bahwa Anda tidak terbiasa dengan cara kode mereka setidaknya bagian dari gambar. Saya dalam situasi yang sama seperti Anda (datang dari C # ke F # dan bekerja dengan orang-orang dengan latar belakang Haskell), dan sementara saya merasa itu adalah pengalaman yang menarik, saya memiliki momen ketika saya membenturkan kepala ke dinding, mengurai sebuah terutama komposisi fungsi titik-berbelit-belit hanya untuk memahami apa yang terjadi di sana. Itu hal budaya.
Adapun apakah kode khusus ini menambah kompleksitas ke program - saya tidak tahu. Setuju bahwa sepotong kode generik dapat menjadi kompleks itu sendiri. Tetapi ini adalah utilitas, bukan bagian dari logika bisnis. Jika Anda ingin tahu apakah itu membuat basis kode lebih kompleks atau lebih sederhana, Anda harus membayangkan bagaimana itu harus terlihat tanpa potongan kode itu. Seringkali dengan konstruksi generik sedemikian rupa sehingga kompleks sendiri, tetapi kompleksitas yang dapat Anda muat pada satu layar. Pada saat yang sama mereka membuat seluruh basis kode sedikit lebih sederhana. Ini khususnya terjadi pada monad.
Kemudian lagi, itu juga bisa menjadi kasus 'seni demi seni', seperti yang disarankan @Doc Brown. Tidak bisa mengesampingkannya juga.
sumber
Saya berpendapat bahwa secara umum pemrograman fungsional mengurangi kompleksitas dengan menghilangkan keadaan yang bisa berubah, sehingga mengurangi jumlah kasus yang harus dipertimbangkan ketika mencoba memahami bagaimana bagian kode bekerja.
Namun, pemrograman fungsional memungkinkan tingkat abstraksi yang lebih tinggi, dan sementara kode yang sangat abstrak bisa sangat berguna, tetapi juga sulit untuk dipahami karena secara definisi dipisahkan dari konteks yang biasanya Anda gunakan untuk memandu pemahaman Anda. Komentar Anda "Mereka semua memiliki makna dan tujuan yang jelas" tentang objek bisnis tidak diragukan lagi benar, tetapi benar-benar merupakan cerminan dari fakta bahwa logika itu sangat spesifik untuk kebutuhan dan konteks yang sudah Anda pahami. Keberadaan konstruk seperti Monad memungkinkan Anda membuat sesuatu yang sangat berguna dengan sedikit usaha, tetapi web dipenuhi dengan halaman yang mencoba menjelaskan apa itu Monad. Itu abstraksi untukmu.
Juga, Scalaz ditulis oleh orang-orang yang telah makan dan bernafas dengan FP sejak lama; mereka ingin membawa fungsionalitas yang tersedia di Haskell ke Scala. Dengan melakukan itu mereka tidak berusaha pedagogis. Scalaz memanfaatkan kosakata dan gaya yang tampak jelas dan langsung bagi penulis tetapi asing bagi yang belum tahu. Metode yang membingungkan bagi kami semua tampak begitu jelas bagi para penulis, mengingat latar belakang Haskell mereka, sehingga mereka bahkan tidak memerlukan komentar.
Selain itu, sebagai bahasa pemrograman fungsional, Scala memiliki beberapa kekurangan (sebagian karena JVM memiliki kekurangan) yang memaksa penulis Scalaz untuk menulis kode yang lebih buruk dalam beberapa kasus. Sebagai contoh, kurangnya eliminasi panggilan ekor memaksa penggunaan trampolin dalam beberapa kode, dan kurangnya "sistem jenis" dapat menyulitkan tanda tangan jenis.
Dan akhirnya, Scalaz memanfaatkan dirinya sendiri. Itu bisa dianggap sebagai tanda kekuatannya, tetapi bagi yang belum tahu itu bisa menjadikan sumber teka-teki - setiap potongan kode acak yang Anda lihat cenderung memanfaatkan sesuatu yang tampak asing bagi Anda.
Tetap bertahan. Dan ini mungkin bisa membantu.
sumber
Apakah ini menambah kompleksitas pada program, atau hanya karena Anda tidak terbiasa dengan cara pemrograman seperti ini?
Menurut Anda mengapa kemungkinan ini tidak sama?
Kode yang ditulis dengan baik dapat dibaca oleh orang-orang yang tidak terbiasa dengan bahasa pemrograman tertentu. Beberapa bahasa (BASIC, Pascal, dll) dapat dibaca dan dipahami oleh anak-anak sekolah yang belum pernah melihat bahasa pemrograman sebelumnya.
Jika seseorang yang memiliki pengalaman dengan bahasa lain dan pengalaman dengan Scala (dan yang saya anggap telah bekerja dengan Scalaz selama setidaknya satu minggu dan memiliki rekan kerja untuk menjelaskan hal-hal yang lebih rumit) masih bingung; maka itu bukti bahwa ia telah menambah kompleksitas.
sumber
"Well written code can be read by people who aren't familiar with the specific programming language."
x[⍋x←6?40]
. Menurut Anda apa yang terjadi? Saya yakin tidak akan tahu ...