IDE desteğinin o kadar iyi olmadığını fark ettim, ancak dilin kendisi fonksiyonel programlama deyimlerini çok daha temiz bir şekilde destekliyor.
IDE desteğinin o kadar iyi olmadığını fark ettim, ancak dilin kendisi fonksiyonel programlama deyimlerini çok daha temiz bir şekilde destekliyor.
Yanıtlar:
Scala'yı bir yıldan fazla bir süredir programlıyorum, bu yüzden bu soruyu cevaplamak için kendimi bir yıl geriye almaya çalışacağım.
Yukarıdaki noktalar aşağı yukarı öğrenmeye başlamadan önce Scala hakkında düşündüğüm şeylerdi.
Bir yıl boyunca, bulduğum şey:
Bence Scala çok karmaşık. Bir şeyler yapmanın sayısız farklı yoluna sahip olması C ++ gibi hissettiriyor. Bazıları buna "zenginlik", "ifade" veya "güç" der, ancak kilometreniz değişebilir. Birçok gerçek dünya projesinde, hangi dil özelliklerini kullanacağınızı ve hangilerini kullanamayacağınızı yapay olarak sınırlamanız gerekir, böylece ilgili tüm geliştiriciler dilin aynı alt kümesini konuşabilir.
Fonksiyonel programlama için Scala'dan çok daha basit olan Clojure'u tercih ederim .
Kutsal savaş başlasın ;-)
Yaklaşık bir yıl önce, Java'yı kullanmaya devam edersem, başlangıç ürünlerimin geleceği hakkında gittikçe daha fazla hayal kırıklığına uğradım, Scala'yı denemeye karar verdim. Zaten JavaScript ve Python'da programlama yapıyordum, Ruby de iyi bir alternatifti, ancak statik olarak yazılmış bir dil, tercihen JVM'de çalışabilen bir dil arıyordum.
Scala'yı gerçekten sevmeye çalıştım, gerçekten yaptım, ama kodunu tamamen çirkin ve anlaşılması zor buldum. Scala'nın Java'ya en iyi cevabımız olsaydı, o zaman kesinlikle sevmediğim bir dille çalışmaya devam etmemden kesinlikle mahsur kaldım ve ...
Neyse ki, çok sonra değil, Fantom'u öğrendim . Ah adamım, sevdim mi? Bana göre bu, Alman bürokrasisine Amerikanın görkemli cevabı gibiydi! Scala'da aradığım gereksinimlerle eşleşti, ama çok daha zarif . Bu vardı Vim , Eclipse ve Netbeans entegrasyonu, güzel bir web çerçevesi , olgun ürünler bunun, küçük ama son derece yararlı ile çalışan topluluk ... Dinamik ve Statik yazarak! Sevindim!
(Devam edebilirdim, ancak bu yazı Fantom ile değil Scala ile ilgili olacak, bu yüzden burada duruyorum. Tercihim açık , yine de ikisini karşılaştıran bu yazı var . Fantom'un Scala ile karşılaştırıldığında neden bu kadar az dikkat çektiğini asla anlayamadım. Ama görünüşe göre bu podcast'i [ mp3 ] sonuna kadar dinlerseniz sadece ben değilim .)
Başlangıçta 2 yıl önce Scala ile uğraştığımda, uzaylı ve korkutucu görünüyordu bana. Bir noktada, çekirdek dilin aslında Java'dan çok daha basit olduğunu keşfettim, ancak sözdizimi ve anlambilimi o kadar esnektir ki, bir makro özelliği olmadan bile, bunun gibi yeni dil yapıları oluşturabilirsiniz. O zamandan beri tüm Java projelerim için tamamen Scala'ya geçtim, çünkü çok fazla kaynak kodu olmadan yazmama izin veriyor.
Clojure'u seviyorum, ancak platformun statik bayt kodunu (Android, uygulamalar, ...) derlemenizi istediği durumlar var ve bunu yaparken Scala'da sadece orada.
Scala birçok sorunu işlevsel bir şekilde çözmenize izin verirken, genellikle sınıfları kullanmanın daha doğal hissettirdiği sorunları bulurum. Bu, işleri biraz daha karmaşık hale getirir, ancak C ++ 'ın karmaşıklıklarına ve acılarına yakın bir yerde değildir.
Dili öğrenmeye başladığımda benim için en büyük paket, sadece Java'da yaptığım, sadece gürültü olmadan (Groovy'a başladığınızda biraz gibi) programlayabiliyordum, ama sonunda gücün daha derinlerine dalmaya çalışmak istedin dilin - seninle birlikte büyür.
IDE sorusu hakkında: Her şey için Emacs kullandıktan sonra, tüm IDE sorunlarım gitti :-)
Scala'yı birçok nedenden dolayı seviyorum, ancak genellikle gözden kaçan bir şey var: basitliği.
Scala, örneğin Oberon kadar basit olmayabilir, ancak diğer bazı dillerden çok daha basittir. Scala Dil Spesifikasyonu ~ 160 sayfa, Java Dil Spesifikasyonu ~ 600 (sadece dil, JVM veya kütüphaneler değil!), ECMA-334 C # Dil Spesifikasyonu (AFAIK, Visual C # 2.0'ın bir alt kümesine karşılık gelir) ~ 440 sayfa (LINQ sorgu anlama, lambda ifadeleri, uzantı yöntemleri, genel eş ve karşıtlık, dynamic
varsayılan değerlere sahip isteğe bağlı bağımsız değişkenler, anahtar kelime bağımsız değişkenleri, vb. var
). ECMAScript 5.1 için geçerli taslak bile ~ 210 sayfada daha büyük. Ve tabii ki, şu anki ISO Taslağı ~ 310 sayfa ağırlığında olan kendi "varsayılan" dilim olan Ruby, 1.8.8, 1.9.1 ve 1.9.2 kavşağının neredeyse alışılmadık derecede küçük bir alt kümesini belirtir.
İşte Scala hakkında berbat olan şey:
Boş gösterici, başlamak için oldukça kötü bir fikirdi. Hoare bunu "milyar dolarlık hatası" olarak adlandırdı, ancak Scala daha da kötü. Null, Null, None ve Nil adında nesneler vardır. null, Java ile birlikte çalışabilirlik içindir. Null, W3C DOM belirtimindeki null işaretçi formudur, Hiçbiri null ile değiştirilmemelidir ve Nil boş bir şeydir.
Dil yapıları hileli olduğu ortaya çıktığında, dili değil genellikle suçlayan programcıdır. Bununla birlikte, Scala'da temel dil zaten tek belgelenmiş davranışı "Bu bir hack'tir" olan kütüphane sınıflarını içermektedir. İnanmıyor musunuz? Scaladoc dosyasını scala.xml.Group için arayın.
Son olarak, Scala kötü bir şekilde belgelenmiştir. Resmi belgelerdeki neredeyse hiçbir scala sınıfı örnek kodla birlikte gelir. Scala'yı öğrenmek Java'dan çok daha zordur ve bilgisayar biliminde derin bilgi gerektirir.
Bir Scala-düşmanı ile karıştırılmamak için, işte aşkım:
null
Java'nın boş göstergesidir, Null
"türü" dir. bir ya da sıfır elemanlı bir koleksiyonun None
olası bir "durumu" Option[T]
dur. Nil
boş bir listedir. Kulağa korkutucu gelmek istesen de öyle değil. Bu türler birbiriyle değiştirilemez veya değiştirilemez ve tam olması gerektiği gibi davranırlar.
Scala olduğunu kompleksi. Kaçış yok! Sözdizimi son derece esnektir ve çeşitli şekillerde özelleştirilebilir (her şeyden önce operatörler / infix gösterimi) - ve tip sistemi bildiğim diğer dillerden daha farklı özelliklere sahiptir.
Yani işler örneğin Haskell: Typeclasses'taki gibi düz değildir.
Scala, işlevsel programlama, OO, prosedürel programlama ve java kütüphanelerini ve kendi fikirlerini bir araya getirmeye çalıştıkça, sonunda bir şekilde "aynı yönde" gibi görünen birçok kavramla karşılaşıyoruz :
Aralarında seçim yapmak ilk başta zor gibi görünüyor ve biri kolayca bir soruna doğru çözümü bulup bulmadığını merak edebilir . S'yi kötüye kullanarak hacky şeyler üretmek bile kolayca mümkündür implicit
.
Ama ilginç olan şu: Scala çalışıyor. Bazen nedenini anlamak zor olabilir (özellikle hangi örtülü dönüşümler + kalıtım + ... bazı nesnelerin işlevselliği olduğunu anlamak X
), ancak çoğu zaman bununla uğraşmak zorunda kalmazsınız.
Scala'yı olabildiğince basit yazın ve işe yarayacaktır. Mümkün olan her şeyle karıştırmayın ve sadece ihtiyacınız olanı kullanın. Ve bir şeye ihtiyacınız varsa, bir şekilde Scala'nın ona sahip olduğundan emin olabilirsiniz;)
Ve ne kadar iyi olursanız, Scala'yı operatörler, imalar, monadlar, korkak sözdizimi ile daha fazla özelleştirebileceksiniz ve nihayet sorununuzu mükemmel bir şekilde çözecek bir DSL'ye yakın bir şey elde edeceksiniz.
Sonuçta, her zaman daha temiz, daha kolay sözdizimi, tür çıkarım ve bazı fonksiyonel özelliklere sahip Scala'yı çok daha iyi bir Java olarak kullanma olanağına sahipsiniz.
Birçok yönden Java'dan daha basit olan mükemmel bir dildir.
Çoğu insan, Java programcısı olsun ya da olmasın, çoğu insan, programcı ya da değil, aynı zamanda yeni programlama dilleri öğrenmeyi sevmez. Bir programlama dili öğrenen çoğu insanın bunu öğrenmeyi bile sevmediğinden şüpheleniyorum.
Bir dilin C ++ kadar karmaşık olmasından endişe ediyorsanız, Clojure'dan veba gibi kaçınırım. Scala'nın Clojure'dan daha karmaşık olduğunu düşünmek, bir veya iki dil hakkında tamamen cahil olan insanlar için geri dönüş argümanı haline geldi.
Clojure'un makroları vardır, bu da dilin sözdizimini istediğiniz kadar değiştirebileceğiniz anlamına gelir ve size sadece "bir şeyler yapmanın sayısız yolu" değil, aynı zamanda neredeyse sonsuz sayıda şey yapma yolu verir. Ve programcıların makrolarla oluşturduğu bu yeni sözdiziminin hiçbiri dil spesifikasyonunun herhangi bir yerinde belgelenmeyecektir.
"Ama makro kullanmaktan kaçınabiliriz veya kodumuzda hangilerine izin verileceğini düzenleyebiliriz" diyorsunuz. Tebrikler, şimdi "hangi dil özelliklerini kullanacağınızı ve ne kullanmamanızı yapay olarak sınırlamanız" gerekiyor, bu da Scala Clojure'u kullanan gevezelik salakların Scala'yı başlamaktan kaçınma nedeni olarak kullandıkları şeydir.
Scala kütüphanesinin daha ayrıntılı türlerini gerçekten çok seviyorum. Yeni koleksiyon kütüphanesi iyi düşünülmüş gibi görünüyor. Ayrıca basit sınıflar için gerekli kod miktarını ve eklediği fonksiyonel kavramları nasıl azalttığını seviyorum. Türü çıkarımı da çok faydalıdır. Eğitim tekerlekleri olmadan Java gibi geliyor. Bir süre C # kullandıktan sonra, Scala aslında bir rakip gibi hissediyor, Java hala kullanışlı ama geride kalıyor.
Bir Java programcısı olarak başlangıçta Scala'yı ilginç buldum. Ancak, bir süre onunla dabbling sonra (ve zaten başkaları tarafından listelenen hemen hemen tüm pozitif / negatif içine çalışan), ona karşı çok "meh" hissediyordu. Dil geliştirmeleri, araç setlerinin daha az kullanılabilirliği ile dengelenir. Geçiş yapmak için belirleyici bir neden bulamadım. İyi, ama geçiş için bir dava açmak için "yeterince iyi" değil. Bu öznel heyecan faktörüne de sahip değil (Clojure gibi görünüyor).