Article:
4OOP bằng Scala
1740
trangia61.myopenid.com 3Updated about 1 year ago |
Ở cấp độ máy ảo, nằm giữa chương trình được dịch sang bytecode và hệ điều hành, có 2 loại đa nhiệm: local concurrency là đa nhiệm trên một máy và distributed concurrency (parallel) là đa nhiệm trên nhiều máy. Loại đầu nổi nhất là JVM, loại sau nổi nhất là Erlang. 2 tiêu chí quan trọng khi đánh giá công cụ giúp lập trình đa nhiệm là độ dễ sử dụng và tốc độ (càng tận dụng được CPU đa lõi tốc độ càng nhanh).
2 ngôn ngữ nổi bật nhất trên JVM để lập trình concurrency là Clojure và Scala. Clojure cú pháp cực đơn giản vì phái sinh từ Lisp, Scala cú pháp phức tạp hơn nhiều vì phái sinh từ cả Java, Ruby, và Erlang. Tuy Scala phức tạp hơn nhưng vì đa số lập trình viên đều bắt đầu sự nghiệp bằng ngôn ngữ họ C nào đó như Pascal, C, C++, C#, Java, PHP nên đối với đa số nó lại dễ học hơn. Hơn nữa sử dụng thư viện Java trong chương trình Scala tự nhiên hơn hẳn so với sử dụng trong chương trình Clojure, nhất là khi Clojure chưa hỗ trợ annotation, nên Scala có động lực học mạnh mẽ hơn Clojure.
Về mặt ngôn ngữ, Scala = Ruby + Java + Erlang. Về mặt tính năng, Scala = OOP + functional + event-driven. Theo truyền thống khi học ngôn ngữ hướng đối tượng, thử giải bài tập 4OOP bằng Scala xem sao. Theo truyền thống khi học ngôn ngữ hướng đối tượng, thử giải bài tập 4OOP bằng Scala xem sao.
![]()
Trước tiên hãy tìm động lực học Scala
Để cụ thể, giả sử ta định thuyết phục công ty chuyên làm web cỡ trăm lập trình viên đang sử dụng Perl tìm hiểu Scala.
Perl có nhiều vấn đề, ví dụ:
- Khó develop
- Khó maintenance
Công nghệ thay thế cần:
- Có tốc độ chạy ngang ngửa hoặc hơn Perl, cụ thể tỉ lệ request web trên lượng CPU và RAM bị ăn phải ngang ngửa hoặc hơn Perl
- Nhiều thư viện
- Dễ develop, dễ maintenance, dễ áp dụng các chiêu thức software engineering
- Dễ scale ra vài trăm server
Ruby đạt những tiêu chí trên và rất dễ học với lập trình viên Perl, nhưng Scala cú pháp giống Ruby. Erlang dễ scale vì tính năng lập trình mạng rất tốt, nhưng ít thư viện hơn Scala. Scala tốc độ hơn Erlang, Ruby, và Perl, tỉ lệ request web trên lượng CPU và RAM bị ăn rất tốt (ví dụ với 1 request thì Perl tốn ít tài nguyên hơn Scala, nhưng với 1000 request thì Scala tốn ít hơn).
JVM có Clojure và Scala, xét yếu tố nhiều thư viện và dễ develop:
- Phải dễ gọi thư viện Java. Java thư viện vô số kể, gì cũng có, nhưng khó gọi thì cũng phí cơm. Tất nhiên không dùng chính ngôn ngữ Java rồi để gọi thư viện Java rồi. Java khó develop vì khả năng diễn đạt kém, học Ruby rồi thì thấy khả năng diễn đạt của Java kém thế nào. <-- Scala thắng Clojure
- Phải dễ học cho người bình thường. Dễ học đối với ai đó nhưng cả trăm người học không trôi thì cũng phí cơm. Xem video tổng giám đốc FPT nói về công nghiệp phần mềm sẽ thấy. <-- Scala thắng Clojure
Nét tương đồng giữa Scala và Java, Ruby, và Erlang:
- Scala có tính năng hướng đối tượng giống Java và Ruby. Do tương đồng về cú pháp nên có thể viết chương trình Scala để tương tác với thư viện Java rất thoải mái. Điểm thu hút lập trình viên đến với máy ảo Java chính là việc có thể dùng ké vô số thư viện Java sẵn có.
- Scala giống Ruby ở chỗ cú pháp rất uyển chuyển, mọi thứ đều là object kể cả hàm. Người ta hay nói viết chương trình bằng Scala dễ hơn viết bằng Java, dễ ở đây không nói về cú pháp vì cú pháp Scala phức tạp hơn Java, mà nói về sự uyển chuyển, khả năng diễn đạt ngắn gọn, dễ viết dễ hiểu. Scala là static typed, nên phù hợp để làm project đông người hơn. Nếu bạn rất thích Ruby, thì không nên dùng JRuby mà nên dùng Scala

- Scala giống Erlang ở chỗ có actor và pattern matching. Ai đã dùng qua tính năng pattern matching rồi thì chắc chắn không muốn dùng ngôn ngữ không có tính năng này nữa.
Scala kết hợp được cái hay của cả 3, có thể nói sức mạnh Scala = thư viện của Java + OOP và tính uyển chuyển của Ruby + actor và pattern matching của Erlang. Tham khảo nhận xét sau 3 năm sử dụng Scala của tác giả Lift, web framework đang rất nổi.
Tóm lại, tổng hợp nhiều yếu tố thì Scala rất đáng học.
Chương trình 4OOP bằng Scala
Cách dễ nhất được nhiều người ưa thích để cài Scala và chạy chương trình viết bằng Scala là thông qua Maven:
- Gõ lệnh mvn archetype:generate
- Chọn archetype scala-archetype-simple rồi theo wizard để làm tiếp
- Đọc thêm hướng dẫn ở maven-scala-plugin
# animal.scala
package animal
abstract class Animal(val name: String) {
def talk = println("I am an animal")
}
class Cat(name: String) extends Animal(name) {
override def talk = println("Meow, my name is " + name)
}
class Dog(name: String) extends Animal(name) {
override def talk = println("Wolf, my name is " + name)
}
class Zoo {
var animals = new Array[Animal](0)
def add(animal: Animal) = { animals = animals ++ Array(animal) }
def talk = animals.foreach { a => a.talk }
}
# test_animal.scala
import animal._
val c = new Cat("Kitty")
val d = new Dog("Pluto")
val z = new Zoo
z.add(c)
z.add(d)
z.talk
Đối với bài này, 4 tính năng của OOP thể hiện ở 4 keyword là: class, package, extends và override.
Đọc thêm
1 2 
3
over 2 years ago
Updated over 2 years ago