DANH MỤC TÀI LIỆU
Những điều cần biết về lập trình hướng đối tượng
Nh ng đi u c n bi t v l p trình h ng đ i t ng ế ề ậ ướ ượ
L p trình h ng đ i t ng (OOP) là m t trong nh ng k thu t l p trình ướ ố ượ ậ ậ
r t quan tr ng hi n nay. Nó đ c áp d ng h u h t các ng d ng th c t ượ ở ầ ế ế
xây d ng t i các doanh nghi p. H u h t các ngôn ng l p trình và ế ữ ậ
framework l p trình ph bi n hi n nay nh Java, PHP, .NET, ruby đ u h ổ ế ư
tr l p trình h ng đ i t ng. Các l p trình viên đa ph n đã đ c h c v ợ ậ ướ ượ ượ
l p trình h ng đ i t ng tr ng đ i h c nh ng các nguyên lý c b n ướ ố ượ ườ ạ ư ơ
c a l p trình h ng đ i t ng đôi khi l i không n m rõ d n đ n s d ng ướ ượ ế ử ụ
sai, không đúng tri t lý c a l p trình h ng đ i t ng.ế ướ ố ượ
Trong bài vi t này, tôi s tóm l c l i các nguyên lý c b n c a l p trình ế ượ ơ ả
h ng đ i t ng nh m giúp các b n có đ c m t cái nhìn t ng quát v ướ ố ư ượ
OOP cũng nh cách áp d ng nó.ư ụ
L p trình h ng đ i t ng là gì? L p trình h ng đ i t ng là m t k ướ ố ượ ướ ố ượ
thu t l p trình cho phép l p trình viên t o ra các đ i t ng trong code tr u ậ ậ ố ượ
t ng hóa các đ i t ng th c t trong cu c s ng. H ng ti p c n này ượ ố ượ ế ướ ế
hi n đang r t thành công và đã tr thành m t trong nh ng khuôn m u phát ệ ấ
tri n ph n m m, đ c bi t là các ph n m m cho doanh nghi p. ầ ề ầ ề
Khi phát tri n ng d ng s d ng OOP, chúng ta s đ nh nghĩa các l p ể ứ ử ụ ẽ ị
(class) đ mô hình các đ i t ng th c t . Trong ng d ng các l p này s ố ượ ế
đ c kh i t o thành các đ i t ng và trong su t th i gian ng d ng ch y, ượ ở ạ ố ượ
các ph ng th c (method) c a đ i t ng này s đ c g i.ươ ượ ẽ ượ
L p đ nh nghĩa đ i t ng s nh th nào: g m nh ng ph ng th c và ố ượ ư ế ươ
thu c tính (property) gì. M t đ i t ng ch là m t th hi n c a l p. Các ố ượ
l p t ng tác v i nhau b i các public API: là t p các ph ng th c, thu c ớ ươ ươ
tính public c a nó.
L p và đ i t ng ố ượ
OOP có 3 nguyên lý c b n chúng ta s cùng tìm hi u chi ti t sau đây đó là:ơ ả ế
Tính đóng gói (Encapsulation)
Tính đóng gói t c là quy t c yêu c u tr ng thái bên trong c a m t đ i ộ ố
t ng đ c b o v và tránh truy c p đ c t code bên ngoài (t c là code ượ ượ ượ ừ
bên ngoài không th tr c ti p nhìn th y và thay đ i tr ng thái c a đ i ể ự ế
t ng đó). B t c truy c p nào t i tr ng thái bên trong này b t bu c ph i ượ ấ ứ
thông qua m t public API đ đ m b o tr ng thái c a đ i t ng luôn h p l ể ả ượ
b i vì các public API ch u trách nhi m th c hi n ki m tra tính h p l cũng ợ ệ
nh trình t c p nh t tr ng thái c a đ i t ng đó.ư ự ậ ượ
Nói chung tr ng thái đ i t ng không h p l th ng do: ch a đ c ki m ố ượ ườ ư ượ
tra tính h p l , các b c th c hi n không đúng trình t ho c b b qua nên ướ ị ỏ
trong OOP có m t quy t c quan tr ng c n nh đó là ph i luôn khai báo các ọ ầ
tr ng thái bên trong c a đ i t ng là private và ch cho truy c p qua các ố ượ
public/protected method/property. Khi s d ng các đ i t ng ta không c n ử ụ ượ
bi t bên trong nó làm vi c nh th nào, ta ch c n bi t các public API là gì ế ư ế ỉ ầ ế
và đi u này đ m b o nh ng gì thay đ i đ i t ng s đ c ki m tra b i ư ẽ ượ
các quy t c logic bên trong, tránh đ i t ng b s d ng không chính xác. ượ ị ử
Nguyên lý đóng gói nh th này đâu ta cũng có th b t g p ví d nh ư ế ể ắ ư
thi t k viên thu c, chúng ta ch bi t nó ch a b nh này, b nh kia và m t sế ế ế ộ ố
thành ph n chính còn c th bên trong nó có nh ng gì thì hoàn toàn không ụ ể
bi t.ế
Tính k th a (Inheritance)ế ừ
Khi b t đ u xây d ng ng d ng chúng ta s b t đ u vi c thi t k các l p, ắ ầ ắ ầ ế ế
thông th ng chúng ta s th y có tr ng h p m t s l p d ng nh ườ ư ố ớ ườ ư
quan h v i nh ng l p khác, chúng có nh ng đ c tính khá gi ng nhau. VD: ệ ớ
3 l p AndroidPhone, IPhone, WindowsPhone
M i l p đ u đ i di n cho m t lo i smartphone khác nhau nh ng l i có ỗ ớ ư
nh ng thu c tính gi ng nhau. Thay vì sao chép nh ng thu c tính này, s ữ ộ ữ ộ
hay h n n u ta đ t chúng m t n i có th dùng b i nh ng l p khác. Đi u ơ ế ở ộ ơ
này đ c th c hi n b i tính k th a trong OOP: chúng ta có th đ nh nghĩaượ ế ể ị
l p cha – base class (trong tr ng h p này là Smartphone ) và có nh ng l p ườ ữ ớ
con k th a t nó (derived class), t o ra m t m i quan h cha/con.ế ừ ừ
Bây gi , các l p con có th k th a 3 thu c tính t l p cha. N u các ch c ế ừ ớ ế
năng c a l p cha đã đ c đ nh nghĩa đ y đ thì l p trình viên s không ủ ớ ượ
ph i làm b t c vi c gì l p con. Còn n u m t l p con mu n ch c năng ở ớ ế
khác so v i đ nh nghĩa l p cha thì nó có th ghi đè (override) ch c năng ở ớ
đã đ c đ nh nghĩa trên l p cha này.ượ ị
Tính đa hình (Polymorphism)
V i đa s l p trình viên thì tính K th a và Đóng gói trong OOP khá d ố ậ ế
hi u còn tính Đa hình khi m i ti p c n s th y khó hi u h n m t chút. Tuy ế ẽ ấ ơ
nhiên đây l i là m t tính ch t có th nói là ch a đ ng h u h t s c m nh ế ứ
c a l p trình h ng đ i t ng. Hi u m t cách đ n gi n: Đa hình là khái ướ ố ượ ơ
ni m mà hai ho c nhi u l p có nh ng ph ng th c gi ng nhau nh ng có ề ớ ươ ư
th th c thi theo nh ng cách th c khác nhau.ể ự
Ví d nh ph n trên, m i m t smartphone k th a t l p Smartphone ư ở ế
nh ng có th l u tr d li u trên cloud theo nh ng cách khác nhau:ư ể ư
AndroidPhone l u tr b ng Google Drive Iphone l u trên iCloud ư ữ ằ ư
WindowsPhone s d ng SkyDrive.ử ụ
B i vì t t c đ u là Smartphone nên n u ta vi t m t hàm dùng ki u ả ề ế ế
Smartphone làm tham s thì khi g i hàm ta có th truy n vào m t đ i ộ ố
t ng ki u AndroidPhone, Iphone ho c WindowsPhone b i vì chúng đ u ượ ể
k th a t l p Smartphone nên đ c ch p nh n (hi u nôm na m t ế ừ ớ ượ
AndroidPhone, Iphone, WindowsPhone cũng là m t Smartphone). Bên c nh ộ ạ
đó hàm này th m chí không c n quan tâm smartphone nào đ c truy n vào ượ ề
do nó ch c n bi t đ i t ng đang x đây là Smartphone v i nh ng ỉ ầ ế ượ
public method/property đã đ c đ nh nghĩa. N u các l p con không đ nh ượ ị ế
nghĩa l i (overrides) ph ng th c CloudStore() thì ph ng th c ươ ứ ươ ứ
CloudStore() trên l p cha (Smartphone) s đ c g i. Còn n u l p con ẽ ượ ế
override l i ph ng th c CloudStore() c a l p cha nh hình trên thì ươ ư ở
ph ng th c CloudStore() trên l p con s đ c g i m c dù code trong hàmươ ẽ ượ
đang thao tác v i đ i t ng ki u Smartphone. ố ượ
Tính Đa hình nh trên là m t tính ch t r t m nh m b i vì nó mang l i choư ẽ ở
code kh năng t ng quát hóa cao. Chúng ta không c n t o ra ph ng th c ầ ạ ươ
cho m i ki u k th a t l p cha Smartphone mà ch c n nh n m t bi n ế ừ ớ ế
ki u Smartphone và có th làm vi c v i b t c l p nào k th a t nó. ớ ấ ế ừ
Đi u duy nh t không làm đ c đây là s d ng nh ng ph ng th c ượ ụ ữ ươ
ch đ c khai báo trên các l p con. VD: n u ta có m t ph ng th c trên ỉ ượ ế ươ
l p IPhone g i là OpenSiri() nh ng không đ c khai báo trên l p ớ ọ ư ượ
Smartphone, khi đó mu n g i nó s b t bu c ph i ép ki u t Smartphone ẽ ắ
sang IPhone tr c khi g i.ướ ọ
Interface
Đa hình d a trên K th a không ph i bao gi cũng là l a ch n t t nh t. Ta ế ừ ọ ố
th y rõ ràng r ng 3 l p bên d i (Iphone, Laptop, FingerprintScanner) đ u ằ ớ ướ
là nh ng th có th truy c p đ c b ng vân tay nh ng chúng th c hi n ượ ằ ư
theo nh ng cách khác nhau. Nh ng l p này có chung m t hành đ ng t m ữ ớ ộ ạ
g i là đ nh danh b ng sinh tr c h c – BiometricAuth(). N u ta c g ng g p ế ố ắ
c 3 l p này vào thành 1 l p chung s không hay vì r t khó đ tìm ra đi m ả ớ
chung t ng quát c a chúng ngoài vi c có th truy c p b ng vân tay. ậ ằ
Do v y thay vì s d ng K th a đây, ta có th s d ng m t k thu t ử ụ ế ử ụ
khác đó là Interface. Interface đ n gi n là m t giao c ch ra r ng code ơ ả ướ
c a b n s th c thi và h tr m t public API c th nào đó. Tuy nhiên các ẽ ự ợ ộ ụ ể
public API này đ c th c hi n nh th nào thì không đ c ch ra trên ượ ư ế ượ
Interface mà s đ c ch ra trên l p th c thi interface này. V c b n giao ượ ề ơ
c là m t danh sách các public method/property mà ch c ch n s đ c ướ ẽ ượ
th c thi trong l p c a b n. ớ ủ ạ
Áp vào VD trên, ta có th t o ra m t interface là IBiometricAuth v i m t ể ạ
ph ng th c là BiometricAuth(). Ti p theo cho các l p Iphone, Laptop, ươ ứ ế
FingerprintScanner th c thi interface IBiometricAuth này nh hình sauự ư
Vì m i l p trên đ u th c thi interface IBiometricAuth nên ta có th đ m ể ả
bào r ng chúng đ u có ph ng th c BiometricAuth() và khai báo c a ươ ứ
ph ng th c s gi ng y nh đ c đ nh nghĩa trên interface ươ ư ượ
IBiometricAuth. T ng t K th a d a trên Đa hình, s d ng Interface choươ ế ử ụ
phép chúng ta khai báo ph ng th c nh n tham s ki u IBiometricAuth ươ ố ể
nh ng ch p nh n b t c đ i t ng nào truy n vào mà ki u c a nó th c thiư ứ ố ượ
interface IBiometricAuth này. Các l p th c thi IBiometricAuth không c n ớ ự
ph i có chung l p cha ngo i tr interface IBiometricAuth. Trong ph ng ạ ừ ươ
th c trên, ta có th g i b t c ph ng th c nào đã đ c đ nh nghĩa trên ứ ở ươ ư
interface IBiometricAuth c a đ i t ng truy n vào mà không c n quan tâm ố ượ
ki u th c s c a nó là gì: Không c n quan tâm nó là Iphone, Laptop hay ự ủ
FingerprintScanner, ch c n bi t nó h tr interface IBiometricAuth là có ỉ ầ ế
th g i đ c ph ng th c BiometricAuth(), h t s c linh ho t và m m ể ọ ượ ươ ế
d o.
Tóm l i
Trong bài vi t này tôi đã tóm l c l i 3 nguyên lý c b n c a l p trình ế ượ ơ ả
h ng đ i t ng sao cho đ n gi n và d hi u nh t. M c dù chúng r t c ướ ố ượ ơ ơ
b n và h u nh ai h c v l p trình cũng đã t ng đ c h c ho c đ c ư ọ ề ượ ọ ặ ọ
nh ng hy v ng bài vi t này s mang đ n m t đi u gì đó d dàng ti p c n ư ế ế ế ậ
h n cho các b n, nh t là nh ng l p trình viên m i ti p c n OOP. Hãy chia ơ ớ ế
s ph n h i c a b n v bài vi t và share cho b n bè n u b n th y nó h u ẻ ả ồ ạ ề ế ế ạ
ích nhé. N u b n có câu h i gì xin vui lòng comment d i bài vi t đ ế ướ ế ể
chúng ta cùng th o lu n.ả ậ
thông tin tài liệu
Tài liệu đưa ra những lý thuyết cơ bản về lập trình hướng đối tượng giúp bạn hiểu rõ hơn về vấn đề này
Mở rộng để xem thêm
xem nhiều trong tuần
yêu cầu tài liệu
Giúp bạn tìm tài liệu chưa có

LÝ THUYẾT TOÁN


×