Sự giống và khác nhau giữa Ruby và Java
Nguồn: http://a-auto50.blogspot.jp/2015/07/javaruby.html Tác giả: 鷲尾充報 Nguồn: http://www.atmarkit.co.jp/ait/articles/0803/25/news152.html Tác giả: 中越智哉,ナレッジエックス 1. Ruby Ruby là ngôn ngữ script hướng đối tượng được Matsumoto Yukihiro (Matz) phát triển. Nó là ngôn ngữ thông dịch nên mã ...
Nguồn: http://a-auto50.blogspot.jp/2015/07/javaruby.html
Tác giả: 鷲尾充報
Nguồn: http://www.atmarkit.co.jp/ait/articles/0803/25/news152.html
Tác giả: 中越智哉,ナレッジエックス
1. Ruby
Ruby là ngôn ngữ script hướng đối tượng được Matsumoto Yukihiro (Matz) phát triển. Nó là ngôn ngữ thông dịch nên mã nguồn không cần compile mà có thể chạy ngay.
Ngôn ngữ thông dịch (intepreter):
Là loại ngôn ngữ không cần compile mà có thể chạy file mã nguồn ngay. Nó có tốc độ chậm hơn ngôn ngữ biên dịch nhưng vì có thể giảm được chi phí compile nên vẫn được đánh giá là ngôn ngữ phát triển hiệu quả khi so sánh với ngôn ngữ biên dịch.。
1.1. Đặc trưng của Ruby
Ruby là mã nguồn mở nên ai cũng có thể sử dụng miễn phí và vì nó có đặc trưng multi platform nên có thể chạy được trên các OS khác nhau như Windows, Linux, MacOS.
Trước đây thì khá ít người biết đến Ruby nhưng hiện nay rất nhiều công ty lựa chọn Ruby để phát triển trang web, ứng dụng của công ty họ và vì thế Ruby đang dần trở thành một ngôn ngữ phát triển phổ biến.
Một dịch vụ nổi tiếng có thể mọi người đã từng dùng qua là app công thức nấu ăn của COOKPAD cũng sử dụng framework cuả Ruby là Ruby on Rails để phát triển.
2. Java và Ruby
Khi nhắc đến ngôn ngữ lập trình hướng đối tượng thì ngôn ngữ đầu tiên mà mọi người nghĩ tới chắc là Java. Cùng là ngôn ngữ lập trình hướng đối tượng nên Ruby và Java có nhiều điểm tương đồng nhưng cũng có những điểm khác biệt cơ bản.
Tham khảo:http://www.atmarkit.co.jp/ait/articles/0803/25/news152.html
2.1. Điểm giống nhau
2.1.1. Định nghĩa, kế thừa class
Trong Java, 1 class chỉ có thể có 1 class cha trực tiếp (kế thừa đơn). Ruby cũng vậy (※)
Ngoài ra, ở cả 2 ngôn ngữ, Class cha của tất cả các class (class cha ngầm) là class Object.
Trong Ruby có thể dùng phương pháp Mix-in để thực hiện đa kế thưà. Tuy rằng chỉ có thể kế thừa thuộc tính của một class đơn nhưng ta có thể implement method, biến trong module và mix nó vào nhiều class.
Cách định nghĩa class:
Class class_name { }
Class class_name end
Cách định nghĩa class của 2 ngôn ngữ gần như là như nhau chỉ khác nhau ở điểm Java dùng {}còn Ruby dùng end.
** Kế thừa**
・Cách định nghĩa class kế thừa trong Java
Class class_name extends super_class_name{ }
・Cách định nghĩa class kế thừa trong Ruby
Class class_name < super_class_name end
Khi thừa kế trong Java, cần keyword extends. Trong Ruby thì dùng <
2.1.2. Các toán tử và câu lệnh điều khiển
Cả Java và Ruby đều sử dụng hệ thống toán tử gần với ngôn ngữ C nên nội dung toán tử của Ruby tương đối giống Java, dễ sử dụng.
Ngoài ra, cách dùng các câu lệnh for và while về cơ bản cũng giống nhau rong 2 ngôn ngữ.
Tuy nhiên trong Ruby, câu lệnh if không cần dùng () bao quanh điều kiện, câu lệnh for thì nhìn qua hơi khó hiểu nghĩa nên cần chú ý về cách viết khác nhau đó.
・if trong Java
if (condition A) { }else if (condition B){ } else { }
・if trong Ruby
if condition A elsif condition B end
else if trong Java được chuyển thành elsif trong Ruby. Chữ “e" được lược bỏ đi nên dễ bị nhầm giữa 2 ngôn ngữ. Những người có kinh nghiệm Java bắt đầu học Ruby hoặc ngược lại có thể sẽ thấy lạ khi bắt đầu học nhưng về cách dùng về cơ bản là giống nhau nên theo tôi là không có vấn đề gì.
Tiếp theo, chúng ta hãy xem câu lệnh điều khiển for
・for trong Java
for (int i = 1 ; i <= 10; i++) { System.out.println(i); }
・for trong Ruby
for i in 1..10 puts i end
Câu lệnh này khác nhau tương đối nhiều ở 2 ngôn ngữ.
Cùng là một chương trình “Hiển thị các số từ 1 đến 10” nhưng chương trình Ruby ngắn gọn, đơn giản hơn. Trong khi chương trình Java cần dùng 45 ký tự thì Ruby chỉ cần dùng 19 ký tự.
Không chỉ với câu lệnh for, về cơ bản, code Ruby ngắn hơn Java rất nhiều - một trong những điểm mạnh của Ruby.
2.1.3. Cách viết xử lý ngoại lệ
Vì Java và Ruby đều là ngôn ngữ hướng đối tượng nên cả 2 đều có cơ chế xử lý ngoại lệ. Nhìn sơ qua thì cú pháp xử lý ngoại lệ của Ruby khác Java tuy nhiên cả 2 đều có chung các khung sau: begin→try、rescue→catch、ensure→finally Tuy nhiên, xử lý ngoại lệ trong Ruby không dùng throws như Java (Trong Ruby có method catch và throw nhưng không được sử dụng để xử lý ngoại lệ)
Xử lý ngoại lệ trong Java:
try { // Xử lý có thể phát sinh ngoại lệ } catch(Exception ex) { // Khi xảy ra ngoại lệ, sẽ chạy xử lý này } finally { // Dù có ngoại lệ hay không vẫn chạy đoạn xử lý này }
Xử lý ngoại lệ trong Ruby
begin // Xử lý có thể phát sinh ngoại lệ rescue // Khi xảy ra ngoại lệ, sẽ chạy xử lý này ensure // Dù có ngoại lệ hay không vẫn chạy đoạn xử lý này end
Ngoài các điểm ở trên, Java và Ruby vẫn còn các điểm giống nhau nhưng tác giả chỉ giới thiệu những điểm cho là điển hình ở trên. Vì việc định nghĩa class, các toán tử, câu lệnh tương đối giống nhau nên với các xử lý đơn giản nên có thể dễ dàng viết được code Ruby tương tự như Java.
Tuy nhiên, Java và Ruby cũng có những điểm khác nhau. Tiếp sau đây sẽ nói về cú pháp khác nhau giữa Java và Ruby.
2.2. Điểm khác nhau
2.2.1. Trong Ruby không cần khai báo kiểu
Với các Java coder thì khi dùng sẽ phải có các khai báo dạng như sau: biển kiểu số thì khai báo kiểu int, biến kiểu chuỗi thì khai báo kiểu String nhưng trong Ruby thì không phải làm thế.
Trong Java, khi compile sẽ thực hiện kiểm tra tính nhất quán của kiểu dữ liệu nhưng với ngôn ngữ thông dịch như Ruby thì sẽ kiểm tra khi chạy nên không cần khai báo kiểu.
Trong Ruby, tất cả resouce trong chương trình đều được xử lý dưới dạng object. Vì là object nên đương nhiên có kiểu.
String name = “A-AUTO”; int number = 50;
name = “A-AUTO” number = 50
2.2.2. Có thể lược bỏ dấu ngoặc () khi gọi method
Trong Java, khi gọi 1 method, cần phải thêm cặp dầu ngoặc (ví dụ: hoge.foo() ). Tuy nhiên, trong Ruby, có thể lược bỏ dấu ngoặc này. Tất nhiên vì nếu để cặp dầu ngoặc thì chương trình vẫn hoạt động bình thường nên trong trường hợp muốn code giống như Java khi gọi hàm ra thì gọi kèm cặp dấu ngoặc cũng không sao.
String name = “a-auto”; System.out.println(name.toUpperCase());
name = “a-auto”; puts name.upcase
2.2.3. Ruby không có “kiểu dữ liệu cơ bản” như Java
Như đã nói ở phần trước, Ruby xử lý tất cả các giá trị là các object. Ví dụ, trong Ruby, khi viết số 100 thì Ruby sẽ hiểu nó là object giá trị số và có thể thực hiện method với giá trị này. Có thể những người mới học Ruby sẽ thấy lạ nhưng khi đã quen thì sẽ không để ý đến nữa.
String num = new String(100);
num = 100.to_s
2.2.4. Trong Ruby không phải lúc nào cũng cần có class
Với ngôn ngữ lập trình hướng đối tượng Java, dù là chương trình nhỏ đến đâu để có thể chạy được, bắt buộc phải định nghĩa class. Tuy nhiên, với Ruby, dù cho không được định nghĩa class, chương trình vẫn có thể chạy.
Việc định nghĩa class trong Ruby sẽ làm phức tạp code của chương trình nên thường định nghĩa tổng hợp.
public class Main { public static void main(String[] args) throws Exception { System.out.println("a-auto"); } }
puts "a-auto"
2 đoạn code trên trả về kết quả giống nhau nhưng lượng code khác hẳn nhau. Chỉ với việc xuất ra 1 chuỗi ký tự đã khác nhau như thế thì với cả chương trình lớn, Ruby gọn nhẹ hơn nhiều. Để định nghĩa class trong Ruby, có thể thực hiện bằng cách đơn giản như sau:
class DspAuto < super_class puts “a-auto” end
Như trong ví dụ trên, chỉ cần đặt xử lý trong cặp class và end là được. Tuy nhiên, trong Ruby, nếu không khai báo super class thì mặc định super class là Object.
Ruby và Java đều là ngôn ngữ lập trình hướng đối tượng nhưng với Ruby, không cần định nghĩa class cũng có thể dùng khiến cho việc code trở nên tự do hơn rất nhiều.
2.2.5. Trong Ruby có thể dùng các ký hiệu đặc biệt
Trong Ruby, có thể thêm các ký tự ! và ? vào sau tên method. Method sau trả về gía trị boolean.
class DspAuto def dspName? true end end dauto = DspAuto.new if dauto.dspName? puts "true!!" end
Có thể bạn sẽ nghĩ khi thêm dấu ? vào tên method thì sẽ có gì đó bất thường nhưng thực tế là nó vẫn hoạt động bình thường.
? thường được dùng trong tên các method check giá trị boolean.
3. Tổng kết
Các bạn đã thấy được sự khác nhau giữa Java và Ruby chưa ạ?
Mục tiêu phát triển ban đầu của Java và Ruby vốn dĩ khác nhau. Mục tiêu của Java là “Viết một lần, dùng mọi nơi” còn mục tiêu của Ruby là “Lập trình vui vẻ”. Vì mục tiêu vốn dĩ khác nhau nên không thể so sánh ngang hàng Ruby và Java nhưng về tổng thể, Ruby là ngôn ngữ có thể debug trên console nên là theo cá nhân tác giả là ngôn ngữ rất dễ dùng.
Cuối cùng là lời khuyên của tác giả: Với những lập trình viên chưa từng dùng Ruby hoặc chỉ mới biết sơ qua Ruby thì nên tìm hiểu về Ruby.