Chatbox

Các bạn vui lòng dùng từ ngữ lịch sự và có văn hóa,sử dụng Tiếng Việt có dấu chuẩn. Chúc các bạn vui vẻ!
13/07/2021 21:07 # 1
buiducduong
Cấp độ: 22 - Kỹ năng: 1

Kinh nghiệm: 32/220 (15%)
Kĩ năng: 0/10 (0%)
Ngày gia nhập: 25/09/2020
Bài gởi: 2342
Được cảm ơn: 0
003: Các tính chất cơ bản trong OOP P1


OOP có 4 tính chất cơ bản cần nhớ trong suốt cuộc đời lập trình viên, đó là một cái bánh - A PIE, viết tắt của:

  • Abstraction.
  • Polymorphism.
  • Inheritance.
  • Encapsulation.

Ngôn ngữ kĩ thuật khô khan, nên việc tiếp thu 4 tính chất này đối với mình khi còn học trên ghế nhà trường là.. rất khó khăn. Mỗi ngôn ngữ lập trình sẽ có syntax khác nhau. Mà concept của OOP là đem hiện thực đời sống thường ngày vào trong lập trình, do đó mình không lấy ví dụ coding mà chủ yếu tập trung vào ví dụ thực tế với mục tiêu hiểu sâu nắm rõ. Let's begin.

1) Abstraction

A person (con nhà người ta) - chúng ta đều hiểu nghĩa của từ này. Mặc dù không đề cập cụ thể các tính chất, nam nữ, béo gầy, cao thấp... nhưng ta đều hình dung được nó diễn tả một ai đấy: đứa ngồi cùng bàn, con bé hàng xóm hoặc thậm chí là đứa em ruột chăm ngoan học giỏi của mình 😂.

Đó là ví dụ của Abstraction, không thể đơn giản hơn.

Abstraction tập trung vào những đặc tính thiết yếu, dễ nhận biết nhất thay vì tập trung vào chi tiết của sự vật, sự việc.

Mình vừa làm mất điện thoại ngày hôm qua.

vs

Mình vừa làm mất con iPhone 12 Pro Max mạ vàng ngày hôm qua.

Với Abstraction, ta loại bỏ đi những thứ không quan trọng hoặc không liên quan, chỉ tập trung vào ý nghĩa và hình dung ra được sự vật đang được nói tới là gì.

Khi nói đến a person, nó có các attributes như chiều cao, cân nặng, độ tuổi... Nói đến a phone, một vài attributes là brand name, phiên bản, khối lượng, màu sắc...

Abstraction nghĩa là ta chỉ cần quan tâm đến khái niệm của sự vật mà không quan tâm đến các thể hiện cụ thể của sự vật đó.

Mình biết bạn mất điện thoại là được rồi. Còn điện thoại gì loại nào, mình không quan tâm. Nếu cố tình đề cập đến, rất có thể chúng ta sẽ được... ăn 👊.

Abstraction có quan trọng không?

Nhìn ví dụ trên là biết rất quan trọng rồi, đùa thế chứ quan trọng thật. Nó được coi như trái tim và linh hồn của OOP.

Trong lập trình, nếu muốn tạo ra 100 person, ta không viết 100 class. Chỉ cần tạo 1 class và tập trung vào các thông số mà ta quan tâm như: giới tính, họ tên, độ tuổi, chiều cao, cân nặng... Sau đó, với mỗi person, tạo ra từng object với từng thông số cụ thể. Đó là trong trường hợp các person đều có thông tin như nhau.

Trường hợp các person bao gồm các thông tin khác nhau, hãy cố gắng tạo ra class bao gồm các thông tin chung nhất có thể.

Ngoài ra, Abstraction chỉ quan tâm rằng một object có thể làm được những gì thay vì tập trung vào việc nó làm như thế nào.

Điện thoại nào cũng có chức năng nghe và gọi dù nó có là Nokia 1280 hay iPhone 12 Pro Max. Tuy nhiên chi tiết cách thực hoạt động có thể có sự khác biệt, iPhone có chức năng lọc tạp âm, còn Nokia thì không.

Với Java, chúng ta có interface và abstract class để implement abstraction.

2) Encapsulation

Ý tưởng của encapsulation là đóng gói các thuộc tính của object lại với nhau. Nó không chỉ giúp các thuộc tính tập trung lại một chỗ mà còn bảo vệ khỏi các tác động gậy hại từ bên ngoài. Có mùi quảng cáo sơn tường đâu đây.

Hãy nhìn những chiếc bánh quy thơm ngon này, nó được đựng trong chiếc lọ thủy tinh đã nắp chặt. Bảo vệ khỏi những vi khuẩn ngoài không khí và giúp giòn lâu hơn.

Encapsulation gộp các thuộc tính (attribute) và hành động (behavior/method) tương tác với các attribute của object vào thành một nhóm, cụ thể hơn là classLý do đầu tiên cần làm việc này là hạn chế quyền truy cập vào thuộc tính của đối tượng. Giống như việc ai đó lấy chiếc bánh quy trong hộp của mình. Họ phải xin phép, ngoài ra mình cũng có quyền giới hạn số lượng bánh được lấy.

Hơi ki bo 😂 nhưng với ngôn ngữ lập trình điều này vô cùng quan trọng. CookieJar class bao gồm một thuộc tính cookieCount thể hiện số lượng bánh có trong hộp.

Mình không muốn bất kì ai lấy đi những chiếc bánh thơm ngon của mình mà không được phép. Tương tự với thế giới lập trình, khi một CookieJar instance được tạo ra, mình không muốn bất kì thành phần nào khác trong application có thể trực tiếp truy cập vào cookieCount. Chỉ có thể truy cập gián tiếp qua các public method của CookieJar.

Ngoài ra còn là vấn đề về việc giới hạn/kiểm soát thông tin có hợp lệ hay không. Với từng cá nhân, phụ thuộc vào sự yêu/ghét 😂 mà mình cho phép họ lấy mấy cái bánh. Với lập trình, nếu được quyền truy cập trực tiếp vào cookieCount, không có điều gì đảm bảo nó không bị thay đổi giá trị thành -1, một giá trị vô nghĩa có thể khiến crash application.

Vậy làm cách nào để cấp quyền truy cập gián tiếp tới cookieCount? Chúng ta sẽ implement method requestCookie và chắc chắn rằng client có thể gọi đến nó (thông qua access modifier). Method này làm một loạt các validation cần thiết, update thông tin cookieCount trước khi trả cho client.

Ngoài việc bảo vệ các attribute, tập trung chúng và method lại với nhau, một nguyên tắc khác của encapsulation là chỉ public ra bên ngoài những gì cần thiết để application hoạt động bình thường. Kĩ thuật này được gọi là data hiding hay black box.

Lưu ý, data hiding là một nguyên tắc và kĩ thuật để thiết kế encapsulation trong ứng dụng OOP, nó không phải một tính chất của OOP.

Giống ví dụ trên với chiếc Nokia 1280 và iPhone 12 Pro Max, chúng ta không cần quan tâm đến cách hoạt động của chúng, chỉ biết rằng đều có một button (vật lý hoặc cảm ứng) để thực hiện cuộc gọi. Nhìn thì tưởng giống abstraction nhưng lại không phải vậy, cần phân biệt rõ 2 tính chất này:

  • Abstraction nói đến việc một object có thể làm được gì.
  • Encapsulation nói về việc làm thế nào để một object làm được chức năng đó và data hiding che giấu cách làm đó đi.

Khi kết hợp encapsulation và abstraction, nó đem đến một lợi ích tuyệt vời. Chúng ta có thể thay đổi cách thức hoạt động của object một cách an toàn mà không làm ảnh hưởng đến các phần khác của application. Nếu cần thay đổi một vài logic hoặc validation liên quan đến requestCookie, chỉ cần update method đó. Thậm chí requestCookie có thể tương tác với nhiều attribute khác nữa mà client không cần quan tâm và không phải sửa code.

Mỗi ngôn ngữ sẽ có những level data hiding khác nhau, với Java là các access modifier như private, package private, protected, public. Rule chung là hide data nhiều nhất có thể.

Không đi đâu mà vội, đón chờ phần sau sẽ tìm hiểu về 2 tính chất còn lại nhé:

  • Inheritance.
  • Polymorphism.



 
Copyright© Đại học Duy Tân 2010 - 2024