GIẢI THÍCH CÁC KHÁI NIỆM TRONG OOP (phần 1)


Tiếp theo các bài viết về tầm quan trọng của OOP trong lập trình, tôi sẽ tiếp tục giải thích kỹ hơn về các khái niệm có trong OOP. Tôi sẽ chỉ nói về ý tưởng, và cách thiết kế một cách hợp lý, tức là vì sao có nó và nên sử dụng nó như thế nào. Việc giới thiệu và cách viết trong từng ngôn ngữ cụ thể bạn có thể đọc được từ rất nhiều tài liệu khác có trong trường học và Internet.

OOP sẽ rất dễ hiểu nếu bạn nhìn từ góc độ cuộc sống, bạn đọc một khái niệm, tìm một ví dụ trong đời thực mô tả khái niệm đó, khi đã tìm được ví dụ bạn sẽ dễ dàng hiểu được nó.

Nhớ là các khái niệm trong OOP có sự liên hệ lẫn nhau, nên sẽ rất khó nếu bạn cố gắng học và hiểu toàn bộ từng-cái-một, cách tốt nhất là đọc toàn bộ, phần nào chưa hiểu hết cứ bỏ qua, rồi lại đọc lại toàn bộ một lần nữa, lần này bạn chỉ đọc những chỗ đã bỏ qua ở lần trước. Cứ lặp đi lặp lại như vậy, lúc nào đó bạn sẽ nghiệm ra và hiểu tất cả.

👉 Tính đóng gói (encapsulation):Tính đóng gói giúp bạn kiểm soát được việc truy cập vào các thành phần bên trong lớp, để tránh các biến này bị thay đổi một cách không mong muốn.

Trong OOP, các biến non-static (không có từ khóa static – nhớ nhắc tôi nói về static nhé 😁) được coi là các thuộc tính của một đối tượng, giá trị lưu trữ trong biến đó đại diện cho một trạng thái của thuộc tính. Mỗi thuộc tính sẽ giữ giá trị của một trạng thái nào đó của đối tượng: thuộc tính is_moving sẽ giữ giá trị là true (đang di chuyển) hay không (false – đứng im), thuộc tính speed sẽ chỉ ra vận tốc hiện tại. Hiển nhiên là khi speed > 0 thì is_moving phải bằng true, và khi is_moving bằng false, speed phải là 0. Hai trạng thái này liên hệ chặt chẽ với nhau, bạn hẳn sẽ không muốn ngồi lên một chiếc xe có đồng hồ đo vận tốc bị hư, xe đang chạy thì nó báo đứng im, xe đứng im nó lại báo đang chạy. Khi xe đang chạy thì bơm xăng sẽ được bật lên, cửa khóa lại, khi dừng lại, cửa sẽ mở ra, nhưng nếu các trạng thái is_moving hay speed bị lưu trữ sai lệch, hệ thống sẽ hoạt động sai lệch theo, và cửa có thể sẽ mở ra khi xe đang chạy 😱.

Một trong những nguyên tắc để đảm bảo tính toàn vẹn của dữ liệu, hay nói cách khác là giữ trạng thái của các đối tượng được lưu trữ một cách đúng đắn, là bạn phải có khả năng kiểm soát được ai có thể thay đổi các thuộc tính đó: một chiếc xe đạp để ngoài đường sẽ nhanh chóng bị hư so với chiếc xe đạp được cất kỹ trong nhà

❗️.Tới đây bạn đã hiểu sự cần thiết của tính đóng gói, vậy ta nên dùng nó thế nào?

👉 Quy tắc đầu tiên là càng đóng càng tốt: tức càng ít người truy cập vào được càng tốt. Trong các ngôn ngữ lập trình, thường ta có các cấp độ từ đóng tới mở như sau: private, protected, public (một số ngôn ngữ còn có thêm internal, privated protected…), bạn chỉ nên dùng protected nếu các lớp dẫn xuất (derived class) cần truy xuất tới nó, và chỉ dùng public nếu bạn muốn truy xuất đến thuộc tính/phương thức đó từ bên ngoài(từ một lớp khác).

👉 Tránh cho phép truy cập trực tiếp vào các biến: thay vì để một biến là public, bạn nên để nó là private, và cho phép các lớp khác truy cập vào nó thông qua các getter/setter, hay các property (.NET), khi thay đổi giá trị thông qua cách này, bạn hoàn toàn kiểm soát và kiểm tra được tính hợp lệ của các giá trị mới, cũng như cập nhật hoặc làm các thao tác cần thiết khác tương ứng với việc thay đổi trạng thái của đối tượng.public void SetSpeed(int newSpeed){ if (newSpeed < 0) throw new InvalidParameterException(“newSpeed”); this.speed = newSpeed; if (newSpeed > 0) this.is_moving = true; else this.is_moving = false;}(chỗ này nữa, nhớ nhắc tôi nói về this 😁)

Hãy tập thói quen viết code theo hai quy tắc trên, đừng lười, đừng bao giờ có tư tưởng: đây chỉ là một bài tập nhỏ nên để thế nào cũng được. Phải cảm thấy khó chịu khi is_moving và speed được đặt là public, khi đó bạn mới viết code tốt được.

✊ Gieo hành động, bạn sẽ gặt thói quen, gieo thói quen bạn sẽ gặt tính cách, gieo tích cách bạn sẽ gặt số phận.

One thought on “GIẢI THÍCH CÁC KHÁI NIỆM TRONG OOP (phần 1)

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s