# What is object-oriented programming?

[What is object-oriented programming? OOP explained in depth (educative.io)](https://www.educative.io/blog/object-oriented-programming)

Lập trình hướng đối tượng (Object-oriented programming – OOP) là một mô hình lập trình cơ bản được sử dụng bởi mọi lập trình viên. OOP là một mô hình lập trình phổ biến nhất hiện nay, được dạy như những thứ căn bản nhất một lập trình viên cần biết. Một mô hình lập trình phổ biến khác là lập trình hướng chức năng, nhưng chúng ta sẽ không đề cập trong bài viết này.

Hôm nay, chúng ta sẽ phân tích những thứ cơ bản tạo nên lập trình hướng đối tượng. Để bạn có thể sử dụng nó trong thuật toán, dự án và phỏng vấn.

Let’s go!!!!!

# Object-oriented programming

### Lập trình hướng đối tượng là gì?

Lập trình hướng đối tượng là một mô hình lập trình trong khoa học máy tính dựa trên khái niện về lớp (class) và đối tượng (object). Nó được sử dụng để giúp cấu trúc phần mềm đơn giản, có thể tái sử dụng, được sử dụng để tạo ra các phiên bản khác nhau của đối tượng. JavaScript, C++, C#, Java… những ngôn ngữ lập trình hướng đối tượng phổ biến.

Ngôn ngữ lập trình hướng đối tượng không nhất thiết phải bị giới hạn trong mô hình lập trình hướng đối tượng. Một số ngôn ngữ như JavaScript, Python, PHP… cho phép cả lập trình hướng đối tượng và lập trình hướng thủ tục.

<span style="white-space:pre-wrap;">Lớp (class) có thể được coi là một bản thiết kế trừu tượng để tạo ra các đối tượng cụ thể hơn. Lớp thường đại diện cho các thể loại rộng như </span>**chó, ô** <span style="white-space:pre-wrap;">tô có các thuộc tính riêng. Các lớp này các định thuộc tính mà các đối tượng thuộc loại này sẽ có ví dụ như </span>**màu sắc**<span style="white-space:pre-wrap;"> nhưng không bao gồm giá trị cụ thể cho đối tượng.</span>

Lớp cũng có thể chưa các function gọi là phương thức (method) và chỉ có sẵn cho các đối tượng thuộc loại đó. Các function này được khai báo trong lớp và thể hiện một số hành động hữu ích cho loại đối tượng cụ thể đó.

**Ví dụ: lớp Car có phương thức Repaint sẽ thay đổi thuộc tính màu sắc của xe, Chức năng này chỉ có ích với đối tượng là Car vì chúng ta khai báo nói trong lớp Car, nó tạo ra một phương thức.**

Các lớp mẫu được sử dụng như bản thiết kế để taọ ra các đối tượng độc lập. Chúng đại diện cho các ví dụ cụ thể về lớp trừu tượng kiểu như myCar hay goldenRetriever. Mỗi đối tượng có thể có những giá trị độc nhất cho các đặc tính được khai báo trong class.

**Ví dụ chúng ta tạo ra lớp Car chứ tất cả các thuộc tính mà ô tô cần có như màu, thương hiệu, mẫu mã. Sau đó tạo ra một phiên bản của Car. myCar đại diện cho chiếc xe cụ thể.**  
**Sau đó chúng ta có thể đặt giá trị cho các thuộc tính đã được khai báo mà không làm ảnh hưởng đến các đối tượng khác hoặc lớp mẫu.**  
**Chúng ta có thể tái sử dụng lớp này để đại diện cho bất kỳ ô tô nào.**

![image-1024x925.png](https://docs.thanhdv.com/wp-content/uploads/2024/06/image-1024x925.png)

Lợi ích của OOP với phát triển phần mềm:

- OOP mô hình hoá những thứ phức tạp dưới dạng đơn giản và có thể tái tạo.
- Có thể tái sử dụng. Đối tượng có khả năng tái sử dụng giữa nhiều chương trình.
- Tính đa hình cho phép thực hiện hành vi dành riêng cho lớp.
- Dễ dàng sửa lỗi. Lớp thường chứa tất cả thông tin có thể ứng dụng cho chúng.
- Tính đóng gói giúp bảo vệ an toàn những thông tin nhạy cảm.

### Cách cấu trúc chương trình OOP

Hãy lấy một ví dụ thực tế. Hãy tưởng tượng bạn đang điều hành một trang trại với hàng trăm con thú cưng và bạn phải lưu tên, tuổi, ngày nhận cho môi con.

Làm sao để thiết kế đơn giản, có thể tái sử dụng?

<span style="white-space:pre-wrap;">Với hàng trăm con chó, sẽ rất kém hiệu quả khi khai bao từng con bởi vì bạn bạn sẽ phải viết rất nhiều code thừa thãi lặp đi lặp lại. Dưới đây chúng ta có thể thấy đối tượng rufus và fluffy. Có rất nhiều code lặp đi lặp lại trong các object ví dụ như </span>`<span class="editor-theme-code">name</span>`<span style="white-space:pre-wrap;">, </span>`<span class="editor-theme-code">age</span>`. Với những trường hợp như thế này chúng ta có thể sử dụng class và object để thay thế.

![image-1-1024x671.png](https://docs.thanhdv.com/wp-content/uploads/2024/06/image-1-1024x671.png)

Việc nhóm các thông tin liên quan lại với nhau để tạo thành cấu trúc lớp giúp code ngắn hơn và dễ bảo trì hơn.

Áp dụng OOP vào ví dụ trang trại chó trên

- <span style="white-space:pre-wrap;">Tạo một lớp cho tất cả các con chó. Có thể coi là một bản thiết kế bao gồm thông tin và hành vi mà tất cả các con chó đều có bất kể nó thuộc giống chó nào. Chúng ta gọi đó là </span>****lớp cha (parent class)****.
- <span style="white-space:pre-wrap;">Tạo các </span>****lớp con (child class)****<span style="white-space:pre-wrap;"> bao gồm các đặc điểm và hành vi đặc trưng cho mỗi loài chó.</span>
- Tạo đối tượng từ các lớp con đại diện cho giống chó đó.

Sơ đồ dưới đây thể hiện cách thiết kế một chương trình hướng đối tượng bằng cách nhóm các dữ liệu và hành vi liên quan lại với nhau tạo thành các mẫu đơn giản sau đó tạo các nhóm phụ cho dữ liệu và hành vi đặc biệt.

<span style="white-space:pre-wrap;">Lớp </span>`<span class="editor-theme-code">Dog</span>`<span style="white-space:pre-wrap;"> là một mẫu chung chỉ chứa dữ liệu và hành vi chung mà tất cả các loài chó đều có.</span>

<span style="white-space:pre-wrap;">Sau đó chúng ta tạo 2 lớp con của </span>`<span class="editor-theme-code">Dog</span>`<span style="white-space:pre-wrap;"> là </span>`<span class="editor-theme-code">HerdingDog</span>`<span style="white-space:pre-wrap;"> và </span>`<span class="editor-theme-code">TrackingDog</span>`<span style="white-space:pre-wrap;">. Chúng kế thừa hành vi của </span>`<span class="editor-theme-code">Dog</span>`<span style="white-space:pre-wrap;"> nhưng có thêm những hành vi độc nhất của giống chó đó.</span>

<span style="white-space:pre-wrap;">Cuối cùng, chúng ta tạo đối tượng thuộc loại </span>`<span class="editor-theme-code">HerdingDog</span>`<span style="white-space:pre-wrap;"> để đại diện cho từng con chó. Ví dụ như </span>`<span class="editor-theme-code">Fluffy</span>`<span style="white-space:pre-wrap;"> và </span>`<span class="editor-theme-code">Maisel</span>`.

![image-2.png](https://docs.thanhdv.com/wp-content/uploads/2024/06/image-2.png)

### Thành phần tạo nên OOP

Tiếp theo chúng ta sẽ tìm hiểu sâu hơn về những thành phần cơ bản tạo nên một chương trình hướng dữ liệu:

- Lớp (Class)
- Đối tượng (Object)
- Phương thức (Method)
- Thuộc tính (Attributes)

#### Lớp (Class)

<span style="white-space:pre-wrap;">Đơn giản thì các lớp là các </span>****kiểu dữ liệu mà người dùng tự định nghĩa****. Các lớp là nơi mà chúng ta tạo ra bản thiết kế cho cấu trúc của phương thức và thuộc tính. Các đối tượng đều được tạo ra từ bản thiết kế này.

<span style="white-space:pre-wrap;">Lớp chứa các trường cho thuộc tính và các phương thức cho hành vi. Trong ví dụ về chó ở trên, thuộc tính bao gồm: </span>`<span class="editor-theme-code">name</span>`<span style="white-space:pre-wrap;">, </span>`<span class="editor-theme-code">birthday</span>`<span style="white-space:pre-wrap;">, </span>`<span class="editor-theme-code">age</span>`<span style="white-space:pre-wrap;">… trong khi method bao gồm </span>`<span class="editor-theme-code">bark()</span>`<span style="white-space:pre-wrap;"> và </span>`<span class="editor-theme-code">updateAttendance()</span>`.

Dưới đây là đoạn code tạo ra lớp chó trong JavaScript

![image-3.png](https://docs.thanhdv.com/wp-content/uploads/2024/06/image-3.png)

Hãy nhớ rằng lớp là một mẫu để mô hình hoá con chó và một đối tượng được khởi tạo từ lớp thì đại diện cho một vật phẩm cụ thể trong thế giới thực.

#### Đối tượng (Object)

<span style="white-space:pre-wrap;">Không có gì ngạc nhiên khi nói đối tượng là một phần rất lớn của OOP. Đối tượng là </span>****thể hiện của một lớp****<span style="white-space:pre-wrap;"> được tạo ra với dữ liệu đặc biệt. Ví dụ với đoạn code dưới đây </span>`<span class="editor-theme-code">Rufus</span>`<span style="white-space:pre-wrap;"> là thể hiện của lớp </span>`<span class="editor-theme-code">Dog</span>`.

![image-4.png](https://docs.thanhdv.com/wp-content/uploads/2024/06/image-4.png)

<span style="white-space:pre-wrap;">Khi </span>`<span class="editor-theme-code">new Dog</span>`<span style="white-space:pre-wrap;"> được gọi:</span>

- <span style="white-space:pre-wrap;">Một đối tượng mới được tạo ra với tên </span>`<span class="editor-theme-code">Rufus</span>`
- <span style="white-space:pre-wrap;">Hàm tạo gán các giá trị </span>`<span class="editor-theme-code">name</span>`<span style="white-space:pre-wrap;"> và </span>`<span class="editor-theme-code">birthday</span>`.

<table id="bkmrk-n%2Fal%C3%A0-g%C3%AC%3Fch%E1%BB%A9a-th%C3%B4ng-" style="border-collapse:collapse;border-color:rgb(137,137,137);border-style:solid;border-width:1px;max-width:100%;width:620px;"><colgroup><col></col><col></col><col></col><col></col><col></col></colgroup><tbody><tr style="max-width:100%;"><td style="border:1px solid;padding:0.5em;max-width:100%;">****N/A****

</td><td style="border:1px solid;padding:0.5em;max-width:100%;">****Là gì?****

</td><td style="border:1px solid;padding:0.5em;max-width:100%;">****Chứa thông tin****

</td><td style="border:1px solid;padding:0.5em;max-width:100%;">****Hành động****

</td><td style="border:1px solid;padding:0.5em;max-width:100%;">****Ví dụ****

</td></tr><tr style="max-width:100%;"><td style="border:1px solid;padding:0.5em;max-width:100%;">Lớp (Class)

</td><td style="border:1px solid;padding:0.5em;max-width:100%;">Bản thiết kế

</td><td style="border:1px solid;padding:0.5em;max-width:100%;">Thuộc tính

</td><td style="border:1px solid;padding:0.5em;max-width:100%;">Hành vi được khai báo thông qua phương thức

</td><td style="border:1px solid;padding:0.5em;max-width:100%;">Mẫu Dog

</td></tr><tr style="max-width:100%;"><td style="border:1px solid;padding:0.5em;max-width:100%;">Đối tượng (Object)

</td><td style="border:1px solid;padding:0.5em;max-width:100%;">Thể hiện của lớp

</td><td style="border:1px solid;padding:0.5em;max-width:100%;">Trạng thái, Dữ liệu

</td><td style="border:1px solid;padding:0.5em;max-width:100%;">Phương thức

</td><td style="border:1px solid;padding:0.5em;max-width:100%;">Con chó tên là Rufus, Fluffy

</td></tr></tbody></table>

#### Thuộc tính (Attribute)

Thuộc tính là thông tin được lưu trữ. Thuộc tính được khai báo bên trong lớp. Khi đối tượng được khởi tạo, các đối tượng riêng lẻ lưu trữ dữ liệu trong các trường thuộc tính.

Trạng thái của một đối tượng được xác định dựa trên những trường thuộc tính của đối tượng đó. Ví dụ, một con chó con và một con chó trưởng thành có thể được chăm sóc khác nhau ở trang trại. Ngày sinh có thể xác định trạng thái của đối tượng và cho phép phần mềm xử lý những con chó có độ tuổi khác nhau theo cách khác nhau.

#### Phương thức (Method)

Phương thức đại diện cho hành vi. Phương thức thể hiện hành động. Phương thức trả về thông tin của đối tượng hoặc cập nhật dữ liệu của đối tượng. Phương thức nằm bên trong một class.

<span style="white-space:pre-wrap;">Khi một đối tượng được khởi tạo, đối tượng này có thể gọi phương thức được khai báo trong lớp. Trong đoạn code dưới đây phương thức </span>`<span class="editor-theme-code">bark</span>`<span style="white-space:pre-wrap;"> được khai báo trong lớp </span>`<span class="editor-theme-code">Dog</span>`<span style="white-space:pre-wrap;"> và </span>`<span class="editor-theme-code">bark() </span>`<span style="white-space:pre-wrap;">có thể được gọi bởi </span>`<span class="editor-theme-code">Rufus</span>`

![image-5.png](https://docs.thanhdv.com/wp-content/uploads/2024/06/image-5.png)

<span style="white-space:pre-wrap;">Phương thức thường chỉnh sửa, cập nhật hoặc xoá dữ liệu. Tuy nhiên không phải tất cả các phương thức đều thay đổi dữ liệu. Ví dụ phương thức </span>`<span class="editor-theme-code">bark()</span>`<span style="white-space:pre-wrap;"> không cập nhật bất kỳ dữ liệu nào bởi vì sủa không ảnh hưởng đến bất kỳ trường dữ liệu nào của lớp </span>`<span class="editor-theme-code">Dog</span>`.

<span style="white-space:pre-wrap;">Phương thức </span>`<span class="editor-theme-code">updateAttendance()</span>`<span style="white-space:pre-wrap;"> thêm một ngày con chó được chăm sóc trong trại. Thuộc tính </span>`<span class="editor-theme-code">_attendance</span>`<span style="white-space:pre-wrap;"> rất quan trọng để thanh toán tiền cho chủ chó vào cuối tháng.</span>

Phương thức là cách mà lập trình viên tái sử dụng và giữ các chức năng nằm trong một đối tượng. Khả năng tái sử dụng là một lợi ích tuyệt vời khi debug. Nếu đó là một lỗi bạn chỉ cần tìm và sửa tại một nơi.

![image-6.png](https://docs.thanhdv.com/wp-content/uploads/2024/06/image-6.png)

### Bốn tính chất của OOP

Bốn trụ cột của lập trình hướng đối tượng là:

- ****Tính kế thừa (inheritance)****: Lớp con được kế thừa dữ liệu và hành vi từ lớp cha.
- ****Tính đóng gói (encapsulation)****: Dữ liệu được chưa trong một đối tượng chỉ show ra những thông tin cần thiết.
- ****Tính trừu tượng (abstraction)****: Chỉ truy cập đối tượng thông qua các phương thức có mức độ công khai cao.
- ****Tính đa hình (polymorphism)****: Một phương thức có thể thực hiện những nhiệm vụ khác nhau.

#### Tính kế thừa (Inheritance)

Tính kế thừa cho phép các lớp kế thừa tính năng của một lớp khác. Nói cách khác lớp lớp cha cung cấp thuộc tính, hành vi cho lớp con. Tính kế thừa còn hỗ trợ cho khả năng tái sử dụng.

Nếu thuộc tính cơ bản và hành vi được khai báo ở lớp cha, lớp con có thể tạo, mở rộng tính năng của lớp cha, thêm các thuộc tính và hành vi khác.

<span style="white-space:pre-wrap;">Ví dụ chó chăn cừu có khả năng độc đáo là chăn gia súc. Nói cách khác thì tất cả chó chăn cừu đều là chó. Nhưng không phải con chó nào cũng là chó chăn cừu. Chúng ta thể hiện sự khác biệt đó bằng cách tạo ra lớp con </span>`<span class="editor-theme-code">HerdingDog</span>`<span style="white-space:pre-wrap;"> từ lớp cha </span>`<span class="editor-theme-code">Dog</span>`<span style="white-space:pre-wrap;"> rồi sau đó thêm hành động h</span>`<span class="editor-theme-code">erd()</span>`.

<span style="white-space:pre-wrap;">Lợi ích của tính kế thừa là chương trình có thể tạo một lớp cha chung sau đó tạo ra nhiều lớp con đặc biệt hơn nếu cần. Điều này giúp đơn giản hoá việc lập trình, thay vì phải tạo ra lớp </span>`<span class="editor-theme-code">Dog</span>`<span style="white-space:pre-wrap;"> nhiều lần, các lớp con tự động được truy cập vào các tính năng của lớp cha.</span>

<span style="white-space:pre-wrap;">Trong đoạn code dưới, lớp con </span>`<span class="editor-theme-code">HerdingDog</span>`<span style="white-space:pre-wrap;"> kế thừa phương thức </span>`<span class="editor-theme-code">bark</span>`<span style="white-space:pre-wrap;"> từ lớp cha </span>`<span class="editor-theme-code">Dog</span>`<span style="white-space:pre-wrap;"> và lớp con có thể thêm phương thức </span>`<span class="editor-theme-code">herd()</span>`.

![image-7.png](https://docs.thanhdv.com/wp-content/uploads/2024/06/image-7.png)

<span style="white-space:pre-wrap;">Chú ý rằng lớp </span>`<span class="editor-theme-code">HerdingDog</span>`<span style="white-space:pre-wrap;"> không hề khai báo phương thức </span>`<span class="editor-theme-code">bark()</span>`<span style="white-space:pre-wrap;">. Nó kế thừa từ lớp cha </span>`<span class="editor-theme-code">Dog</span>`.

<span style="white-space:pre-wrap;">Khi gọi phương thức </span>`<span class="editor-theme-code">fluffy.bark()</span>`<span style="white-space:pre-wrap;">. Phương thức </span>`<span class="editor-theme-code">bark()</span>`<span style="white-space:pre-wrap;"> sẽ đi ngược lên lớp cha, tìm nơi mà phương thức </span>`<span class="editor-theme-code">bark</span>`<span style="white-space:pre-wrap;"> được khai báo.</span>

![image-8.png](https://docs.thanhdv.com/wp-content/uploads/2024/06/image-8.png)

*****Chú ý*********:****<span style="white-space:pre-wrap;"> </span>**Lớp cha còn có thể được gọi là superclasses hoặc base classes. Lớp con cũng có thể được gọi là subclass, derived class, or extended class.**

![image-9.png](https://docs.thanhdv.com/wp-content/uploads/2024/06/image-9.png)

Trong ví dụ trên ta thấy cả 3 đối tượng đều có thể sủa. Hành vi chăn gia súc được khai báo ở lớp chó chăn cừu nên chỉ có M và F có thể truy cập phương thức này. R được khởi tạo từ lớp chó nên chỉ có thể truy cập hành vi sủa.

#### Tính đóng gói (Encapsulation)

Tính đóng gói là giữ tất cả các thông tin quan trọng trong một đối tượng và chỉ show những thông tin cần thiết ra bên ngoài. Thuộc tính và hành vi được định nghĩa bởi code bên trong của lớp mẫu.

Sau đó, khi một đối tượng được khởi tạo từ một lớp, dữ liệu và phương thức sẽ được đóng gói bên trong đối tượng đó. Đóng gói ẩn cách triển khai phần mềm bên trong một class và ẩn dữ liệu bên trong một đối tượng.

Tính đóng gói yêu cầu khai báo private cho một số trường và public cho một số trường khác.

- ****Private/Internal interface:****<span style="white-space:pre-wrap;"> phương thức và đặc tính chỉ có thể được truy cập từ các phương thức khác nhau trong cùng class.</span>
- ****Public/External interface:****<span style="white-space:pre-wrap;"> phương thức và đặc tính có thể được truy cập từ bên ngoài class.</span>

Lấy một chiếc xe ô tô làm ẩn dụ cho tính bao đóng gói. Thông tin của chiếc xe, sử dụng xi nhan để báo rẽ là những thông tin được public. Ngược lại, động cơ được giấu dưới mui xe.

Khi bạn lái xe trên đường, những chiếc xe khác sẽ cần thông tịn từ bạn để đưa ra quyết định ví dụ như kích thước chiếc xe của bạn, bạn muốn rẽ trái hay phải. Mặt khác, việc chia sẻ những thông tin như nhiệt độ xe… là thừa thãi và có thể gây rối cho những tài xế khác.

![image-10.png](https://docs.thanhdv.com/wp-content/uploads/2024/06/image-10.png)

Tính đóng gói giúp tăng cường bảo mật. Thuộc tính và phương thức có thể đặt private nên chúng không thể bị truy cập từ bên ngoài class. Để lấy thông tin về dữ liệu của một đối tượng, phương thức và thuộc tính public được sử dụng để truy cập và cập nhật dữ liệu.

**Cách này thêm một lớp bảo mật, lập trình viên có thể chọn dữ liệu nào có thể được xem thông thông qua các phương thức public.**

Trong một class hầu hết các ngôn ngữ lập trình đều có các thành phần public, protected và private.

- <span style="white-space:pre-wrap;">Thành phần </span>****public****<span style="white-space:pre-wrap;"> cho phép thuộc tính và phương thức có thể được truy cập từ bên ngoài hoặc từ class khác của chương trình.</span>
- <span style="white-space:pre-wrap;">Thành phần </span>****protected****<span style="white-space:pre-wrap;"> chỉ có thể truy cập từ class đó và các class con của nó.</span>
- <span style="white-space:pre-wrap;">Thành phần </span>****private****<span style="white-space:pre-wrap;"> chỉ có thể truy cập bên trong class (kể cả các class con cũng không thể truy cập).</span>

Quay lại ví dụ trại chó, tính đóng gói là giúp bảo mật thông tin của chó và chủ của nó. Chủ chó khác không thể xem thông tin của bạn cũng như chó của bạn.

****Đóng gói và cập nhật dữ liệu:****<span style="white-space:pre-wrap;"> Bởi vì phương thức cũng có thể cập nhật dữ liệu của đối tượng nên lập trình viên có thể kiểm soát dữ liệu nào được phép thay đổi thông qua phương thức.</span>

Nó cho phép chúng ta ẩn giấu thông tin quan trọng khỏi khác đối tượng lừa đảo hoặc tránh việc thay đổi nhầm dữ liệu.

Tính bao đóng tăng tính bảo mật cho code của bạn và đơn giản hoá quá trình làm việc với các lập trình viên khác. Khi bạn lập trình bạn sẽ khộng muốn chia sẻ class gốc hoặc dữ liệu private với các công ty khác vì công ty của bạn có quyền sở hữu trí tuệ với tài sản đó.

Thay vào đó, lập trình viên tạp ra các phương thức public cho phép lập trình viên khác gọi phương thức đó thông qua object. Lý tưởng nhất là để các phương thức đó vào tài liệu mà bạn sẽ gửi cho các lập trình viên khác.

Tóm lại, lợi ích của tính đóng gói bao gồm:

- ****Tăng cường bảo mật:****<span style="white-space:pre-wrap;"> Giới hạn dữ liệu có thể truy cập của đối tượng.</span>
- ****Tránh các lỗi thường gặp:****<span style="white-space:pre-wrap;"> Tránh các lỗi do thay đổi nhầm dữ liệu.</span>
- ****Bảo vệ quyền sở hữu trí tuệ:****<span style="white-space:pre-wrap;"> Code được giấu trong các class. Và các lập trình viên khác chỉ có thể truy cập thông qua các public class.</span>
- ****Có thể hỗ trợ:****<span style="white-space:pre-wrap;"> Hầu hết code đều có thể được cập nhật và cải tiến.</span>
- ****Đơn giản hoá:****<span style="white-space:pre-wrap;"> Không phải ai cũng cần biết tất cả thuộc tính và phương thức của đối tượng. Biết quá nhiều đôi khi gây ra sự bối rối.</span>

#### Tính trừu tượng (Abstraction)

<span style="white-space:pre-wrap;">Tính trừu tượng có thể coi là một phần mở rộng của tính đóng gói sử dụng các lớp và đối tượng chứa code và dữ liệu để ẩn giấu chi tiết chương trình với người dùng. Điều này được thực hiện bằng cách tạo ra </span>****lớp trừu tượng****<span style="white-space:pre-wrap;"> giữa người dùng và mã nguồn phức tạp hơn. Nó giúp bảo vệ thông tin nhạy cảm bên trong mã nguồn.</span>

Tính trừu tượng

- Giảm sự phức tạp và cải thiện khả năng đọc của code
- Tạo điều kiện để tái sử dụng code
- Tăng cường bảo mật dữ liệu bằng cách ẩn giấu thông tin nhạy cảm
- Năng cao năng suất bằng cách loại bỏ các chi tiết ở tầng thấp.

Tính trừu tượng cũng có thể được giải thích thông qua cái ô tô. Hãy nghĩ về cách tài xế lái xe.

Một tài xế sử dụng vô lăng, chân ga và phanh để điều khiển chiếc xe mà không cần lo lắng là động cơ hoạt động như nào hay bộ phận nào được sử dụng cho việc chuyển động. Đó là tính trừu tượng – tài xế chỉ cần biết đến những yếu tố quan trọng liên quan trực tiếp đến việc lái xe.

![image-11.png](https://docs.thanhdv.com/wp-content/uploads/2024/06/image-11.png)

Tương tự, tính trừu tượng cho phép lập trình viên làm việc với những thông tin quan trọng mà không cần lo lắng về cách hoạt động bên trong của chúng. Bằng cách này nó giúp cải thiện chất lượng code và khả năng đọc của code.

<span style="white-space:pre-wrap;">Tính trừu tượng cũng phục vụ cho tính bảo mật. Bằng cách chỉ hiển thị một phần được chọn của dữ liệu và chỉ cho phép dữ liệu </span>****truy cập thông qua class****<span style="white-space:pre-wrap;"> và </span>****chỉnh sửa thông qua phương thức****<span style="white-space:pre-wrap;"> chúng ta bảo vệ dữ liệu khỏi bị lộ.</span>

Lợi ích của tính trừu tượng:

- Tạo giao diện người dùng đơn giản và cao cấp.
- Ẩn giấu code phức tạp.
- Bảo mật.
- Bảo trì dễ dàng hơn.
- Câp nhật code mà không ảnh hưởng đến người dùng.

#### Tính đa hình (Polymorphism)

Tính đa hình là thiết kế đối tượng để để chia sẻ hành vi. Sử dụng tính kế thừa, đối tượng có thể ghi đè lên các hành vi mà lớp cha chia sẻ với lớp con bằng các hành vi đặc biệt khác. Tính đa hình cho phép những phương thức giống nhau thực hiện các hành vi khác nhau bằng 2 cách là overriding và overloading.

##### Phương thức ghi đè (Override)

Trong runtime, đa hình sử dụng phương thức ghi đè. Trong phương thức ghi đè, một lớp con có thể triển khai khác với lớp cha của nó.

**Trong ví dụ về chó, chúng ta muốn giống chó săn sửa khác với mặc định. Ta có thể tạo phương thức* `<em class="editor-theme-code editor-theme-italic">bark()</em>` *trong lớp con và ghi đè phương thức* `<em class="editor-theme-code editor-theme-italic">bark()</em>` *của lớp cha.**

![image-12.png](https://docs.thanhdv.com/wp-content/uploads/2024/06/image-12.png)

![image-13.png](https://docs.thanhdv.com/wp-content/uploads/2024/06/image-13.png)

![image-14.png](https://docs.thanhdv.com/wp-content/uploads/2024/06/image-14.png)

![image-15.png](https://docs.thanhdv.com/wp-content/uploads/2024/06/image-15.png)

##### Phương thức nạp chồng (Overload)

Trong compile time, đa hình sử dụng phương thức nạp chồng. Phương thức hoặc chức năng có cùng tên nhưng có thể khác số lượng tham số và khác kết quả trả về.

![image-16.png](https://docs.thanhdv.com/wp-content/uploads/2024/06/image-16.png)

![image-17.png](https://docs.thanhdv.com/wp-content/uploads/2024/06/image-17.png)

Trong ví dụ trên, nếu không có tham số truyền vào thì ngày chăm sóc mặc định cộng thêm 1, nếu có tham số thì số ngày chăm sóc tăng lên tương ứng với tham số được truyền vào.

Lợi ích của tính đa hình:

- Các đối tượng khác loại có thể chuyển qua một giao diện chung.
- Phương thức ghi đè
- Phương thức nạp chồng

### Tổng kết

Lập trình hướng đối tượng yêu cầu lập trình viên nghĩ về cấu trúc của chương trình và lên kế hoạch thiết kế hướng đối tượng trước khi code. OOP trong lập trình tập trung vào cách phân tích yêu cầu thành các lớp đơn giản và có thể tái sử dụng như một bản thiết kế của đối tượng. Nhìn chung, OOP cho phép cấu trúc dữ liệu và tái sử dụng tốt hơn, tiết kiệm thời gian với những dự án dài.