inicio mail me! sindicaci;ón

Archive for OOP

Ruby kỷ niệm sinh nhật tròn 15 tuổi

Ruby Programming LanguageYukihiro MatsumotoHic, hôm qua quên béng mất, hôm nay nhìn lại lịch thì đã là 25 mất rồi. Nói chung là các thứ mốc thời gian quan trọng tớ đều toàn bỏ lỡ cả :P

Vào ngày 25/02/1993, Ruby được chính thức … “thụ thai” bởi Yukihiro Matsumoto (tên gọi trên mạng là Matz) nhờ tình yêu mãnh liệt giữa anh và cái máy tính. Nói đúng hơn là anh ấy bắt đầu xây dựng Ruby kể từ ngày đó, và sau 2 năm, đến năm 1995 thì Ruby mới được chính thức ra đời. Có nghĩa là nói 25/02 là ngày sinh nhật của Ruby thì cũng không chính xác, nhưng mặc kệ, dẫu sao thì cũng là 1 ngày đáng nhớ.

Vậy tại sao Matz lại chọn Ruby làm cái tên cho ngôn ngữ của mình tạo ra?

Ruby không phải một cái tên viết tắt. Đơn giản chỉ là vì Ruby chịu nhiều ảnh hưởng từ Perl, và khi hoàn tất ngôn ngữ này, anh đã đùa với một người bạn rằng nên đặt tên thế nào nghe cho nó giống một thứ đá quý nào đó (Perl lúc đầu cũng được đặt tên là Pearl - ngọc trai). Và bạn của anh đã gợi ý cái tên Ruby. Sau này Matz cũng bất ngờ khi phát hiện ra Pearl là viên đá quý tượng trưng cho những người sinh tháng 6, còn Ruby thì tượng trưng cho những người sinh tháng 7. Anh cho rằng cái tên Ruby như thế là phù hợp vì Ruby kế thừa và phát triển nhiều đặc tính từ Perl.

Một số cột mốc quan trọng trong quá trình phát triển Ruby

  • 24/02/1993: Matz bắt tay vào công việc “sáng tạo” ra ngôn ngữ Ruby.
  • Tháng 12/1994: Phiên bản alpha đầu tiên của ngôn ngữ được hoàn tất.
  • 1997: Tài liệu hỗ trợ cho ngôn ngữ Ruby được chuyển sang tiếng Anh
  • Cuối năm 1998: thành lập mailing list ruby-talk cho cộng đồng người sử dụng Ruby ngoài Nhật Bản. Cho đến trước thời điểm này, không có nhiều lập trình viên nước ngoài biết đến Ruby, trong khi Ruby đã khá thành công ở Nhật. Từ đây, cơn bão Ruby dần dần hình thành.
  • 2001: JRuby ra đời, đánh dấu bước tiến mới của Ruby. JRuby là trình dịch Ruby viết bằng Java, và giúp cho việc lập trình kết hợp giữa Ruby và Java trở nên dễ dàng hơn.
  • Tháng 7/2004: Ruby on Rails ra mắt cộng đồng lập trình viên ứng dụng web. Rails là một framework hỗ trợ xây dựng một cách nhanh chóng các ứng dụng web dựa trên nền tảng kiến trúc MVC (Model-View-Controller). Sau này Rails thu hút được rất nhiều sự chú ý từ các web developer nhờ tốc độ phát triển ứng dụng cũng như tính mềm dẻo của framework này, đồng thời cũng là do những đặc tính thú vị của Ruby. Từ đó trở đi, Rails trở nên phổ biến ngang ngửa với PHP, và Ruby nhờ đó cũng được càng nhiều người biết đến.
  • Tháng 5/2006: JRuby hỗ trợ Rails
  • 30/4/2007: IronRuby được Microsoft chính thức công bố. IronRuby là nỗ lực của các lập trình viên nhằm đưa Ruby vào .NET framework của Microsoft.
  • 23/7/2007: Bản pre-alpha của IronRuby ra mắt trước công chúng
  • 25/12/2007: Ruby 1.9 chính thức ra mắt với nhiều tính năng mới (hỗ trợ Unicode tốt hơn, sử dụng YARV .v.v.), tuy nhiên các phiên bản số lẻ thường là phiên bản dành cho cộng đồng phát triển và thử nghiệm. Phải chờ đến phiên bản 2.0 thì lập trình viên mới có thể sẵn sàng tận dụng các tính năng mới mẻ cho sản phẩm của mình.

Sau 15 năm kể từ khi được xây dựng từ những dòng code đầu tiên, Ruby đã có những bước tiến khá xa. Nhiều người vẫn phủ nhận sự thành công của ngôn ngữ này với lí do sau những 15 năm mà Ruby mới tiến tới phiên bản 1.9. Nhiều người khác thì lại trở nên dị ứng với cái tên Ruby vì sự nổi đình nổi đám của nó những năm gần đây. Dân học lập trình Việt Nam thì càng không muốn động tay vào ngôn ngữ có cái tên lạ hoắc này. Nhưng tớ tin là trong 1 thời gian ngắn nữa, Ruby sẽ là cái tên được nhắc đến rất nhiều tại Việt Nam, và sẽ ngày càng có nhiều người học Ruby hơn.

Ruby - có thật sự “Mọi thứ đều là đối tượng”

Hồi tớ mới bắt đầu học Ruby, hầu như quyển sách nào tớ đọc, câu đầu tiên trong định nghĩa về Ruby cũng là “In Ruby, everything is an object”. Và khắp mọi nơi trên net tớ search, ai cũng bảo thế cả. Tớ cũng dần dần tự mình cho thế là đúng.

Cho đến một hôm lôi quyển “Programming Ruby 2nd Edition” ra đọc đến phần Variable, mới biết “Everything is an object” là không hoàn toàn chính xác.

Có 1 thứ không phải là đối tượng…

Chắc bạn cũng có thể đoán ra mang máng rồi. Đó chính là Biến.
Trong Ruby, biến có cách làm việc khác với một số ngôn ngữ khác. Hãy cùng thử ví dụ này nhé:

string = 'aha'
str = string
string[2] = 'o'
puts str
puts string

Bạn thử đoán xem kết quả cho ra màn hình là thế nào? Kết quả là cả 2 biến str và string sẽ đều mang giá trị là ‘aho’.

Nhưng trong đoạn code trên ta chỉ thay đổi biến string, chứ không hề động đến biến str1. Và ta thay đổi đó xảy ra sau khi str được gán giá trị cũ của string. Nếu như biến là đối tượng, thì khi ta gán string = ‘aha’, đối tượng string sinh ra với giá trị ‘aha’. Tương tự gán str = string sẽ tạo thêm ra một đối tượng nữa có giá trị mà string đang mang. Khi thay đổi giá trị của đối tượng string, đối tượng str sẽ không bị vạ lây.

Biến không phải là đối tượng, thì biến là cái chi?

Biến là giá trị tham chiếu. Khi ta gán cho một biến một giá trị mới, một đối tượng mới sẽ được tạo ra trong bộ nhớ, và biến đó sẽ “trỏ” vào đối tượng đó. Tưởng tượng mỗi lần bạn truy vấn giá trị của biến, biến sẽ lại truy vấn giá trị của đối tượng, và trả lại cho bạn giá trị của đối tượng. Vậy có nghĩa là, biến và đối tượng không phải là một.

Còn khi bạn gán cho một biến giá trị của một biến đã có sẵn, điều gì xảy ra? Biến mới sẽ lập tức được tham chiếu vào đối tượng mà biến có sẵn kia “trỏ” tới. Tóm lại, cả 2 biến này “trỏ” tới cùng 1 giá trị giống nhau.

Khi bạn thay đổi (thay đổi thôi nhé, chứ không phải là gán cho giá trị mới) giá trị của một biến, thực chất là bạn thay đổi giá trị của đối tượng gốc. Xin xem hình minh họa sẽ rõ:

01.png

Thế nếu tôi gán cho biến string một giá trị mới, str1 có thay đổi theo không?

Cùng xem đoạn code này nhé:

string = 'aha'
str = string
string = 'oho'
puts str
puts string

Bạn sẽ thấy ngay str1 vẫn “trỏ” đến giá trị ‘aha’, trong khi string thì lại là ‘oho’. Tại sao lại có sự khác biệt này?

Đơn giản là do khi gán string = ‘oho’, ruby nhận ra là string có 1 giá trị mới hoàn toàn (chứ không phải là chỉ thay đổi 1 chữ cái như ở ví dụ trên). Do đó ruby sẽ tạo ra 1 đối tượng mới (oho) để string “trỏ” vào.

02.png

Cách sao chép biến đúng trong Ruby

Để thực sự sao chép giá trị của một biến, thay vì chỉ tham chiếu đến giá trị của biến đó, ta dùng phương thức “dup”. Câu lệnh gán sẽ phải như sau:

str = string.dup

“Not everything is an object”

Tóm lại, Ruby vẫn là một ngôn ngữ thuần túy hướng đối tượng, bởi vì “Although not everything is an object, Everything you manipulate is an object” (Mặc dù không phải cái gì cũng là đối tượng, nhưng trong Ruby tất cả các thứ bạn tác động tới đều là đối tượng).