Typescript-Cuộc phiêu lưu với OOP (phần 2)

phần trước …, à mà thôi !!! các bạn tự mở phần trước ra mà xem nhé ?

Bài viết này, mình xin chia sẻ một chút kinh nghiệm và hiểu biết về tính đóng gói (Encapsulation), một tuyệt kỹ ẩn thân của lập trình OOP. Nói về Encapsulation thì đa phần các bạn sinh viên lần đầu học qua cũng cảm thấy nó vô cùng đơn giản và dễ hiểu, tuy nhiên không phải vì thế mà các bạn biết áp dụng nó một cách đúng đắn đâu nhé. Mình từng thấy nhiều Dev khi mới vào đời sử dụng thuộc tính private một cách vô tội vạ, khi hỏi thì bảo là để cho nó “bảo mật” nhưng không hiểu rằng đôi khi như vậy sẽ làm cho code của chúng ta trở nên phức tạp hơn. Dưới đây là một số kinh nghiệm mà mình đúc kết được, những ví dụ thì chắc chắn vẫn sử dụng Typescript nhé. Let’s go…

1. Khẩu quyết

Tính đóng gói (encapsulation) và che giấu thông tin (information hiding): Tính chất này không cho phép người sử dụng các đối tượng thay đổi trạng thái nội tại của một đối tượng. Chỉ có các phương thức nội tại của đối tượng cho phép thay đổi trạng thái của nó. Việc cho phép môi trường bên ngoài tác động lên các dữ liệu nội tại của một đối tượng theo cách nào là hoàn toàn tùy thuộc vào người viết mã. Đây là tính chất đảm bảo sự toàn vẹn của đối tượng.

Đó là wikipedia nó nói thế, còn với mình thì đơn giản hơn: Hay tưởng tượng bạn là một anh chàng “sửa ống nước” (class) có rất nhiều đồ nghề như “cờ lê tua vít” (properties), một hôm nọ chị hàng xóm qua mượn bạn cái “cờ lê”, thay vì bảo chị hàng xóm cứ tự nhiên vào lục lọi, bạn sẽ bảo: “Ấy chị cứ ở nhà, để em mang cái cờ lê (method) qua cho chị”. Đấy chỉ đơn giản thế thôi, chị hàng xóm vừa được mượn cái cờ lê, mà bạn cũng không bị chị ấy qua tận nhà dòm ngó, lại còn đảm bảo chị ấy không trả nhầm cái cờ lê của thằng hàng xóm khác.

Encapsulation thật là tuyệt vời ?, vậy với Typescript chúng ta sẽ làm thế nào để hiện thực hóa nó?

2. Cùng nhau luyện tập nào!

Trước hết để dùng được encapsulation, bạn phải nhớ luôn 3 từ khóa này: public, privateprotected (3 thằng này còn gọi là modifiers đó) và hãy lần lượt xem mỗi từ khóa sẽ được sử dụng như thế nào.

Public là mặc định

Một class thì luôn có hoặc là thuộc tính (properties) hoặc là phương thức (methods), gọi chung là thành viên của class. Từ khóa public sẽ được đặt trước thuộc tính hoặc phương thức nhằm khai báo rằng thuộc tính hoặc phương thức ấy được tùy ý truy cập, và có thể sử dụng từ bên ngoài. Nếu bạn đã quen với các cách khai báo ở ngôn ngữ khác như C# hay Java thì từ khóa public là bắt buộc. Tuy nhiên trong Typescript thì dễ dàng hơn, mỗi thuộc tính hoặc phương thức khi không có từ khóa nào thì được hiểu mặc định là public luôn. Coi cái ví dụ dưới đây là hiểu luôn nè.

Hiểu đúng về Private

Khi một thành viên được đánh dấu là private, thành viên đó sẽ không thể truy cập được từ bên ngoài class chứa nó. Kể cả class con kế thừa.

Trong ví dụ trên, chúng ta có class Superman là class con kế thừa từ class Hero. Tuy nhiên vì thuộc tính “name” được đánh dấu là private nên Class Superman không thể sử dụng thuộc tính name này. Ngoài ra chúng ta cũng thấy, thể hiện hercules của class Hero không thể truy cập trực tiếp vào thuộc tính “name” mà phải thông qua phương thức “getName()” giống như ví dụ về anh thợ sửa ống nước ở phía trên đó.

Đứa con ghẻ protected

Mặc dù cũng là một trong 3 modifiers quan trọng, nhưng protected lại ít được các bạn Dev để ý tới hơn. Protected về công dụng thì y chang như private, chỉ có ngoại lệ là thành viên được đánh dấu protected được quyền truy cập ở các class con kế thừa từ class chứa nó.

Mặc dù chúng ta không thể sử dụng thuộc tính name bên ngoài class Person, nhưng chúng ta vẫn có thể dùng nó bên trong class Employee vì Person “đẻ ra” Employee mà.

Vậy, đó là những gì cơ bản nhất để bạn có thể vận dụng và hiện thực hóa tính chất đóng gói trong lập trình OOP với Typescript. Câu hỏi tiếp theo sẽ là “Tôi đã biết dùng rồi, tôi phải dùng thế nào thì mới là hợp lý đây?”. Và sau đâu mình xin giới thiệu đến phần hay nhất của bài này ?

3. Kinh nghiệm vận dụng encapsulation

Kinh nghiệm 1: Dùng để validate lại tính đúng đắn của các thuộc tính.

Kinh nghiệm 2: Dùng để giới hạn người truy cập

Kinh nghiệm 3: Dữ liệu của đổi tượng chỉ được khai báo trong lần khởi tạo đầu tiên.

Trong thực tế, có rất nhiều trường hợp khi khởi tạo một đối tượng, chúng ta muốn dữ liệu của của đối tượng đó không thể thay đổi ngoại trừ lần khởi tạo đầu tiên. Ví dụ như tên và số CMND của một người thì “thường” sẽ là duy nhất kể từ khi khai sinh và làm CMND. Để ràng buộc điều đó thì áp dụng tính đóng gói là hợp lý nhất rồi.

Kinh nghiệm 4: Dùng để che dấu đi những phương thức phức tạp, hoặc những phương thức mang tính chất business (ví dụ giao thức chuyển tiền của ngân hàng chẳng hạn)

Ở ví dụ này, phía người sử dụng class này sẽ không cần quan tâm đến những hàm xử lý liên quan đến business, mà chỉ cần quan tâm đến hàm tranferMoney(). Điều này vừa giúp cho việc sử dụng Class trở nên đơn giản, đồng thời cũng bảo mật được những xử lý liên quan đến chuyên môn.

4. Tạm kết

Các kinh nghiệm sử dụng encapsulation thì còn nhiều lắm, điều cốt lõi là mình muốn chia sẻ là về bản chất của encapsulation trong OOP. Hiểu được nó, bạn có thể dễ dàng vẫn dụng chúng trong nhiều trường hợp khác nữa (Ví dụ như readonly modifier trong Typescript cũng mà một trường hợp được mở rộng từ “kinh nghiệm 3” ở phía trên chẳng hạn).

Đến đây, hãy đọc lại câu chuyện “Thợ sửa ống nước” và ngẫm lại xem nó có đúng không nhé ?

Đón xem phần tiếp theo: Polymorphism — Huyết kế giới hạn (20/10/2018).

Lê Xuân Quỳnh – Developer @ JANETO

TRUNG TÂM ĐÀO TẠO LẬP TRÌNH VIÊN JANETO


THÔNG TIN LIÊN HỆ

 Hotline: 0933 06 7997 – 0933267337
 Fanpage: facebook.com/laptrinhvienio
 Channel: YouTube/laptrinhvienio
 Email: tuyensinh@laptrinhvien.io
 Địa chỉ: Tầng 2, Tòa nhà The Morning Star – 57 Quốc lộ 13, Phường 26, Quận Bình Thạnh, Tp. Hồ Chí Minh.

0

Bình luận

0933 06 7997
0933 26 7337
tuyensinh@laptrinhvien.io