Trong bài viết này, chúng ta sẽ tìm hiểu về những khái niệm cơ bản của Lập trình hướng đối tượng (OOPs Concepts).
Lập trình hướng đối tượng là một mô hình cung cấp nhiều khái niệm, chẳng hạn như kế thừa (inheritance), ràng buộc dữ liệu (data binding), đa hình (polymorphism), v.v.
Mô hình lập trình hướng đối tượng là nơi mọi thứ được biểu diễn dưới dạng một đối tượng được gọi là ngôn ngữ lập trình hướng đối tượng thực sự.
Ngày nay Java quá phát triển với mô hình lập trình hướng đối tượng nên có thể sẽ có nhiều người nhầm lẫn.
Java không phải là ngôn ngữ lập trình hướng đối tượng đầu tiên.
Chính Simula mới được coi là ngôn ngữ lập trình hướng đối tượng đầu tiên.
Và Smalltalk là ngôn ngữ lập trình hướng đối tượng thực sự đầu tiên.
Và các ngôn ngữ hướng đối tượng phổ biến là: C #, JAVA, PHP, Python, C ++, v.v.
Mục đích chính của lập trình hướng đối tượng là để thực hiện các thực thể trong thế giới thực vào máy tính thông qua: Object, Class, Abstract, Inheritance, Polymorphism…
I. OOP (Hệ thống lập trình hướng đối tượng)
Đối tượng (Object) có nghĩa là một thực thể trong thế giới thực 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 hoặc mô hình để thiết kế chương trình bằng cách sử dụng các lớp (class) và đối tượng (object). Nó đơn giản hóa việc phát triển và bảo trì phần mềm bằng cách cung cấp một số khái niệm:
- Object: Đối tượng
- Class: Lớp
- Inheritance: Kế thừa
- Polymorphism: Đa hình
- Abstraction: Trừu tượng
- Encapsulation: Đóng gói
Ngoài các khái niệm này, còn có một số thuật ngữ khác được sử dụng trong thiết kế Hướng đối tượng:
- Coupling
- Cohesion
- Association
- Aggregation
- Composition
II. Các khái niệm, thuật ngữ của lập trình hướng đối tượng
Bất kỳ thực thể có trạng thái và hành vi được gọi là một đối tượng (object). Ví dụ, ghế, bút, bàn, bàn phím, xe đạp, v.v … Nó có thể là đối tượng vật lý hoặc là đối tượng logic.
Một đối tượng có thể được định nghĩa là một thể hiện của một lớp (class). Một đối tượng chứa một địa chỉ và chiếm một khoảng trống trong bộ nhớ.
Các đối tượng có thể giao tiếp mà không cần biết chi tiết về dữ liệu hoặc mã của nhau. Điều cần thiết duy nhất là loại tin nhắn được chấp nhận và loại phản hồi được trả về bởi các đối tượng.
Ví dụ: Một con 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 uống, v.v.
Bộ sưu tập các đối tượng (object) được gọi là lớp (class). Nó là một thực thể logic.
Một class cũng có thể được định nghĩa là một kế hoạch chi tiết mà từ đó bạn có thể tạo một đối tượng riêng lẻ (instance object). Class không chiếm không gian.
Ví dụ: Chó là một class chung của: Chó Vàng, Chó cỏ, Chó Phú Quốc, Chó đốm …
Khi một đối tượng có được tất cả các thuộc tính và hành vi của đối tượng cha, nó được gọi là kế thừa (inheritance). Nó cung cấp khả năng sử dụng lại code. Nó được sử dụng để đạt được tính đa hình trong runtime.
Nếu một nhiệm vụ được thực hiện theo những cách khác nhau, nó được gọi là đa hình (Polymorphism).
Ví dụ: Cùng là thuyết phục, nhưng đối với khách hàng khác nhau cần thực hiện thuyết phục khác nhau. Tương tự, cùng là vẽ hình nhưng vẽ hình tam giác, hình chữ nhật lại thực hiện khác nhau….
Trong Java, chúng 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.
Một ví khác: Phương thức động vật kêu, nhưng khi mèo kêu thì sẽ là meo meo, chó kêu thì sẽ là gâu gâu.
Ẩn chi tiết nội bộ và hiển thị chức năng được gọi là trừu tượng (Abstraction). Ví dụ như cuộc gọi điện thoại, chúng ta chỉ biết là bấm số và gọi, còn việc xử lý nội bộ như thế nào thì đã bị ẩn đi.
Trong Java, chúng ta sử dụng abstract class và interface để đạt được sự trừu tượng hóa.
Ràng buộc (hoặc gói) code và dữ liệu với nhau thành một đơn vị được gọi là Đóng gói (Encapsulation).
Ví dụ, một viên nang thành phẩm có thể sử dụng, nó có các thành phần bên trong và được bọc lại.
Một Java class là một ví dụ về đóng gói. Java bean là class được đóng gói đầy đủ vì tất cả các dữ liệu thành viên (data member) ở đây là riêng tư (private).
Coupling đề cập đến sự phụ thuộc của một lớp khác. Nó phát sinh khi các class nhận thức được nhau.
Nếu một lớp có thông tin chi tiết của lớp khác nó là Coupling (Sự liên kết).
Trong Java, chúng ta sử dụng các công cụ sửa đổi private, protected và public để quy định mức độ hiển thị của một class, method và field.
Bạn có thể sử dụng các interface cho Coupling yếu vì không có triển khai cụ thể.
Sự gắn kết (Cohesion) liên quan đến mức độ của một thành phần thực hiện một nhiệm vụ được xác định rõ.
Một nhiệm vụ được xác định rõ được thực hiện bằng một phương thức có tính gắn kết cao.
Phương thức gắn kết yếu sẽ chia nhiệm vụ thành các phần riêng biệt.
Package java.io là một package có tính gắn kết cao vì nó có các class và interface liên quan đến I/O.
Tuy nhiên, package java.util là package có sự gắn kết yếu vì nó có chứa các class và interface không liên quan.
Association đại diện cho mối quan hệ giữa các đối tượng. Ở đây, một đối tượng có thể được liên kết với một đối tượng hoặc nhiều đối tượng.
Có thể có bốn loại liên kết giữa các đối tượng:
+ Một đến Một
+ Một đến nhiều
+ Nhiều đến Một
+ Nhiều đến Nhiều
Hãy hiểu mối quan hệ với các ví dụ thời gian thực.
Ví dụ: Một quốc gia có quan hệ với một thủ tướng (một đối một) và một thủ tướng có thể quan hệ đến nhiều bộ trưởng (một đến nhiều). Ngoài ra, nhiều đảng viên có thể có quan hệ đến một thủ tướng (nhiều đến một) và nhiều bộ trưởng có thể quan hệ đến nhiều bộ (nhiều đến nhiều).
Association có thể là vô hướng hoặc hai chiều.
Aggregation (tập hợp) là một cách để đạt được Association (sự gắn kết). Tập hợp biểu thị mối quan hệ trong đó một đối tượng chứa các đối tượng khác như là một phần của trạng thái của nó.
Nó đại diện cho mối quan hệ yếu giữa các đối tượng. Nó cũng được gọi là mối quan hệ has-a trong Java. Giống như, Inheritance (kế thừa) đại diện cho mối quan hệ is-a. Đó là một cách khác để tái sử dụng các đối tượng.
Các thành phần (composition) cũng là một cách để đạt được Association.
Thành phần thể hiện mối quan hệ trong đó một đối tượng chứa các đối tượng khác như là một phần của trạng thái của nó.
Có một mối quan hệ mạnh mẽ giữa đối tượng chứa và đối tượng phụ thuộc. Đây là trạng thái chứa các đối tượng không có sự tồn tại độc lập.
Nếu bạn xóa đối tượng cha, tất cả các đối tượng con sẽ tự động bị xóa.
III. Ưu điểm của Lập trình hướng đối tượng so với Lập trình hướng thủ tục
1) Lập trình hướng đối tượng giúp lập trình và bảo trì dễ dàng hơn, trong khi đó, trong khi đó ngôn ngữ lập trình hướng thủ tục, không dễ quản lý nếu code khi quy mô dự án tăng.
2) OOP cung cấp khả năng ẩn dữ liệu, trong khi đó, trong ngôn ngữ lập trình hướng thủ tục, dữ liệu có thể được truy cập từ bất cứ đâu.
3) OOP cung cấp khả năng mô phỏng sự kiện trong thế giới thực hiệu quả hơn nhiều. Do đó, chúng ta có thể cung cấp giải pháp cho vấn đề từ thực tế.
IV. 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 là gì?
Ngôn ngữ lập trình dựa trên đối tượng (object-based programming language) tuân theo tất cả các tính năng của lập trình hướng đối tượng ngoại trừ Kế thừa (inheritance). JavaScript và VBScript là ví dụ về ngôn ngữ lập trình dựa trên đối tượng.
Lời kết.
Trên đây là một số khái niệm, thuật ngữ trong Lập trình hướng đối tượng. Chúng ta sẽ cùng tìm hiểu kỹ về từng khái niệm, thuật ngữ trong các bài hướng dẫn Java Hướng đối tượng sau.
Xem ngay: Khóa học Java dành cho người mới bắt đầu!