ฉันได้ตั้งข้อสังเกตว่าการสนับสนุน IDE นั้นใกล้เคียงกับที่ดี แต่ภาษานั้นรองรับสำนวนการเขียนโปรแกรมที่ใช้งานได้ดีกว่าหมดจด
ฉันได้ตั้งข้อสังเกตว่าการสนับสนุน IDE นั้นใกล้เคียงกับที่ดี แต่ภาษานั้นรองรับสำนวนการเขียนโปรแกรมที่ใช้งานได้ดีกว่าหมดจด
คำตอบ:
ฉันได้เขียนโปรแกรม Scala มานานกว่าหนึ่งปีแล้วดังนั้นฉันจะพยายามตั้งเวลาให้ตัวเองหนึ่งปีเพื่อตอบคำถามนี้
ประเด็นข้างต้นเป็นสิ่งที่ฉันคิดเกี่ยวกับสกาล่ามากขึ้นหรือน้อยลงก่อนที่ฉันจะเริ่มเรียนรู้
ในช่วงเวลาหนึ่งปีนี่คือสิ่งที่ฉันค้นพบ:
ฉันคิดว่า Scala ซับซ้อนเกินไป มันให้ความรู้สึกเหมือนกับว่าซีพลัสพลัสมีวิธีการทำสิ่งต่าง ๆ มากมาย บางคนอาจเรียกสิ่งนี้ว่า "ความร่ำรวย", "ความหมาย" หรือ "พลัง" แต่ระยะทางของคุณอาจแตกต่างกันไป ในโครงการในโลกแห่งความเป็นจริงคุณจะต้อง จำกัด คุณสมบัติของภาษาที่คุณจะใช้โดยไม่ตั้งใจและสิ่งที่ไม่เป็นเช่นนั้นเพื่อให้นักพัฒนาซอฟต์แวร์ทุกคนสามารถพูดภาษาเดียวกันได้
สำหรับการเขียนโปรแกรมการทำงานฉันชอบClojureซึ่งเป็นวิธีที่ง่ายกว่า Scala
ให้สงครามศักดิ์สิทธิ์เริ่มต้น ;-)
ประมาณหนึ่งปีที่ผ่านมาเมื่อฉันเริ่มรู้สึกผิดหวังมากขึ้นเกี่ยวกับอนาคตของผลิตภัณฑ์เริ่มต้นของฉันหากฉันยังคงใช้ Java ต่อไปฉันจึงตัดสินใจลอง Scala ฉันกำลังเขียนโปรแกรมใน JavaScript และ Python อยู่แล้วในเวลานั้น Ruby เป็นทางเลือกที่ดี แต่ฉันกำลังมองหาภาษาที่พิมพ์แบบคงที่โดยเฉพาะอย่างยิ่งภาษาที่สามารถใช้กับ JVM ได้
ฉันพยายามที่จะชอบสกาล่าจริงๆฉันทำ แต่ฉันพบว่ามันเป็นรหัสที่น่าเกลียดที่สุดและยากที่จะเข้าใจ ฉันสงสัยอย่างมากว่าถ้า Scala เป็นคำตอบที่ดีที่สุดของเราต่อ Java แล้วฉันก็รู้สึกผิดและถูกตัดสินให้ทำงานด้วยภาษาที่ฉันไม่ชอบเลย ...
โชคดีที่ไม่ยาวเกินไปหลังจากนั้นผมพบข้อมูลเกี่ยวFantom โอ้ฉันรักมันมาก! สำหรับฉันมันเป็นเหมือนคำตอบอันงดงามของอเมริกันต่อระบบราชการของเยอรมัน! มันจับคู่ความต้องการของผมกำลังมองหาใน Scala แต่มากขึ้นอย่างหรูหรา มันมีการรวมกันเป็นกลุ่ม , EclipseและNetbeans , กรอบเว็บที่ดี, ผลิตภัณฑ์ที่เป็นผู้ใหญ่ทำงานกับมัน, ชุมชนขนาดเล็ก แต่มีประโยชน์อย่างไม่น่าเชื่อ... การพิมพ์แบบไดนามิกและแบบคงที่! ฉันดีใจ!
(ฉันสามารถดำเนินการต่อได้ แต่โพสต์นี้มีความหมายเกี่ยวกับสกาล่าไม่ใช่ Fantom ดังนั้นฉันจึงหยุดที่นี่ความชอบของฉันชัดเจนแต่มีโพสต์นี้เปรียบเทียบทั้งสองฉันไม่เคยเข้าใจว่าทำไม Fantom ได้รับความสนใจน้อยมากเมื่อเทียบกับ Scala แต่เห็นได้ชัดว่าฉันไม่ใช่คนเดียวถ้าคุณฟังพอดคาสต์นี้ [ mp3 ] จนกระทั่งจบ)
ตอนแรกที่ฉันขลุกกับสกาล่าเมื่อ 2 ปีที่แล้วมันดูแปลกและน่ากลัวสำหรับฉัน ในบางครั้งฉันค้นพบว่าภาษาหลักนั้นง่ายกว่า Java จริง ๆ แต่ไวยากรณ์และความหมายของมันนั้นยืดหยุ่นมากจนคุณสามารถสร้างโครงสร้างภาษาใหม่แบบนี้ได้แม้ว่าจะไม่มีคุณสมบัติมาโครก็ตาม ฉันได้เปลี่ยนมาใช้ Scala อย่างสมบูรณ์สำหรับโปรเจ็กต์ Java ทั้งหมดของฉันเพราะมันช่วยให้ฉันเขียนได้โดยไม่ต้องใช้รหัสสำเร็จรูปมากเกินไป
ฉันชอบ Clojure แต่มีบางสถานการณ์ที่แพลตฟอร์มต้องการให้คุณคอมไพล์ไปเป็น bytecode แบบสแตติก (Android, applets, ... ) และในขณะที่คุณสามารถทำได้ใน Scala ก็แค่นั้นเอง
ในขณะที่สกาล่าช่วยให้คุณแก้ปัญหาต่าง ๆ ในลักษณะการใช้งานฉันมักพบปัญหาที่การใช้คลาสรู้สึกเป็นธรรมชาติมากขึ้น นั่นทำให้สิ่งต่าง ๆ ซับซ้อนขึ้นเล็กน้อย แต่ไม่มีที่ไหนใกล้กับความซับซ้อนและความเจ็บปวดของ C ++
สิ่งที่ดีที่สุดสำหรับฉันเมื่อฉันเริ่มเรียนรู้ภาษาคือฉันสามารถเขียนโปรแกรมในภาษาจาวาได้โดยไม่ต้องมีเสียงรบกวน (นิด ๆ หน่อย ๆ เหมือนตอนที่คุณเริ่ม Groovy) แต่ในที่สุดคุณต้องการที่จะดำดิ่งสู่พลัง ของภาษา - มันเติบโตไปพร้อมกับคุณ
เกี่ยวกับคำถาม IDE: หลังจากใช้ Emacs สำหรับทุกสิ่งแล้วปัญหา IDE ทั้งหมดของฉันก็หายไป :-)
ฉันชอบสกาล่าด้วยเหตุผลหลายประการ แต่มีสิ่งหนึ่งที่มักถูกมองข้ามนั่นคือความเรียบง่าย
สกาล่าอาจไม่ง่ายเหมือนพูดโอเบรอน แต่มันค่อนข้างง่ายกว่าภาษาอื่น ๆ ข้อมูลจำเพาะภาษาสกาล่าคือ ~ 160 หน้าข้อมูลจำเพาะภาษา Java คือ ~ 600 (เฉพาะภาษาไม่ใช่ JVM หรือห้องสมุด!) ข้อมูลจำเพาะภาษา ECMA-334 C # (AFAIK สอดคล้องกับชุดย่อยของ Visual C # 2.0) คือ ~ 440 หน้า (สิ่งนี้ไม่มีสิ่งใดเช่นความเข้าใจในการสืบค้น LINQ, การแสดงออกแลมบ์ดา, วิธีการขยาย, การร่วมกันทั่วไปและความdynamic
ขัดแย้ง, อาร์กิวเมนต์ที่เป็นตัวเลือกที่มีค่าเริ่มต้น, อาร์กิวเมนต์ของคำหลักvar
) แม้แต่ร่างปัจจุบันสำหรับ ECMAScript 5.1 ก็ใหญ่กว่าที่ประมาณ 210 หน้า และแน่นอนว่าภาษา "เริ่มต้น" ของฉันเอง Ruby ซึ่งมี ISO Draft ปัจจุบันมีน้ำหนักอยู่ที่ ~ 310 หน้าซึ่งระบุเซตย่อยเล็ก ๆ ที่แทบผิดปกติของการแยก Ruby 1.8.6, 1.9.1 และ 1.9.2
นี่คือสิ่งที่ sucks เกี่ยวกับสกาล่า:
ตัวชี้โมฆะเป็นความคิดที่เลวทีเดียว Hoare เรียกมันว่า "ข้อผิดพลาดพันล้านดอลลาร์" ของเขา แต่ Scala ยิ่งแย่ลงไปอีก มันมีวัตถุที่ชื่อว่า null, Null, None และ Nil null ใช้สำหรับการทำงานร่วมกันกับ Java Null เป็นรูปแบบตัวชี้โมฆะข้อกำหนด W3C DOM ไม่มีสิ่งที่ควรถูกแทนที่ด้วย null และไม่มีเป็นสิ่งที่ว่างเปล่า
เมื่อภาษาสร้างกลายเป็นแฮ็คมันมักจะเป็นโปรแกรมเมอร์ที่จะตำหนิและไม่ใช่ภาษา อย่างไรก็ตามใน Scala ภาษาหลักประกอบด้วยคลาสไลบรารีที่มีพฤติกรรมที่มีเอกสารเท่านั้นคือ "นี่คือแฮ็ก" ไม่เชื่อเหรอ ค้นหา scaladoc สำหรับ scala.xml.Group
สุดท้ายไม่น้อย Scala ได้รับการบันทึกไว้ไม่ดี แทบทุกคลาสสกาล่าในเอกสารอย่างเป็นทางการมาพร้อมกับตัวอย่างรหัส สกาล่านั้นยากต่อการเรียนรู้มากกว่าชวาและต้องการความรู้ด้านวิทยาการคอมพิวเตอร์อย่างลึกซึ้ง
เพื่อหลีกเลี่ยงการถูกเข้าใจผิดว่าเป็นผู้เกลียดชังนี่คือสิ่งที่ฉันชอบ:
null
เป็นตัวชี้โมฆะของ Java Null
เป็น "ประเภท" ของมัน None
เป็นหนึ่งใน "สถานะ" ที่เป็นไปได้ของOption[T]
คอลเล็กชันที่มีองค์ประกอบหนึ่งหรือเป็นศูนย์ Nil
เป็นรายการว่างเปล่า ในขณะที่คุณต้องการทำให้มันฟังดูน่ากลัว ประเภทเหล่านั้นไม่สามารถเปลี่ยนได้หรือเปลี่ยนได้ซึ่งกันและกันและประพฤติตนอย่างที่ควรทำ
สกาล่ามีความซับซ้อน ไม่มีทางรอบ! ไวยากรณ์ของมันมีความยืดหยุ่นสูงมากและสามารถปรับแต่งได้หลายวิธี (เหนือตัวดำเนินการทั้งหมด / เครื่องหมายมัด) - และระบบประเภทมีคุณสมบัติที่แตกต่างกว่าภาษาอื่น ๆ ที่ฉันรู้จัก
ดังนั้นสิ่งต่าง ๆ ไม่ได้ตรงไปตรงมาเช่นใน Haskell: Typeclasses ที่ครอบคลุมพวกมันทั้งหมด
เมื่อสกาล่าพยายามรวบรวมฟังก์ชั่นการเขียนโปรแกรม, OO, โพรซีเดอร์เชิงโพรซีเดอร์และจาวาไลบรารีรวมทั้งความคิดของตัวเองในที่สุดเราก็จบลงด้วยแนวคิดมากมายที่ดูเหมือนจะเป็นไปในทิศทางเดียวกัน:
การเลือกในหมู่พวกเขาดูเหมือนจะยากในตอนแรกและบางคนอาจสงสัยว่าใครพบวิธีแก้ไขปัญหาที่ถูกต้อง ก็จะยิ่งเป็นไปได้อย่างง่ายดายในการผลิตสิ่ง hacky โดยเหยียดหยามimplicit
s
แต่สิ่งที่น่าสนใจคือ: Scala ใช้งานได้ บางครั้งก็ยากที่จะเข้าใจว่าทำไม (โดยเฉพาะการหาการแปลงโดยนัย + การสืบทอด + ... วัตถุบางอย่างมีฟังก์ชั่นการใช้งานX
) แต่คุณไม่ต้องกังวลเกี่ยวกับเรื่องนั้นบ่อยครั้ง
เขียนสกาล่าอย่างตรงไปตรงมาที่สุดและมันจะใช้ได้ อย่าสับสนกับทุกสิ่งที่เป็นไปได้และใช้สิ่งที่คุณต้องการ และถ้าคุณต้องการบางสิ่งคุณสามารถมั่นใจได้ว่าอย่างใดสกาล่ามีมัน;)
และยิ่งคุณได้รับมากเท่าไหร่คุณก็ยิ่งสามารถปรับแต่งสกาล่ากับผู้ให้บริการความหมายพระอารามไวยากรณ์ที่ขี้ขลาด ... และในที่สุดก็เข้าใกล้ DSL ที่จะช่วยแก้ปัญหาของคุณได้อย่างสมบูรณ์แบบ
ท้ายที่สุดคุณมีความเป็นไปได้ที่จะใช้ Scala เป็นจาวาที่ดีกว่ามากขึ้นพร้อมกับไวยากรณ์ที่สะอาดกว่าง่ายกว่าการอนุมานประเภทและคุณสมบัติการทำงานบางอย่าง
มันเป็นภาษาที่ยอดเยี่ยมที่ง่ายกว่า Java ในหลาย ๆ ด้าน
คนส่วนใหญ่จะไม่ชอบมันโปรแกรมเมอร์ Java หรือไม่ด้วยเหตุผลเดียวกันกับที่คนส่วนใหญ่โปรแกรมเมอร์หรือไม่ชอบการเรียนรู้ภาษาการเขียนโปรแกรมใหม่ ฉันสงสัยว่าคนส่วนใหญ่ที่เรียนภาษาการเขียนโปรแกรมไม่ชอบเรียนรู้สิ่งนั้น
หากคุณกังวลเกี่ยวกับภาษาที่ซับซ้อนเท่า C ++ ฉันจะหลีกเลี่ยง Clojure เหมือนกับโรคระบาด การคร่ำครวญว่าสกาลานั้นซับซ้อนกว่า Clojure กลายเป็นข้อโต้แย้งทางเลือกสำหรับคนที่ไม่รู้เรื่องภาษาใดภาษาหนึ่งหรือทั้งสองภาษา
Clojure มีมาโครซึ่งหมายความว่าคุณสามารถเปลี่ยนไวยากรณ์ของภาษาได้มากเท่าที่คุณต้องการไม่เพียง แต่ให้คุณ "เป็นวิธีการทำสิ่งต่าง ๆ " แต่มีวิธีการทำสิ่งต่าง ๆ มากมาย และไม่มีไวยากรณ์ใหม่นี้ที่โปรแกรมเมอร์สร้างด้วยมาโครจะถูกบันทึกไว้ที่ใดก็ได้ในข้อกำหนดภาษา
"แต่เราสามารถหลีกเลี่ยงการใช้มาโครหรือควบคุมว่าจะอนุญาตให้ใช้ในรหัสใดของเรา" คุณกล่าว ขอแสดงความยินดีขณะนี้คุณมี "เพื่อ จำกัด คุณสมบัติภาษาที่คุณต้องการใช้และสิ่งที่ไม่ใช่" ซึ่งเป็นสิ่งที่คนโง่พูดพล่ามที่กำลังใช้ Clojure of Scala ใช้เป็นเหตุผลในการหลีกเลี่ยง Scala เพื่อเริ่มต้นด้วย
ฉันชอบไลบรารี่ของ Scala มากกว่า ดูเหมือนว่าห้องสมุดคอลเลกชันใหม่นั้นคิดดี ฉันชอบวิธีลดจำนวนรหัสที่จำเป็นสำหรับคลาสที่เรียบง่ายและแนวคิดการทำงานที่เพิ่มขึ้น การอนุมานประเภทมันมีประโยชน์มาก รู้สึกเหมือน Java โดยไม่ต้องฝึกวงล้อ หลังจากใช้ C # ไปซักพัก Scala ก็รู้สึกว่าเป็นคู่แข่ง แต่ Java ก็ยังมีประโยชน์ แต่ถูกทิ้งไว้ข้างหลัง
ในฐานะโปรแกรมเมอร์ Java ฉันเริ่มพบว่า Scala น่าสนใจ อย่างไรก็ตามหลังจากที่เล่นน้ำเป็นเวลานาน (และวิ่งเข้าไปในเกือบทุกแง่บวก / เชิงลบที่ระบุไว้โดยผู้อื่นแล้ว) ฉันถูกทิ้งความรู้สึก "Meh" มากต่อมัน การปรับปรุงภาษาถูกชดเชยด้วยความพร้อมใช้งานที่ต่ำกว่าของชุดเครื่องมือ ฉันไม่สามารถคิดหาเหตุผลในการสลับเปลี่ยนได้ เป็นเรื่องที่ดี แต่มันไม่ "ดีพอ" ในการสร้างเคสสำหรับการสลับ ไม่ได้มีปัจจัยความตื่นเต้นส่วนตัวเช่นกัน (เช่น Clojure ดูเหมือนว่า)