Học viên: Phạm Thế Dương
Email: duongphamhn97@gmail.com
Bài viết gốc: https://www.javatpoint.com/java-oops-concepts

Ở bài này, ta sẽ tìm hiểu những khái niệm cơ bản về OOPs (Object-Oriented Programming System - Hệ thống lập trình hướng đối tượng). Lập trình hướng đối tượng là một mô hình cung cấp nhiều khái niệm, như thừa kế, data binding, tính đa hình, v.v.

Simula được xem là ngôn ngữ lập trình hướng đối tượng đầu tiên. Mô hình lập trình nơi mọi thứ được biểu diễn dưới dạng đối tượng được gọi là ngôn ngữ lập trình hướng đối tượng thuần tuý.

Smalltalk được xem là ngôn ngữ lập trình hướng đối tượng thuần tuý đầu tiên.

Các ngôn ngữ lập trình hướng đối tượng phổ biến là Java, C#, PHP, Python, C++, v.v.

Mục tiêu chính của lập trình hướng đối tượng là thể hiện các thực thể của thế giới thật, với đối tượng, các class, tính trừu tượng, tính kế thừa, tính đa hình, v.v.

OOPs (Object-Oriented Programming System)

Đối tượng là các thực thể của thế giới thật như bút, ghế, bàn, máy tính, đồng hồ, v.v. Lập trình hướng đối tượng là một phương pháp hay mô hình thiết kế chương trình sử dụng các class và đối tượng. Nó đơn giản hoá việc phát triển và bảo trì phần mềm nhờ cung cấp các khái niệm:

  • Đối tượng (Object)
  • Class
  • Tính kế thừa (Inheritance)
  • Tính đa hình (Polymorphism)
  • Tính trừu tượng (Abstraction)
  • Tính đóng gói (Encapsulation)

Ngoài các khái niệm trên, có một vài thuật ngữ khác được sử dụng trong thiết kế hướng đối tượng:

  • Coupling
  • Cohesion
  • Association
  • Aggregation
  • Composition

OOPs

Objects

Bất kỳ thực thể nào có trạng thái và hành vi được xem là một đối tượng. Ví dụ, ghế, bút, bàn, bàn phím, xe đạp, v.v. Nó có thể là dạng vật lý hoặc logic.

Một đối tượng có thể được xác định là instance của một class. Một đối tượng có một địa chỉ và chiếm không gian bộ nhớ. Các đối tượng có thể giao tiếp mà không cần biết dữ liệu hay code của nhau. Điều quan trọng duy nhất là kiểu thông điệp được chấp nhận và kiểu phản hồi được trả về của các đối tượng.

Ví dụ: Một chú chó là một đối tượng vì nó có các trạng thái như màu sắc, tên, giống, v.v. cũng như các hành vi như vẫy đuôi, sủa, ăn, v.v.

Class

Tập hợp của các đối tượng được gọi là class. Đây là một thực thể logic.
Một class có thể được định nghĩa là bản thiết kế để tạo ra các đối tượng. Class không chiếm chỗ trong bộ nhớ.

Tính kế thừa

Khi một đối tượng có tất cả các thuộc tính và hành vi của một đối tượng cha, đó là sự kế thừa. Nó khiến cho code có thể tái sử dụng. Sử dụng tính kế thừa để đạt được tính đa hình trong runtime.

Tính đa hình

Nếu một tác vụ được thực hiện theo nhiều cách khác nhau, đó là tính đa hình. Ví dụ: thuyết phục khách hàng theo các cách khác nhau, vẽ gì đó như hình, tam giác, chữ nhật, v.v.
Trong Java, ta sử dụng nạp chồng phương thức (method overloading) và ghi đè phương thức (method overriding) để đạt được tính đa hình.

Ví dụ là hành động kêu, mèo thì meo meo còn chó thì sủa, v.v.

Tính trừu tượng

Việc che dấu chi tiết bên trong và thể hiện chức năng được gọi là tính trừu tượng. Ví dụ với việc gọi điện thoại, ta không biết quá trình xử lý bên trong thực hiện như thế nào.
Trong Java, ta sử dụng abstract class và interface để đạt được tính trừu tượng.

Tính đóng gói

Liên kết (hay gói) code và dữ liệu với nhau vào một đơn vị được gọi là tính đóng gói.
Một class trong Java là ví dụ về tính đóng gói. Bean trong Java là một class đóng gói hoàn toàn vì mọi thành viên dữ liệu là private.

Coupling

Coupling đề cập đến việc nắm thông tin hoặc phụ thuộc và một class khác. Nó xảy ra khi các class biết đến nhau. Nếu một class có thông tin chi tiết của một class khác, đó là coupling chặt. Trong Java, ta sử dụng các modifier như private, protected, và public để thể hiện mức độ hiện thị của một class, phương thức hoặc và biến. Bạn có thể sử dụng interface để couling lỏng hơn vì không có concrete implementation.

Cohesion

Cohesion đề cập tới mức độ của một component thực hiện một tác vụ được định nghĩa rõ ràng. Một tác vụ được định nghĩa rõ ràng được thực hiện bởi một phương thức có tính cohesion cao. Phương thức có tính cohesion thấp sẽ chi tác vụ thành các phần riêng biệt. Gói java.io là một gói có tính cohesion cao vì nó có các class và interface liên quan tới nhập/xuất dữ liệu. Tuy nhiên gói java.util là một gói có tính cohesion thấp vì nó chứa các class và interface không liên quan tới nhau.

Association

Association thể hiện quan hệ giữa các đối tượng. Ở đây, một đối tượng có thể liên kết với một hay nhiều đối tượng khác. Có bốn kiểu association giữa các đối tượng:

  • One to One (Một-Một)
  • One to Many (Một-Nhiều)
  • Many to One (Nhiều-Một)
  • Many to Many (Nhiều-Nhiều)

Ta sẽ hiểu các quan hệ này với các ví dụ thực tế. Một đất nước có một thủ tướng (one to one), và một thủ tướng có nhiều bộ trưởng (one to many). Nhiều bộ trưởng có một thủ tướng (many to one), và nhiều bộ trưởng có nhiều bộ (many to many).

Association có thể là unidirectional (một chiều) hay bidirectional (hai chiều).

Aggregation

Aggregation là một cách để đạt được Association. Aggregation thể hiện quan hệ mà một đối tượng chứa các đối tượng khác như là một phần trạng thái của nó. Nó thể hiện mối quan hệ lỏng lẻo giữa các đối tượng. Nó còn được thể hiện dưới thuật ngữ quan hệ has-a trong Java. Trong khi tính kế thừa thể hiện quan hệ is-a. Đây là một cách khác để tái sử dụng các đối tượng.

Composition

Composition cũng là một cách để đạt được Association. Composition thể hiện quan hệ mà một đối tượng chứa các đối tượng khác như là một phần trạng thái của nó. Có mối quan hệ chặt chẽ giữa đối tượng được chứa và đối tượng phụ thuộc. Khi mà các đối tượng được chứa không có sự tồn tại độc lập. Nếu bạn xoá đối tượng cha, tất cả đối tượng con tự động bị xoá.

Ưu điểm của OOPs so với ngôn ngữ lập trình hướng thủ tục (Procedure-oriented programming language)

  1. OOPs khiến việc phát triển và bảo trì dễ dàng hơn, còn với ngôn ngữ lập trình hướng thủ tục thì không dễ để quản lý nếu code mở rộng khi kích thước dự án tăng lên.
  2. OOPs cung cấp việc che dấu dữ liệu, còn với ngôn ngữ lập trình hướng thủ tục thì dữ liệu global có thể được truy cập từ bất kỳ đâu.
    global data
    Hình: Thể hiện dữ liệu trong Lập trình hướng thủ tục
    object data
    Hình: Thể hiện dữ liệu trong Lập trình hướng đối tượng
  3. OOPs cung cấp khả năng mô phỏng các sự kiện của thế giới thật một cách hiệu quả hơn. Ta có thể cung cấp giải pháp của thế giới thật nếu ta sử dụng ngôn ngữ lập trình hướng đối tượng.

Sự khác biệt giữa ngôn ngữ lập trình hướng đối tượng và ngôn ngữ lập trình dựa trên đối tượng (object-based programming language)

Ngôn ngữ lập trình dựa trên đối tượng tuân theo các tất cả các tính năng của OOPs ngoại trừ Tính kế thừa. JavaScript và VBScript là các ví dụ của ngôn ngữ lập trình dựa trên đối tượng.