Saya telah mencatat bahwa dukungan IDE sama sekali tidak baik, tetapi bahasa itu sendiri mendukung idiom pemrograman fungsional jauh lebih bersih.
Saya telah mencatat bahwa dukungan IDE sama sekali tidak baik, tetapi bahasa itu sendiri mendukung idiom pemrograman fungsional jauh lebih bersih.
Jawaban:
Saya telah memprogram Scala selama lebih dari satu tahun sekarang, jadi saya akan mencoba mengatur diri saya kembali setahun untuk menjawab pertanyaan ini.
Poin di atas kurang lebih adalah apa yang saya pikirkan tentang Scala sebelum saya mulai mempelajarinya.
Dalam setahun, inilah yang saya temukan:
Yah, saya pikir Scala terlalu kompleks. Rasanya seperti C ++ karena memiliki segudang cara berbeda dalam melakukan sesuatu. Beberapa orang akan menyebutnya "kekayaan", "ekspresif" atau "kekuatan", tetapi jarak tempuh Anda mungkin berbeda-beda. Dalam banyak proyek dunia nyata Anda harus membatasi secara artifisial fitur bahasa apa yang akan Anda gunakan dan yang tidak, sehingga semua pengembang yang terlibat dapat berbicara dengan subset bahasa yang sama.
Untuk pemrograman fungsional, saya lebih suka Clojure , yang jauh lebih sederhana daripada Scala.
Biarkan perang suci dimulai ;-)
Sekitar satu tahun yang lalu, ketika saya menjadi semakin frustrasi tentang masa depan produk-produk startup saya jika saya terus menggunakan Java, saya memutuskan untuk mencoba Scala. Saya sudah memprogram dalam JavaScript dan Python pada saat itu, Ruby juga merupakan alternatif yang baik, tetapi saya sedang mencari bahasa yang diketik secara statis, lebih disukai yang bisa berjalan di JVM.
Saya benar-benar mencoba untuk menyukai Scala, saya benar-benar menyukainya, tetapi saya mendapati kode itu benar-benar jelek dan sulit dimengerti. Saya secara dramatis bertanya-tanya bahwa jika Scala adalah jawaban terbaik kami untuk Jawa, maka saya pasti kacau dan dihukum untuk terus bekerja dengan bahasa yang saya tidak sukai ...
Untungnya, tidak terlalu lama setelah itu, saya mengetahui tentang Fantom . Oh man, apa aku menyukainya! Bagi saya, itu seperti jawaban kemegahan Amerika terhadap birokrasi Jerman! Itu sesuai dengan persyaratan yang saya cari di Scala, tetapi jauh lebih elegan . Itu Vim , Eclipse dan Netbeans integrasi, baik kerangka web , dewasa produk berjalan dengan itu, kecil tapi sangat membantu masyarakat ... Dinamis dan Statis mengetik! Saya bersukacita!
(Saya bisa melanjutkan tetapi posting ini dimaksudkan untuk Scala, bukan Fantom, jadi saya berhenti di sini. Preferensi saya jelas , namun ada posting ini yang membandingkan keduanya. Saya tidak pernah bisa mengerti mengapa Fantom mendapat sedikit perhatian jika dibandingkan dengan Scala. Tapi ternyata saya bukan satu-satunya, jika Anda mendengarkan [ mp3 ] podcast ini sampai akhir.)
Ketika saya awalnya mencoba-coba Scala 2 tahun yang lalu, itu tampak asing dan menakutkan bagi saya. Pada titik tertentu saya menemukan bahwa bahasa inti sebenarnya jauh lebih sederhana daripada Java, tetapi sintaks dan semantiknya sangat fleksibel sehingga Anda dapat membuat konstruksi bahasa baru seperti itu, bahkan tanpa fitur makro. Sejak itu saya sepenuhnya beralih ke Scala untuk semua proyek Java saya, karena memungkinkan saya menulis tanpa terlalu banyak kode boilerplate.
Saya suka Clojure, tetapi ada beberapa situasi, di mana platform membutuhkan Anda untuk mengkompilasi bytecode statis (Android, applet, ...) dan selagi Anda bisa melakukannya, di Scala, itu ada di sana.
Sementara Scala memungkinkan Anda memecahkan banyak masalah secara fungsional, saya sering menemukan masalah ketika menggunakan kelas terasa lebih alami. Itu membuat hal-hal sedikit lebih kompleks, tetapi jauh dari kompleksitas dan rasa sakit dari C ++.
Yang paling penting bagi saya ketika saya benar-benar mulai belajar bahasa adalah bahwa saya dapat memprogram seperti yang saya lakukan di Jawa, hanya tanpa suara (sedikit seperti ketika Anda memulai Groovy), tetapi pada akhirnya Anda ingin mencoba menyelam lebih dalam ke dalam kekuatan bahasa - tumbuh bersama Anda.
Tentang pertanyaan IDE: Setelah menggunakan Emacs untuk semuanya, semua masalah IDE saya hilang :-)
Saya suka Scala karena banyak alasan, tetapi ada satu yang sering diabaikan: kesederhanaannya.
Scala mungkin tidak sesederhana, katakanlah, Oberon, tetapi itu jauh lebih sederhana daripada beberapa bahasa lain. Spesifikasi Bahasa Scala adalah ~ 160 halaman, Spesifikasi Bahasa Jawa adalah ~ 600 (hanya bahasa, bukan JVM atau perpustakaan!), Spesifikasi Bahasa ECMA-334 C # (yang AFAIK terkait dengan subset Visual C # 2.0) adalah ~ 440 halaman (ini tanpa hal-hal seperti pemahaman permintaan LINQ, ekspresi lambda, metode ekstensi, co-dan contravariance generik dynamic
,, argumen opsional dengan nilai default, argumen kata kunci, var
). Bahkan draf saat ini untuk ECMAScript 5.1 lebih besar di ~ 210 halaman. Dan tentu saja bahasa "default" saya sendiri, Ruby, yang ISO Draft saat ini berbobot ~ 310 halaman, yang hanya menentukan subset kecil yang hampir tidak biasa dari persimpangan Ruby 1.8.6, 1.9.1 dan 1.9.2.
Inilah yang menyebalkan tentang Scala:
Null pointer adalah ide yang sangat buruk untuk memulai. Hoare menyebutnya "kesalahan miliaran dolar", tetapi Scala bahkan lebih buruk. Ini memiliki objek bernama null, Null, None, dan Nil. null adalah untuk interoperabilitas dengan Java. Null adalah bentuk null pointer dari spesifikasi DOM W3C, Tidak ada yang harus diganti dengan nol, dan Nil adalah sesuatu yang kosong.
Ketika konstruksi bahasa berubah menjadi hacky, biasanya programmer yang harus disalahkan dan bukan bahasa. Di Scala, bagaimanapun, bahasa inti sudah berisi kelas perpustakaan yang satu-satunya perilaku yang didokumentasikan adalah "Ini adalah retasan". Tidak percaya itu Cari scaladoc untuk scala.xml.Group.
Terakhir, Scala didokumentasikan dengan buruk. Hampir tidak ada kelas scala dalam dokumentasi resmi yang disertai dengan kode contoh. Scala secara signifikan lebih sulit untuk dipelajari daripada Java dan membutuhkan pengetahuan mendalam dalam ilmu komputer.
Untuk menghindari keliru sebagai pembenci scala, inilah yang saya sukai:
null
adalah null pointer Java, Null
adalah "tipe" itu. None
adalah salah satu "keadaan" dari Option[T]
, koleksi dengan salah satu atau nol elemen. Nil
adalah daftar kosong. Meskipun Anda ingin membuatnya terdengar menakutkan, sebenarnya tidak. Jenis-jenis itu tidak dapat diganti atau dipertukarkan satu sama lain dan berperilaku seperti yang seharusnya.
Scala itu kompleks. Tidak ada jalan lain! Sintaksnya sangat fleksibel dan dapat dikustomisasi dalam banyak cara (di atas semua operator / notasi infiks) - dan sistem jenis memiliki fitur yang lebih berbeda daripada bahasa lain yang saya tahu.
Jadi hal-hal yang tidak lurus seperti misalnya di Haskell: Typeclasses untuk menutupi semuanya.
Ketika Scala mencoba menyatukan pemrograman fungsional, OO, pemrograman prosedural dan perpustakaan java serta ide-ide sendiri, kami akhirnya berakhir dengan banyak konsep yang entah bagaimana tampaknya "mengarah ke arah yang sama":
Memilih di antara mereka tampaknya sulit pada awalnya dan orang mungkin dengan mudah bertanya-tanya apakah seseorang telah menemukan solusi yang tepat untuk beberapa masalah. Bahkan sangat mudah untuk menghasilkan barang-barang yang diretas dengan menyalahgunakan implicit
.
Tetapi yang menarik adalah: Scala bekerja. Kadang-kadang sulit untuk memahami mengapa (terutama mencari tahu melalui apa konversi implisit + warisan + ... beberapa objek punya fungsi X
), tetapi Anda tidak perlu repot tentang hal itu sebagian besar waktu.
Tulis Scala sejelas mungkin dan itu akan berhasil. Jangan bingung dengan semua yang mungkin dan gunakan saja yang Anda butuhkan. Dan jika Anda membutuhkan sesuatu, Anda dapat yakin bahwa entah bagaimana Scala memilikinya;)
Dan semakin baik Anda, semakin Anda dapat menyesuaikan Scala dengan operator, implisit, monad, sintaks funky ... dan akhirnya mendapatkan sesuatu yang dekat dengan DSL yang akan dengan sempurna mengatasi masalah Anda.
Bagaimanapun, Anda selalu memiliki kemungkinan untuk hanya menggunakan Scala sebagai Java yang jauh lebih baik dengan sintaks yang lebih bersih, lebih mudah, inferensi jenis dan beberapa fitur fungsional.
Ini adalah bahasa yang sangat baik yang lebih sederhana dari Jawa dalam banyak hal.
Kebanyakan orang tidak akan suka, programmer Java atau tidak, karena alasan yang sama bahwa kebanyakan orang, programmer atau tidak, tidak suka belajar bahasa pemrograman baru. Saya menduga bahwa kebanyakan orang yang belajar bahasa pemrograman bahkan tidak suka belajar itu.
Jika Anda khawatir tentang bahasa yang rumit seperti C ++, saya akan menghindari Clojure seperti wabah. Mengeluh bahwa Scala lebih rumit daripada Clojure telah menjadi argumen mundur bagi orang-orang yang sama sekali tidak tahu tentang satu atau kedua bahasa.
Clojure memiliki makro, yang berarti Anda dapat mengubah sintaksis bahasa sebanyak yang Anda inginkan, memberi Anda tidak hanya "segudang cara berbeda dalam melakukan sesuatu" tetapi sejumlah cara yang hampir tak terbatas dalam melakukan sesuatu. Dan tidak ada sintaks baru ini yang dibuat oleh programmer dengan makro akan didokumentasikan di mana saja dalam spesifikasi bahasa.
"Tapi kita bisa menghindari menggunakan makro atau mengatur mana yang diizinkan dalam kode kita", katamu. Selamat, Anda sekarang memiliki "untuk secara artifisial membatasi fitur bahasa apa yang akan Anda gunakan dan yang tidak", yang persis seperti apa yang digunakan oleh para idiot yang mengoceh yang menggunakan Clojure of Scala sebagai alasan mereka untuk menghindari Scala untuk memulai.
Saya sangat suka jenis yang lebih terperinci dari perpustakaan Scala. Sepertinya perpustakaan koleksi baru dipikirkan dengan matang. Saya juga suka bagaimana ini mengurangi jumlah kode yang diperlukan untuk kelas sederhana, dan konsep fungsional yang ditambahkannya. Inferensi tipenya juga sangat membantu. Rasanya seperti Jawa tanpa roda pelatihan. Setelah menggunakan C # untuk sementara waktu, Scala benar-benar terasa seperti pesaing, dengan Java masih berguna tetapi tertinggal.
Sebagai seorang programmer Java, saya awalnya menemukan Scala menarik. Namun, setelah mencoba-coba untuk sementara waktu (dan berlari ke hampir semua positif / negatif yang sudah terdaftar oleh orang lain), saya merasa sangat "meh" ke arah itu. Peningkatan bahasa diimbangi oleh ketersediaan toolets yang lebih rendah. Aku hanya tidak bisa menemukan alasan untuk beralih. Itu bagus, tapi itu tidak "cukup baik" untuk membuat kasus untuk beralih. Tidak memiliki faktor kegembiraan subyektif (seperti Clojure tampaknya).