Object Oriented Programming with Ruby (Part 1)
Đây là bài viết được dịch từ một cuốn sách, các bạn có thể xem ở đây: Object Oriented Programming with Ruby Trong phần này sẽ giới thiệu cho bạn một cái nhìn tổng quan về lập trình hướng đối tượng (Object Oriented Programming). Object Oriented Programming, thường được gọi với cái tên OOP, là ...
Đây là bài viết được dịch từ một cuốn sách, các bạn có thể xem ở đây: Object Oriented Programming with Ruby
Trong phần này sẽ giới thiệu cho bạn một cái nhìn tổng quan về lập trình hướng đối tượng (Object Oriented Programming).
Object Oriented Programming, thường được gọi với cái tên OOP, là một mô hình lập trình mà nó được tạo ra để phù hợp với sự phát triển càng phức tạp của các hệ thống phần mềm. Các lập trình viên đã tìm ra rất sớm các project mà phát triển về độ phức tạp và kích thước, chúng trở nên rất khó để bảo trì. Một thay đổi nhỏ ở bất kì chỗ nào của chương trình cũng dẫn đến xảy ra loạt lỗi ở toàn bộ chương trình do sự phụ thuộc lẫn nhau.
Các lập trình viên cần một phương pháp để tạo ra các nơi chứa (containers) cho dữ liệu để có thể thay đổi, thao tác mà không ảnh hưởng đến toàn bộ chương trình. Họ cần một cách để chia code của mình thành các phần để tiến hành chạy các hàm, do vậy chương trình của họ có thể thực thi với nhiều phần nhỏ của chương trình, so với một mảng lớn và phụ thuộc nhiều lẫn nhau.
Cùng bắt đầu với OOP, đầu tiên ta cần giới thiệu một số thuật ngữ, và sau đó sẽ đi sâu thông qua các ví dụ. Đóng gói (Encapsulation) là việc ẩn đi các phương thức, chức năng và làm cho nó không thể truy cập được từ bên ngoài. Nó giống như là một cái form chứa giữ liệu, vì vậy dữ liệu sẽ không được thao tác hoặc thay đổi mà không dự tính trước. Ruby, như nhiều ngôn ngữ hướng đối tượng khác, nó để lộ ra các interfaces (vd: methods) để tương tác với các đối tượng đó.
Một lợi ích khác của việc tạo ra các đối tượng là chúng cho phép các programmer suy nghĩ ở một tầng mới của trừu tượng. Các đối tượng được biểu diễn như là những sự vật và các phương thức mô tả các hành vi của đối tượng đó ở thế giới thực.
Đa hình (Polymorphism) là một khả năng mà dữ liệu có thể được biểu diễn lại bởi nhiều cách khác nhau. "Poly" thể hiện cho số nhiều và "morph" thể hiện cho "forms". OOP cung cấp cho chúng ta một cách linh hoạt khi sử dụng code đã được viết trước cho mục đích mới (tái sử dụng code).
Khái niệm về kế thừa (inheritance) được sử dụng ở Ruby nơi mà một class kế thừa các hành vi của class khác, hay còn gọi là superclass. Điều này đưa cho các lập trình viên khả năng để định nghĩa các class cơ bản với khả năng sử dụng lại lớn và các subclass nhỏ hơn để các hành vi được thể hiện chi tiết, rõ ràng hơn.
Cách khác để áp dụng kiến trúc đa hình trong lập trình Ruby là sử dụng Module. Module tương tự như class, trong đó chúng chứa các hành vi được chia sẻ. Tuy nhiên, bạn không thể tạo một đối tượng với một module. Một module phải được pha trộn vào một class thông qua từ khóa include. Nó được gọi là mixin. Sau khi pha trộn một module, các hành vi được khai báo trong module đó thì cũng sử dụng được ở trong class và các đối tượng của class đó.
Chúng ta sẽ đi qua những ví dụ cho những thuật ngữ được nêu ở phía trên ở những chương sau.
Có lẽ trong cộng đồng Ruby bạn sẽ thường xuyên nghe đến câu nói, "In Ruby, everything is an object!" (Trong Ruby moitj thứ đều là đối tượng). Chúng ta tránh xa thực tế này quá xa vì đối tượng là một chủ đề advanced và nó cần được xử lý trên những cú pháp đơn giản của Ruby trước khi bạn bắt đầu nghĩ đến đối tượng là gì.
Nhưng điều đó là đúng, mọi thứ trong Ruby đều là một đối tượng. Đối tượng được tạo từ các class. Cứ nghĩ class là như là một cái khuôn còn đối tượng là những thứ được sinh ra từ cái khuôn đó. Từng đối tượng chứa những thông tin khác nhau so với những đối tượng khác khi mà chúng cùng đều là thực thể của cùng một class. Đây là một ví dụ về hai đối tượng của class String:
irb :001 > "hello".class => String irb :002 > "world".class => String
Ở ví dụ trên, chúng ta sử dụng phương thức class để xác định class của mỗi đối tượng. Như bạn có thể thấy, mọi thứ chúng ta sử dùng, từ strings cho đến integers đều là các đối tượng, là thực thể của một class. Chúng ta sẽ đi sâu hơn về vấn đề này sớm thôi