Các nguyên lý lập trình hướng đối tượng
T? h�m nay, ?? tr? gi�p cho c�c nh�m ph�n t�ch, thi?t k? v� l?p tr�nh c�c d? �n t?i TT, t�i s? c? g?ng ??a nhi?u b�i vi?t ( s?u t?m l� ch�nh ) ?? m?i ng??i c�ng tham kh?o.
?? ngh? m?i ng??i ?�ng g�p nhi?u h?n cho chuy�n m?c n�y ?? c�ng n�ng cao chuy�n m�n. Sang n?m 2007, m?t trong nh?ng tr?ng t�m c?a ph�ng TKHT l� x�y d?ng t�i nguy�n d�ng chung ?? t�i s? d?ng c�c s?n ph?m ?� l�m t? kh�u ph�n t�ch, thi?t k? ??n l?p tr�nh.
T�i xin ??a b�i th? nh?t : C�c nguy�n l� l?p tr�nh h??ng ??i t??ngPh??ng ph�p l?p tr�nh h??ng ??i t??ng ?� ???c nghi�n c?u v� ph�t tri?n t? l�u nh?ng vi?c v?n d?ng n� nh? th? n�o cho hi?u qu? trong vi?c x�y d?ng ph?n m?m l� ?i?u v?n c�n kh� m? h? ??i v?i nhi?u ng??i. Th? n�o l� m?t ph?n m?m h??ng ??i t??ng? ?�u l� nh?ng c? s? n?n t?ng ?? x�y d?ng ???c ph?n m?m theo t? t??ng h??ng ??i t??ng ?�ng ngh?a? Trong b�i vi?t n�y, tr�nh b�y v? c�c nguy�n l� l?p tr�nh h??ng ??i t??ng. ?� l� nh?ng quy t?c ph�n t�ch thi?t k? h??ng ??i t??ng c? b?n, mang t�nh ch?t kh�i qu�t. N� ???c xem nh? "kim ch? nam" soi ???ng d?n l?i cho ch�ng ta khi ti?n h�nh ph�n t�ch thi?t k? theo t? t??ng h??ng ??i t??ng. Do l� nguy�n l� n�n n� c� t�nh tr?u t??ng cao ch? kh�ng ?i v�o chi ti?t c�ch th?c gi?i quy?t v?n ?? c? th? (vi?c hi?n th?c h�a nh?ng nguy�n l� l?p tr�nh h??ng ??i t??ng ?�i h?i ch�ng ta ph?i xem x�t ??n Design Patterns)
C�c nguy�n l� l?p tr�nh h??ng ??i t??ng (The OOP Principles)
Nguy�n l� Open-Closed
(The Open-Closed Principle)
Ph�t bi?u
C�c th?c th? ph?n m?m (h�m, ??n th?, ??i t??ng, �) n�n ???c x�y d?ng theo h??ng m? cho vi?c m? r?ng (be opened for extension) nh?ng ?�ng ??i v?i vi?c s?a ??i (be closed for modification).
N?i dung
C�c th?c th? trong m?t ph?n m?m kh�ng ??ng ri�ng l? m� c� s? g?n k?t ch?t ch? v?i nhau. Ch�ng ph?i h?p ho?t ??ng ?? c�ng nhau th?c hi?n c�c ch?c n?ng c?a ph?n m?m. Do ?�, vi?c n�ng c?p, m? r?ng m?t th?c th? n�o ?� s? ?nh h??ng ??n nh?ng th?c th? li�n quan. ?i?u n�y c� th? d?n ??n vi?c ph?i n�ng c?p, m? r?ng c? nh?ng th?c th? li�n quan ?�. V� trong th?i ??i ??y bi?n ??ng hi?n nay, vi?c ph?i th??ng xuy�n n�ng c?p, m? r?ng c�c th?c th? trong ph?n m?m l� ?i?u kh� tr�nh kh?i.
?? l�m cho qu� tr�nh b?o tr�, n�ng c?p, m? r?ng ph?n m?m di?n ra d? d�ng v� hi?u qu? h?n, c�c th?c th? ph?n m?m n�n ???c x�y d?ng tu�n theo nguy�n l� Open-Closed. ?i?u n�y c� ngh?a l� c�c th?c th? ph?n m?m n�n ???c x�y d?ng sao cho vi?c n�ng c?p, m? r?ng ??ng ngh?a v?i vi?c th�m v�o nh?ng c�i m?i ch? kh�ng ph?i l� thay ??i nh?ng c�i hi?n c�, t? ?� tr�nh ???c vi?c ph?i thay ??i c�c th?c th? li�n quan.
X�t v� d? m?t ?o?n ch??ng tr�nh v? ???ng th?ng v� h�nh ch? nh?t b?ng C#.
public enum ShapeType
{
LINE,
RECTANGLE
}
public abstract class Shape
{
public abstract ShapeType getType();
}
public class Line: Shape
{
public override ShapeType getType()
{
return ShapeType.LINE;
}
public void drawLine()
{
// Draws the line...
}
}
public class Rectangle: Shape
{
public override ShapeType getType()
{
return ShapeType.RECTANGLE;
}
public void drawRectangle()
{
// Draws the rectangle...
}
}
public void draw(ArrayList shapeList)
{
Line line;
Rectangle rectangle;
foreach (Shape s in shapeList)
switch (s.getType())
{
case ShapeType.LINE:
line = (Line)s;
line.drawLine();
break;
case ShapeType.RECTANGLE:
rectangle = (Rectangle)s;
rectangle.drawRectangle();
break;
}
}
?o?n ch??ng tr�nh tr�n ho?t ??ng r?t t?t cho ??n khi c� s? n�ng c?p, m? r?ng. Gi? s? ch�ng ta c?n n�ng c?p, m? r?ng ?o?n ch??ng tr�nh tr�n ?? n� c� th? v? th�m ???c h�nh tr�n. L�c b?y gi? ta ph?i ch?nh s?a l?i h�m �draw�, th�m v�o m?t tr??ng h?p v? h�nh tr�n. V� trong nhi?u t�nh hu?ng, vi?c ch?nh s?a h�m �draw� s? d?n ??n vi?c ch?nh s?a nh?ng h�m kh�c li�n quan. H�m �draw� ???c vi?t theo c�ch n�y ???c n�i l� kh�ng tu�n th? nguy�n l� Open-Closed.
?? ?o?n ch??ng tr�nh tr�n tu�n th? nguy�n l� Open-Closed, ch�ng ta s? d?ng t�nh ?a h�nh c?a l?p tr�nh h??ng ??i t??ng.
public abstract class Shape
{
public abstract void draw();
}
public class Line: Shape
{
public override void draw()
{
// Draws the line...
}
}
public class Rectangle: Shape
{
public override void draw()
{
// Draws the rectangle...
}
}
class Circle: Shape
{
public override void draw()
{
// Draws the circle...
}
}
public void draw(ArrayList shapeList)
{
foreach (Shape s in shapeList)
s.draw();
}
V?i ?o?n ch??ng tr�nh tr�n, khi th�m m?t h�nh m?i v�o, ch�ng ta ch? vi?c th�m l?p ??i t??ng cho h�nh ?� (k? th?a t? Shape) m� kh�ng c?n ph?i ch?nh s?a l?i h�m �draw�. N� v?n ho?t ??ng t?t v?i nh?ng h�nh m?i th�m v�o.
Ghi ch�
i) Kh�ng ph?i l�c n�o t?t c? c�c th?c th? trong ph?n m?m ??u c� th? tu�n th? nguy�n l� Open-Closed. Nh?ng m?c ti�u c?a ph�n t�ch thi?t k? h??ng ??i t??ng l� ph?i l�m sao cho s? l??ng c�c th?c th? tu�n th? nguy�n l� l� l?n nh?t, trong ?� ?u ti�n c�c th?c th? th??ng xuy�n ph?i n�ng c?p, m? r?ng th?a nguy�n l�.
ii) Vi?c tu�n th? nguy�n l� Open-Closed c?a m?t th?c th? ph?n m?m ch? mang t�nh t??ng ??i, ph? thu?c v�o ng? c?nh. C� th? trong ng? c?nh n�y, th?c th? th?a nguy�n l�, nh?ng trong m?t ng? c?nh kh�c, th?c th? n�y kh�ng c�n tu�n th? nguy�n l� n?a. M?c ti�u c?a ph�n t�ch thi?t k? h??ng ??i t??ng l� ph?i l�m sao cho c� nhi?u th?c th? ph?n m?m nh?t tu�n th? nguy�n l� trong ng? c?nh th??ng x?y ra nh?t c?a ph?n m?m, trong ?� ?u ti�n c�c th?c th? th??ng xuy�n ph?i n�ng c?p, m? r?ng th?a nguy�n l�.
V� d? tr??ng h?p h�m �draw� nh? trong ?o?n ch??ng tr�nh v? h�nh tr�n.
public void draw(ArrayList shapeList)
{
foreach (Shape s in shapeList)
s.draw();
}
H�m �draw� ch? th?a nguy�n l� trong ng? c?nh n�ng c?p m? r?ng l� �th�m h�nh m?i�. N?u ch�ng ta c?n n�ng c?p, m? r?ng theo h??ng thay ??i th? t? v? c�c h�nh th� h�m �draw� nh? tr�n l� kh�ng th? ?�p ?ng ???c. Khi ?� n� kh�ng c�n tu�n th? nguy�n l� n?a.
iii) M?t t�nh ch?t quan tr?ng trong l?p tr�nh h??ng ??i t??ng gi�p cho c�c th?c th? ph?n m?m t?ng kh? n?ng tu�n th? nguy�n l� Open-Closed l� t�nh ?�ng g�i (encapsulation). ??i t??ng n?m gi? th�ng tin v� ch?u tr�ch nhi?m tr�n th�ng tin m�nh n?m gi?. ?i?u n�y gi�p h?n ch? s? k?t d�nh (coupling) gi?a c�c l?p ??i t??ng v?i nhau. Tr??ng h?p l� t??ng l� t?t c? thu?c t�nh c?a ??i t??ng ???c ??t t?m v?c private. vi?c thay ??i tr�n thu?c t�nh ch? c� th? ???c th?c hi�n th�ng qua nh?ng x? l� c?a ph??ng th?c. Nh?ng ph??ng th?c c?a ??i t??ng kh�c, k? c? ??i t??ng k? th?a kh�ng th? truy xu?t ???c ??n nh?ng thu?c t�nh n�y.
iv) Vi?c h?n ch? s? d?ng �p ki?u ??ng (runtime type-casting) trong c�c th?c th? ph?n m?m c?ng s? gi�p l�m t?ng kh? n?ng tu�n th? nguy�n l� Open-Closed c?a ch�ng. V� b?n ch?t c?a vi?c �p ki?u ??ng l� l�m vi?c v?i m?t ki?u d? li?u c? th?. Khi mu?n n�ng c?p, m? r?ng th?c th? ?? n� c� th? l�m vi?c v?i nh?ng ki?u d? li?u kh�c, ?o?n ch??ng tr�nh s? d?ng �p ki?u ??ng ph?i ???c thay ??i ?? c� th? l�m vi?c ???c v?i c�c ki?u d? li?u kh�c n�y.
public void doSomething(Vehicle vehicle)
{
Car car = (Car)vehicle;
car.run();
car.stop();
}
Khi c?n n�ng c?p, m? r?ng ?? ?o?n ch??ng tr�nh tr�n c� th? l�m vi?c ???c v?i c�c l?p ??i t??ng kh�c k? th?a t? �Vehicle�, ch�ng ta ph?i ch?nh s?a l?i n�.
� ngh?a
Nguy�n l� Open-Closed l� nguy�n l� c?t l�i v� l� m?t trong b?n nguy�n l� c? b?n l�m n?n t?ng cho ph�n t�ch thi?t k? h??ng ??i t??ng. N� gi�p cho ph?n m?m d? b?o tr�, n�ng c?p v� m? r?ng.
Nguy�n l� Ngh?ch ??o ph? thu?c
(The Dependency Inversion Principle) Ph�t bi?u
C�c th�nh ph?n trong ph?n m?m kh�ng n�n ph? thu?c v�o nh?ng c�i ri�ng, c? th? (details) m� ng??c l?i n�n ph? thu?c v�o nh?ng c�i chung, t?ng qu�t (abstractions) c?a nh?ng c�i ri�ng, c? th? ?�.
Nh?ng c�i chung, t?ng qu�t (abstractions) kh�ng n�n ph? v�o nh?ng c�i ri�ng, c? th? (details). S? ph? thu?c n�y n�n ???c ??o ng??c l?i.
N?i dung
Nh?ng c�i chung, t?ng qu�t l� t?p h?p c?a nh?ng ??c t�nh chung nh?t t? nh?ng c�i ri�ng, c? th?. Nh?ng c�i ri�ng, c? th? d� kh�c nhau th? n�o ?i n?a c?ng ??u tu�n theo c�c quy t?c chung m� c�i chung, t?ng qu�t c?a n� ?� ??nh ngh?a. Nh?ng c�i chung, t?ng qu�t l� nh?ng c�i �t thay ??i v� �t bi?n ??ng. Trong khi ?�, s? thay ??i l?i th??ng xuy�n x?y ra ? nh?ng c�i ri�ng, c? th?. Vi?c ph? thu?c v�o nh?ng c�i chung, t?ng qu�t s? gi�p cho c�c th�nh ph?n trong ph?n m?m tr? n�n linh ??ng (flexible) v� th�ch ?ng t?t v?i s? thay ??i th??ng xuy�n di?n ra ? nh?ng c�i ri�ng, c? th?. Khi ph? thu?c v�o nh?ng c�i chung, t?ng qu�t, c�c th�nh ph?n trong ph?n m?m v?n c� th? ho?t ??ng t?t m� kh�ng c?n ph?i s?a ??i m?t khi c�i ri�ng, c? th? ???c thay th? b?ng m?t c�i ri�ng, c? th? kh�c c�ng lo?i.
L?y v� d? ?o?n ch??ng tr�nh ??c d? li?u t? b�n ph�m v� xu?t ra m�y in.
public void copy()
{
Keyboard keyboard = new Keyboard();
Printer printer = new Printer();
char c;
while ((c = keyboard.read()) != �q�)
printer.write(c);
}
Khi n�ng c?p, m? r?ng ?o?n ch??ng tr�nh tr�n ?? n� c� th? xu?t d? li?u ra m�y in ho?c t?p tin th� ch�ng ta ph?i ch?nh s?a l?i ?o?n ch??ng tr�nh tr�n nh? sau.
public void copy(OutputType type)
{
Keyboard keyboard = new Keyboard();
Printer printer = new Printer();
File file = new File();
char c;
while ((c = keyboard.read()) != �q�)
if (type == OutputType.PRINTER)
printer.write(c);
else if (type == OutputType.FILE)
file.write(c);
}
R� r�ng h�m �copy� nh? tr�n ?� vi ph?m nguy�n l� Open-Closed do khi m?i l?n c?n th�m m?t thi?t b? ??c ghi m?i v�o, ch�ng ta ph?i ch?nh s?a l?i n�. Nguy�n nh�n l�m cho h�m �copy� vi ph?m nguy�n l� Open-Closed l� do n� l�m vi?c v?i t?ng thi?t b? ??c ghi c? th?. Khi th�m m?t thi?t b? ??c ghi m?i, ch�ng ta ph?i th�m v�o h�m �copy� ?o?n l?nh ?? l�m vi?c v?i thi?t b? ??c ghi m?i. Khi ?� ch�ng ta n�i h�m �copy� vi ph?m nguy�n l� Ngh?ch ??o ph? thu?c.
?? ?o?n ch??ng tr�nh tr�n tu�n th? Nguy�n l� Ngh?ch ??o ph? thu?c, t? ?� tu�n th? Nguy�n l� Open-Closed, ch�ng ta ph?i cho n� l�m vi?c v?i thi?t b? ??c ghi t?ng qu�t.
public void copy(Reader reader, Writer writer)
{
char c;
while ((c = reader.read()) != �q�)
writer.write(c);
}
H�m �copy� nh? tr�n c� th? l�m vi?c t?t v?i b?t k? thi?t b? ??c ghi n�o tu�n th? interface c?a Reader v� Writer. Khi c?n th�m thi?t b? ??c ghi m?i, ch�ng ta ch? vi?c th�m l?p ??i t??ng k? th?a t? Reader ho?c Writer m� kh�ng ph?i ch?nh s?a l?i h�m �copy�.
Tr�ch l?i Allen Holub: �The more abstraction you add, the greater the flexibility. In today�s business environment, where requirements regularly change as program develops, this flexibility is essential.�.
Ch� �
i) Nguy�n l� Ngh?ch ??o ph? thu?c c� m?i li�n h? m?t thi?t v?i nguy�n l� Open-Closed. M?t khi nguy�n l� Ngh?ch ??o ph? thu?c b? vi ph?m, c� ngh?a l� nh?ng th�nh ph?n trong ph?n m?m ph? thu?c v�o nh?ng c�i ri�ng, c? th?, vi?c n�ng c?p, m? r?ng ? nh?ng c�i ri�ng, c? th? (?i?u n�y r?t th??ng x?y ra) bu?c nh?ng th�nh ph?n ph? thu?c v�o n� b? thay ??i theo. ?i?u n�y d?n ??n vi ph?m nguy�n l� Open-Closed.
ii) S? ngh?ch ??o ???c ?? c?p ??n ? ?�y nh?m nh?n m?nh ??n vi?c c?n ph?i thay ??i quan ?i?m trong ph�n t�ch thi?t k? ph?n m?m. Theo l?i suy ngh? �chia ?? tr?� c?a l?p tr�nh h??ng c?u tr�c, nh?ng c�ng vi?c l?n, ph?c t?p, mang t�nh tr?u t??ng cao th??ng ???c ph�n ra th�nh nh?ng c�ng vi?c nh?, ??n gi?n v� c? th? h?n. Khi ?�, c?u tr�c ph?n m?m c� xu h??ng theo d?ng nh?ng th�nh ph?n l?n (tr?u t??ng) g?i ??n nh?ng th�nh ph?n nh? (c? th?) h?n ?? y�u c?u ch�ng th?c hi?n c�ng vi?c. ?i?u n�y th??ng l�m cho nh?ng th�nh ph?n trong ph?n m?m ph? thu?c v�o nh?ng c�i ri�ng, c? th?. Trong ph�n t�ch thi?t k? h??ng ??i t??ng, s? ph? thu?c n�y n�n ???c ??o ng??c l?i.
iii) M?t th�nh ph?n trong ph?n m?m vi ph?m nguy�n l� Ngh?ch ??o ph? thu?c s? c� t�nh t�i s? d?ng (reusability) kh�ng cao. Vi?c mang nh?ng th�nh ph?n n�y s? d?ng v�o m?t ng? c?nh kh�c v?i nh?ng c�i ri�ng, c? th? kh�c l� kh� c� th? th?c hi?n ???c n?u nh? kh�ng th?c hi?n vi?c ch?nh s?a n�o tr�n ch�ng.
iv) M?t quy ??c trong l?p tr�nh h??ng ??i t??ng gi�p cho c�c th�nh ph?n trong ph?n m?m t?ng kh? n?ng tu�n th? nguy�n l� Ngh?ch ??o ph? thu?c l� th?c hi?n vi?c truy xu?t ??n c�c ??i t??ng th�ng qua interface c?a ch�ng. ?i?u n�y s? l�m cho c�c th�nh ph?n b�n trong ph?n m?m c� t�nh linh ??ng (flexibility) cao, kh�ng ph?i s?a ??i khi thay th? c�c ??i t??ng ???c truy xu?t ??n b?ng ??i t??ng kh�c c�ng lo?i.
public void doSomething(Car car)
{
car.run();
car.stop();
}
public void doSomething(Vehicle vehicle)
{
vehicle.run();
vehicle.stop();
}
Trong hai ?o?n ch??ng tr�nh tr�n, ?o?n ch??ng tr�nh th? hai v?n l�m vi?c t?t khi ch�ng ta th�m v�o c�c ??i t??ng kh�c c�ng lo?i v?i �Car� m� k? th?a t? �Vehicle�.
� ngh?a
Nguy�n l� Ngh?ch ??o ph? thu?c c� m?i li�n h? m?t thi?t v?i nguy�n l� Open-Closed v� l� m?t trong b?n nguy�n l� c? b?n l�m n?n t?ng cho ph�n t�ch thi?t k? h??ng ??i t??ng. N� gi�p cho ph?n m?m c� t�nh t�i s? d?ng cao, linh ??ng v� b?n v?ng (robustness) tr??c nh?ng s? thay ??i.
Nguy�n l� Thay th? Liskov
(The Liskov Substitution Principle)
Ph�t bi?u
L?p B ch? n�n k? th?a t? l?p A khi v� ch? khi v?i m?i h�m F thao t�c tr�n c�c ??i t??ng c?a A, c�ch c? x? (behaviors) c?a F kh�ng thay ??i khi ta thay th? (substitute) c�c ??i t??ng c?a A b?ng c�c ??i t??ng c?a B.
N?i dung
K? th?a (inheritance) l� m?t trong nh?ng t�nh ch?t c? b?n c?a l?p tr�nh h??ng ??i t??ng. ?� l� kh? n?ng ??nh ngh?a m?t l?p ??i t??ng d?a tr�n c�c l?p ??i t??ng ?� ???c ??nh ngh?a tr??c ?�. C�c ??i t??ng c?a l?p k? th?a c� kh? n?ng c? x? (behave) nh? c�c ??i t??ng c?a l?p c? s?. ?i?u n�y c� ngh?a l� c�c ??i t??ng c?a l?p k? th?a ho�n to�n c� th? thay th? c�c ??i t??ng c?a l?p c? s? trong nh?ng h�m thao t�c tr�n c�c ??i t??ng c?a l?p c? s?.
Ch�nh v� t�nh ch?t n�y m� ch�ng ta kh�ng th? s? d?ng k? th?a m?t c�ch t�y ti?n. Gi? s? ta c� l?p A v� h�m F thao t�c tr�n c�c ??i t??ng c?a A. ?? n�ng c?p, m? r?ng ph?n m?m, ta c?n th�m v�o l?p B k? th?a t? A. Nh?ng vi?c thay th? c�c ??i t??ng c?a A b?ng c�c ??i t??ng c?a B l?i l�m cho F c? x? sai l?ch so v?i tr??c khi th?c hi?n vi?c thay th?. L�c n�y, ?? F c� th? c? x? kh�ng ??i so v?i tr??c, ta ph?i ch?nh s?a l?i F. ?i?u n�y l�m cho F vi ph?m nguy�n l� Open-Closed.
?o?n ch??ng tr�nh sau cho th?y vi?c k? th?a t�y ti?n ch? v?i m?c ?�ch t�i s? d?ng nguy hi?m nh? th? n�o.
public class Stack
{
private ArrayList data;
// More data members of stack.
public virtual void push(int n)
{
// Pushes n to stack...
}
public virtual int pop()
{
// Pops value from stack...
}
}
public class Queue: Stack
{
// Data members of Queue.
public override void push(int n)
{
// Pushes n to queue...
}
public override int pop()
{
// Pops value from queue...
}
}
public int func(Stack p)
{
p.push(5);
p.push(6);
p.push(7);
int a = p.pop();
int b = p.pop();
if (a == 7 && b == 6)
return a * b;
throw new ArgumentException();
}
V?i m?c ?�ch t�i s? d?ng l� m?t s? thu?c t�nh v� ph??ng th?c trong �Stack�, ch�ng ta cho �Queue� k? th?a t? Stack. X�t h�m �func� thao t�c tr�n ??i t??ng c?a �Stack�, do �Queue� k? th?a t? �Stack� n�n ch�ng ta ho�n to�n c� th? truy?n ??i t??ng c?a �Queue� v�o h�m n�y. Nh?ng c�ch c? x? c?a h�m �func� khi thao t�c tr�n c�c ??i t??ng c?a �Stack� v� �Queue� l� kh�c nhau. V?i c�c ??i t??ng c?a �Stack� h�m func lu�n tr? v? ch�nh x�c t�ch c?a hai s? 7 v� 6. Nh?ng v?i c�c ??i t??ng c?a �Queue� h�m func l?i lu�n g�y ra m?t exception. ?? h�m �func� c� th? c? x? tr�n c�c ??i t??ng c?a �Stack� v� �Queue� nh? nhau, ch�ng ta ph?i vi?t l?i n�. ?i?u n�y l�m cho h�m �func� vi ph?m nguy�n l� Open-Closed. Khi ?� ta n�i h�m �func� vi ph?m nguy�n l� Thay th? Liskov.
Ch� �
i) Nguy�n l� Thay th? Liskov c� m?i li�n h? m?t thi?t v?i Nguy�n l� Open-Closed. S? vi ph?m nguy�n l� Thay th? Liskov s? d?n ??n s? vi ph?m nguy�n l� Open-Closed. M?t th?c th? ph?n m?m vi ph?m nguy�n l� Thay th? Liskov s? c? x? kh�c nhau tr�n c�c ??i t??ng c?a l?p c? s? v� l?p k? th?a. ?? th?c th? ph?n m?m n�y v?n c� th? l�m vi?c t?t tr�n c�c ??i t??ng c?a c? l?p c? s? v� l?p k? th?a, ch�ng ta ph?i ch?nh s?a l?i n�. ?i?u n�y d?n ??n vi ph?m nguy�n l� Open-Closed.
ii) Kh�ng ph?i l�c n�o t?t c? c�c th?c th? trong ph?n m?m ??u c� th? tu�n th? nguy�n l� Thay th? Liskov. Nh?ng m?c ti�u c?a ph�n t�ch thi?t k? h??ng ??i t??ng l� ph?i l�m sao cho s? l??ng c�c th?c th? tu�n th? nguy�n l� l� l?n nh?t, trong ?� ?u ti�n c�c th?c th? th??ng xuy�n ph?i n�ng c?p, m? r?ng th?a nguy�n l�.
iii) Vi?c tu�n th? nguy�n l� Thay th? Liskov c?a m?t th?c th? ph?n m?m ch? mang t�nh t??ng ??i, ph? thu?c v�o ng? c?nh. C� th? trong ng? c?nh n�y, th?c th? th?a nguy�n l�, nh?ng trong m?t ng? c?nh kh�c, th?c th? n�y kh�ng c�n tu�n th? nguy�n l� n?a. M?c ti�u c?a ph�n t�ch thi?t k? h??ng ??i t??ng l� ph?i l�m sao cho c� nhi?u th?c th? ph?n m?m nh?t tu�n th? nguy�n l� trong ng? c?nh th??ng x?y ra nh?t c?a ph?n m?m, trong ?� ?u ti�n c�c th?c th? th??ng xuy�n ph?i n�ng c?p, m? r?ng th?a nguy�n l�.
iv) Quan h? �IS-A� th??ng ???c d�ng ?? ph�t hi?n k? th?a. Khi l?p ??i t??ng B v? m?t ng? ngh?a l� m?t tr??ng h?p ??c bi?t c?a l?p ??i t??ng A th� ta c� th? cho B k? th?a t? A. Nh?ng th?c t? cho th?y, trong m?t s? ng? c?nh c?a ph?n m?m, m?t l?p ??i t??ng c� quan h? �IS-A� v?i nh?ng l?p ??i t??ng kh�c nh?ng vi?c ?? n� k? th?a nh?ng l?p ??i t??ng n�y s? d?n ??n vi?c vi ph?m nguy�n l� Thay th? Liskov.
X�t ?o?n ch??ng tr�nh sau.
public class Rectangle
{
// Data members of rectangle...
// Member functions of rectangle...
}
public class Square: Rectangle
{
// Data members of square...
// Member functions of square...
}
public double doSomething(Rectangle obj)
{
obj.setWidth(5);
obj.setHeight(6);
if (obj.Area == 30)
return obj.Area;
throw new ArgumentException();
}
? ?o?n ch??ng tr�nh tr�n, m?c d� v? m?t ng? ngh?a, h�nh vu�ng l� m?t tr??ng h?p c?a h�nh ch? nh?t. ?i?u n�y ho�n to�n ?�ng!!! Nh?ng trong ng? c?nh n�y, vi?c ?? �Square� k? th?a �Rectangle� l� kh�ng ph� h?p. L�c n�y h�m �doSomething� c? x? kh�c nhau tr�n c�c ??i t??ng c?a �Rectangle� v� �Square�. Nh? v?y h�m �doSomething� ?� vi ph?m nguy�n l� Thay th? Liskov. ?? h�m �doSomething� c� th? l�m vi?c ???c tr�n c? �Rectangle� v� �Square� ch�ng ta ph?i ch?nh s?a l?i n�. Nh? v?y vi?c vi ph?m nguy�n l� Thay th? Liskov ?� l�m cho h�m �doSomething� vi ph?m nguy�n l� Open-Closed.
v) Nguy�n l� Thay th? Liskov c� m?i li�n h? m?t thi?t v?i k? thu?t �Design by Contract� ???c ?? c?p b?i Bertrand Meyers. K? thu?t n�y ch? ra r?ng: m?i ph??ng th?c trong m?t l?p ??i t??ng, khi ???c ??nh ngh?a, ?� h�m ch?a trong n� ti?n ?i?u ki?n (pre-condition) v� h?u ?i?u ki?n (post-condition). Ti?n ?i?u ki?n l� nh?ng ?i?u ki?n c?n ?? ph??ng th?c c� th? th?c hi?n ???c. H?u ?i?u ki?n l� nh?ng r�ng bu?c ph�t sinh sau khi th?c hi?n ph??ng th?c. Khi th?c hi?n vi?c k? th?a, ph??ng th?c ???c ??nh ngh?a l?i trong l?p k? th?a ph?i c� ti?n ?i?u ki?n l?ng l?o h?n (weaker) v� h?u ?i?u ki?n ch?t ch? h?n (stronger). ?i?u n�y c� ngh?a l� tr??c khi th?c hi?n, ph??ng th?c ???c ??nh ngh?a l?i trong l?p k? th?a kh�ng ???c ?�i h?i nhi?u h?n nh? khi n� ???c ??nh ngh?a trong l?p c? s?. V� sau khi th?c hi?n, ph??ng th?c ???c ??nh ngh?a l?i trong l?p k? th?a ph?i ??m b?o t?t c? nh?ng r�ng bu?c ph�t sinh nh? khi n� ???c ??nh ngh?a trong l?p c? s?. Ch? khi n�o nh?ng ?i?u tr�n ???c ?�p ?ng cho m?i ph??ng th?c trong l?p k? th?a th� l?p k? th?a m?i ???c xem l� c? x? nh? l?p c? s?. V� khi ?�, vi?c ?? n� k? th?a t? l?p c? s? m?i l� ?�ng ??n trong ng? c?nh ph?n m?m ?ang x�t.
vi) Nguy�n l� Thay th? Liskov v� k? thu?t �Design by Contract� v� t�nh l�m cho vi?c k? th?a tr? n�n r?t kh� th?c hi?n. Khi c?n th�m v�o m?t l?p k? th?a, ch�ng ta ph?i xem x�t r?t k? l??ng l?i t?t c? h�m c� thao t�c tr�n l?p c? s? xem ch�ng c� vi ph?m nguy�n l� Thay th? Liskov hay kh�ng. Ch�ng ta c?ng c?n ph?i xem x�t t?t c? c�c ph??ng th?c c?a l?p k? th?a xem ch�ng c� vi ph?m nh?ng quy ??nh c?a k? thu?t �Design by Contract� hay kh�ng. T?t c? nh?ng ?i?u n�y l� do l?p k? th?a c� m?t m?i li�n h? m?t thi?t v?i l?p c? s?. L?p k? th?a b? k?t d�nh (coupling) ch?t ch? v?i l?p c? s?. S? k?t d�nh n�y r� r�ng l�m cho ph?n m?m k�m linh ??ng (flexibility) m?t khi c� s? thay ??i x?y ra. Do ?�, ?? h?n ch? s? k?t d�nh n�y m� v?n ??m b?o ???c t�nh t�i s? d?ng, ch�ng ta ch? n�n k? th?a interface v� s? d?ng composition thay cho vi?c k? th?a.
� ngh?a
Nguy�n l� Thay th? Liskov c� m?i li�n h? m?t thi?t v?i nguy�n l� Open-Closed v� l� m?t trong b?n nguy�n l� c? b?n l�m n?n t?ng cho ph�n t�ch thi?t k? h??ng ??i t??ng. N� gi�p n�ng cao t�nh t�i s? d?ng v� b?n v?ng c?a ph?n m?m tr??c nh?ng s? thay ??i.
Nguy�n l� Ph�n t�ch interface
(The Interface Segregation)
Ph�t bi?u
Kh�ng n�n bu?c c�c th?c th? ph?n m?m ph? thu?c v�o nh?ng interface m� ch�ng kh�ng s? d?ng ??n.
N?i dung
Khi x�y d?ng m?t l?p ??i t??ng, ??c bi?t l� nh?ng l?p tr?u t??ng (abstract class), nhi?u ng??i th??ng c� xu h??ng ?? cho l?p ??i t??ng th?c hi?n c�ng nghi?u ch?c n?ng c�ng t?t, ??a th?t nhi?u thu?c t�nh v� ph??ng th?c v�o l?p ??i t??ng ?�. Nh?ng l?p ??i t??ng nh? v?y ???c g?i l� nh?ng l?p ??i t??ng c� interface b? �� nhi?m� (fat interface or polluted interface).
Khi m?t l?p ??i t??ng c� interface b? �� nhi?m�, n� s? tr? n�n c?ng k?nh. M?t th?c th? ph?n m?m n�o ?� ch? c?n th?c hi?n m?t c�ng vi?c ??n gi?n m� l?p ??i t??ng n�y h? tr? bu?c ph?i l�m vi?c v?i to�n b? interface c?a l?p ??i t??ng ?�. Vi?c ph?i truy?n ?i truy?n l?i nhi?u l?n nh?ng ??i t??ng c� interface b? �� nhi?m� s? l�m gi?m hi?u n?ng c?a ph?n m?m.
??c bi?t ??i v?i l?p tr?u t??ng c� interface b? �� nhi?m�, m?t s? l?p k? th?a ch? quan t�m ??n m?t ph?n interface c?a l?p c? s? nh?ng b? bu?c ph?i th?c hi?n vi?c c�i ??t cho c? ph?n interface kh�ng h? c� � ngh?a ??i v?i ch�ng. ?i?u n�y d?n ??n s? d? th?a kh�ng c?n thi?t trong c�c th?c th? ph?n m?m. Quan tr?ng h?n n?a, vi?c bu?c c�c l?p k? th?a ph? thu?c v�o ph?n interface m� ch�ng kh�ng s? d?ng ??n s? l�m t?ng s? k?t d�nh (coupling) gi?a c�c th?c th? ph?n m?m. M?t khi s? n�ng c?p, m? r?ng di?n ra, ?�i h?i ph?n interface ?� ph?i thay ??i, c�c l?p k? th?a n�y b? bu?c ph?i ch?nh s?a theo. ?i?u n�y l�m cho ch�ng vi ph?m nguy�n l� Open-Closed.
H�nh b�n d??i l� s? ?? l?p cho ?o?n ch??ng tr�nh t�nh ?i?n tr? m?ch ?i?n. �Resistor� v� �Lamp� l� nh?ng m?ch ?i?n ??n gi?n v?i ?i?n tr? l� m?t thu?c t�nh c?a m?ch. Trong khi �SeriesCircuit� v� �ParallelCircuit� l� nh?ng m?ch ?i?n ph?c h?p v?i ?i?n tr? c?a m?ch ???c t�nh t? c�c m?ch ?i?n con. ?? c� th? c? x? nh? nhau tr�n c�c lo?i m?ch ?i?n n�y hay n�i c�ch kh�c l� truy xu?t ??n ch�ng m?t c�ch �trong su?t� (transparency), ch�ng ta c� �Circuit� l� l?p tr?u t??ng chung ??i di?n cho c�c m?ch ?i?n kh�c nhau.
L?p �Circuit� ???c thi?t k? nh? tr�n ???c g?i l� c� interface b? �� nhi?m�. �Resistor� v� �Lamp� b? bu?c ph?i th?c hi?n vi?c c�i ??t cho c�c ph??ng th?c �add� v� �remove� ho�n to�n ch?ng c� � ngh?a g� v?i ch�ng. ?i?u n�y g�y ra s? d? th?a code kh�ng c?n thi?t c?ng nh? g�y �kh� ch?u� cho nh?ng th?c th? ph?n m?m kh�c s? d?ng �Resistor� v� �Lamp�.
Nh?ng v?n ?? ch? th?t s? x?y ra khi ch�ng ta n�ng c?p, m? r?ng ?o?n ch??ng tr�nh tr�n. Gi? s? ch�ng ta c?n th�m v�o ph??ng th?c �removeAt� ?? h? tr? vi?c x�a m?ch ?i?n con t?i v? tr� n�o ?� trong m?ch ?i?n ph?c h?p. L�c n�y, ch�ng ta ph?i th?c hi?n vi?c ch?nh s?a tr�n t?t c? c�c l?p ??i t??ng k? th?a t? �Circuit�. Vi?c ch?nh s?a tr�n �SeriesCircuit� v� �ParallelCircuit� xem ra c�n c� th? ch?p nh?n ???c. Nh?ng vi?c ph?i ch?nh s?a tr�n �Resistor� v� �Lamp� l� kh�ng th? ch?p nh?n ???c v� ph??ng th?c �removeAt� ch?ng h? c� � ngh?a g� ??i v?i ch�ng. ?i?u n�y r� r�ng l�m cho �Resistor� v� �Lamp� vi ph?m nguy�n l� Open-Closed m?t c�ch �kh�ng ch�nh ?�ng�.
Ch� �
i) Nguy�n l� Ph�n t�ch interface c� m?i li�n h? v?i nguy�n l� Open-Closed. S? vi ph?m nguy�n l� Ph�n t�ch interface c� kh? n?ng d?n ??n s? vi ph?m nguy�n l� Open-Closed (xem ph�n t�ch ? tr�n).
ii) ?? tr�nh vi ph?m nguy�n l� Ph�n t�ch Inteface, ch�ng ta n�n gi? cho interface c?a l?p ??i t??ng ??n gi?n v� g?n nh?, n�n l�m theo ti�u ch� �a class should do one thing and do it well�. Ch�ng ta kh�ng n�n ?? cho l?p ??i t??ng ??m nh?n qu� nhi?u tr�ch nhi?m v� ?i?u n�y d? l�m cho interface c?a n� b? �� nhi?m�.
iii) Interface b? �� nhi?m� c?a l?p ??i t??ng n�n ???c ph�n t�ch ngay khi c� th? ?? tr�nh kh? n?ng d?n ??n s? vi ph?m nguy�n l� Open-Closed. Vi?c ph�n t�ch interface b? �� nhi?m� c?a m?t l?p c? s? c� th? ???c th?c hi?n th�ng qua vi?c t?ng th�m m?c ?? tr?u t??ng trong c�y k? th?a c?a n�. L?p c? s? ban ??u ch? n�n c� interface ??n gi?n m� m?i l?p k? th?a c?a n� ??u c?n ph?i c�. Sau ?�, ph?n interface chung c?a m?t b? ph?n l?p k? th?a ???c t?ng h?p l?i trong m?t l?p c? s?. V� l?p c? s? n�y l?i k? th?a t? l?p c? s? ban ??u. Nh? v?y nh?ng l?p k? th?a thu?c nh�nh kh�c kh�ng b? ph? thu?c v�o ph?n interface m� ch�ng kh�ng s? d?ng ??n c?a b? ph?n l?p k? th?a kia.
V?i tr??ng h?p ?o?n ch??ng tr�nh t�nh ?i?n tr? m?ch ?i?n, ?? gi?i quy?t v?n ?? interface c?a �Circuit� b? �� nhi?m�, ch�ng ta t?ng th�m m?t m?c ?? tr?u t??ng trong c�y k? th?a c?a n�. Khi ?�, �Circuit� ?�ng vai tr� l� l?p tr?u t??ng cho c�c m?ch ?i?n kh�c nhau. N� ch? ch?a ph?n interface chung nh?t c?a t?t c? c�c m?ch ?i?n n�y. V� trong ng? c?nh b�i to�n t�nh ?i?n tr? ??n gi?n th� n� ch? ch?a ph??ng th?c �calcResistance�.
Ch�ng ta s? c� l?p �SingleCircuit� ??i di?n cho c�c m?ch ?i?n ??n gi?n v� �ComplexCircuit� ??i di?n cho c�ch m?ch ?i?n ph?c h?p. �SingleCircuit� ch?a ph?n interface chung c?a c�c m?ch ?i?n ??n gi?n nh? �Resistor� v� �Lamp� trong khi �ComplexCircuit� ch?a ph?n interface chung c?a c�c m?ch ?i?n ph?c h?p. Ch�ng ta s? c� ???c c�y k? th?a nh? h�nh b�n d??i.
L�c n�y, khi c?n th�m v�o ph??ng th?c �removeAt� ch�ng ta ch? vi?c n�ng c?p ph?n interface c?a �ComplexCircuit�, nh�nh k? th?a b�n �SingleCircuit� s? kh�ng b? ?nh h??ng.
iv) Trong m?t s? tr??ng h?p, sau khi ph�n t�ch interface, m?t s? l?p k? th?a m?i th�m v�o mu?n s? d?ng nh?ng ph?n interface ?� ph�n t�ch, ch�ng c� th? th?c hi?n vi?c ?a k? th?a t? nh?ng l?p ??i t??ng h? tr? nh?ng ph?n interface n�y ho?c c?ng c� th? k? th?a t? m?t l?p ??i t??ng h? tr? m?t ph?n interface ch�ng c?n v� th?c hi?n composition ??i v?i nh?ng ??i t??ng h? tr? ph?n interface c�n l?i.
� ngh?a
Nguy�n l� Ph�n t�ch interface c� m?i li�n h? v?i nguy�n l� Open-Closed v� l� m?t trong b?n nguy�n l� c? b?n l�m n?n t?ng cho ph�n t�ch thi?t k? h??ng ??i t??ng. N� gi�p gi?m s? c?ng k?nh, d? th?a kh�ng c?n thi?t cho ph?n m?m v� quan tr?ng h?n l� gi?m s? k?t d�nh (copuling) l�m h?n ch? t�nh linh ??ng (flexibility) c?a ph?n m?m.
?? ngh? m?i ng??i ?�ng g�p nhi?u h?n cho chuy�n m?c n�y ?? c�ng n�ng cao chuy�n m�n. Sang n?m 2007, m?t trong nh?ng tr?ng t�m c?a ph�ng TKHT l� x�y d?ng t�i nguy�n d�ng chung ?? t�i s? d?ng c�c s?n ph?m ?� l�m t? kh�u ph�n t�ch, thi?t k? ??n l?p tr�nh.
T�i xin ??a b�i th? nh?t : C�c nguy�n l� l?p tr�nh h??ng ??i t??ngPh??ng ph�p l?p tr�nh h??ng ??i t??ng ?� ???c nghi�n c?u v� ph�t tri?n t? l�u nh?ng vi?c v?n d?ng n� nh? th? n�o cho hi?u qu? trong vi?c x�y d?ng ph?n m?m l� ?i?u v?n c�n kh� m? h? ??i v?i nhi?u ng??i. Th? n�o l� m?t ph?n m?m h??ng ??i t??ng? ?�u l� nh?ng c? s? n?n t?ng ?? x�y d?ng ???c ph?n m?m theo t? t??ng h??ng ??i t??ng ?�ng ngh?a? Trong b�i vi?t n�y, tr�nh b�y v? c�c nguy�n l� l?p tr�nh h??ng ??i t??ng. ?� l� nh?ng quy t?c ph�n t�ch thi?t k? h??ng ??i t??ng c? b?n, mang t�nh ch?t kh�i qu�t. N� ???c xem nh? "kim ch? nam" soi ???ng d?n l?i cho ch�ng ta khi ti?n h�nh ph�n t�ch thi?t k? theo t? t??ng h??ng ??i t??ng. Do l� nguy�n l� n�n n� c� t�nh tr?u t??ng cao ch? kh�ng ?i v�o chi ti?t c�ch th?c gi?i quy?t v?n ?? c? th? (vi?c hi?n th?c h�a nh?ng nguy�n l� l?p tr�nh h??ng ??i t??ng ?�i h?i ch�ng ta ph?i xem x�t ??n Design Patterns)
C�c nguy�n l� l?p tr�nh h??ng ??i t??ng (The OOP Principles)
Nguy�n l� Open-Closed
(The Open-Closed Principle)
Ph�t bi?u
C�c th?c th? ph?n m?m (h�m, ??n th?, ??i t??ng, �) n�n ???c x�y d?ng theo h??ng m? cho vi?c m? r?ng (be opened for extension) nh?ng ?�ng ??i v?i vi?c s?a ??i (be closed for modification).
N?i dung
C�c th?c th? trong m?t ph?n m?m kh�ng ??ng ri�ng l? m� c� s? g?n k?t ch?t ch? v?i nhau. Ch�ng ph?i h?p ho?t ??ng ?? c�ng nhau th?c hi?n c�c ch?c n?ng c?a ph?n m?m. Do ?�, vi?c n�ng c?p, m? r?ng m?t th?c th? n�o ?� s? ?nh h??ng ??n nh?ng th?c th? li�n quan. ?i?u n�y c� th? d?n ??n vi?c ph?i n�ng c?p, m? r?ng c? nh?ng th?c th? li�n quan ?�. V� trong th?i ??i ??y bi?n ??ng hi?n nay, vi?c ph?i th??ng xuy�n n�ng c?p, m? r?ng c�c th?c th? trong ph?n m?m l� ?i?u kh� tr�nh kh?i.
?? l�m cho qu� tr�nh b?o tr�, n�ng c?p, m? r?ng ph?n m?m di?n ra d? d�ng v� hi?u qu? h?n, c�c th?c th? ph?n m?m n�n ???c x�y d?ng tu�n theo nguy�n l� Open-Closed. ?i?u n�y c� ngh?a l� c�c th?c th? ph?n m?m n�n ???c x�y d?ng sao cho vi?c n�ng c?p, m? r?ng ??ng ngh?a v?i vi?c th�m v�o nh?ng c�i m?i ch? kh�ng ph?i l� thay ??i nh?ng c�i hi?n c�, t? ?� tr�nh ???c vi?c ph?i thay ??i c�c th?c th? li�n quan.
X�t v� d? m?t ?o?n ch??ng tr�nh v? ???ng th?ng v� h�nh ch? nh?t b?ng C#.
public enum ShapeType
{
LINE,
RECTANGLE
}
public abstract class Shape
{
public abstract ShapeType getType();
}
public class Line: Shape
{
public override ShapeType getType()
{
return ShapeType.LINE;
}
public void drawLine()
{
// Draws the line...
}
}
public class Rectangle: Shape
{
public override ShapeType getType()
{
return ShapeType.RECTANGLE;
}
public void drawRectangle()
{
// Draws the rectangle...
}
}
public void draw(ArrayList shapeList)
{
Line line;
Rectangle rectangle;
foreach (Shape s in shapeList)
switch (s.getType())
{
case ShapeType.LINE:
line = (Line)s;
line.drawLine();
break;
case ShapeType.RECTANGLE:
rectangle = (Rectangle)s;
rectangle.drawRectangle();
break;
}
}
?o?n ch??ng tr�nh tr�n ho?t ??ng r?t t?t cho ??n khi c� s? n�ng c?p, m? r?ng. Gi? s? ch�ng ta c?n n�ng c?p, m? r?ng ?o?n ch??ng tr�nh tr�n ?? n� c� th? v? th�m ???c h�nh tr�n. L�c b?y gi? ta ph?i ch?nh s?a l?i h�m �draw�, th�m v�o m?t tr??ng h?p v? h�nh tr�n. V� trong nhi?u t�nh hu?ng, vi?c ch?nh s?a h�m �draw� s? d?n ??n vi?c ch?nh s?a nh?ng h�m kh�c li�n quan. H�m �draw� ???c vi?t theo c�ch n�y ???c n�i l� kh�ng tu�n th? nguy�n l� Open-Closed.
?? ?o?n ch??ng tr�nh tr�n tu�n th? nguy�n l� Open-Closed, ch�ng ta s? d?ng t�nh ?a h�nh c?a l?p tr�nh h??ng ??i t??ng.
public abstract class Shape
{
public abstract void draw();
}
public class Line: Shape
{
public override void draw()
{
// Draws the line...
}
}
public class Rectangle: Shape
{
public override void draw()
{
// Draws the rectangle...
}
}
class Circle: Shape
{
public override void draw()
{
// Draws the circle...
}
}
public void draw(ArrayList shapeList)
{
foreach (Shape s in shapeList)
s.draw();
}
V?i ?o?n ch??ng tr�nh tr�n, khi th�m m?t h�nh m?i v�o, ch�ng ta ch? vi?c th�m l?p ??i t??ng cho h�nh ?� (k? th?a t? Shape) m� kh�ng c?n ph?i ch?nh s?a l?i h�m �draw�. N� v?n ho?t ??ng t?t v?i nh?ng h�nh m?i th�m v�o.
Ghi ch�
i) Kh�ng ph?i l�c n�o t?t c? c�c th?c th? trong ph?n m?m ??u c� th? tu�n th? nguy�n l� Open-Closed. Nh?ng m?c ti�u c?a ph�n t�ch thi?t k? h??ng ??i t??ng l� ph?i l�m sao cho s? l??ng c�c th?c th? tu�n th? nguy�n l� l� l?n nh?t, trong ?� ?u ti�n c�c th?c th? th??ng xuy�n ph?i n�ng c?p, m? r?ng th?a nguy�n l�.
ii) Vi?c tu�n th? nguy�n l� Open-Closed c?a m?t th?c th? ph?n m?m ch? mang t�nh t??ng ??i, ph? thu?c v�o ng? c?nh. C� th? trong ng? c?nh n�y, th?c th? th?a nguy�n l�, nh?ng trong m?t ng? c?nh kh�c, th?c th? n�y kh�ng c�n tu�n th? nguy�n l� n?a. M?c ti�u c?a ph�n t�ch thi?t k? h??ng ??i t??ng l� ph?i l�m sao cho c� nhi?u th?c th? ph?n m?m nh?t tu�n th? nguy�n l� trong ng? c?nh th??ng x?y ra nh?t c?a ph?n m?m, trong ?� ?u ti�n c�c th?c th? th??ng xuy�n ph?i n�ng c?p, m? r?ng th?a nguy�n l�.
V� d? tr??ng h?p h�m �draw� nh? trong ?o?n ch??ng tr�nh v? h�nh tr�n.
public void draw(ArrayList shapeList)
{
foreach (Shape s in shapeList)
s.draw();
}
H�m �draw� ch? th?a nguy�n l� trong ng? c?nh n�ng c?p m? r?ng l� �th�m h�nh m?i�. N?u ch�ng ta c?n n�ng c?p, m? r?ng theo h??ng thay ??i th? t? v? c�c h�nh th� h�m �draw� nh? tr�n l� kh�ng th? ?�p ?ng ???c. Khi ?� n� kh�ng c�n tu�n th? nguy�n l� n?a.
iii) M?t t�nh ch?t quan tr?ng trong l?p tr�nh h??ng ??i t??ng gi�p cho c�c th?c th? ph?n m?m t?ng kh? n?ng tu�n th? nguy�n l� Open-Closed l� t�nh ?�ng g�i (encapsulation). ??i t??ng n?m gi? th�ng tin v� ch?u tr�ch nhi?m tr�n th�ng tin m�nh n?m gi?. ?i?u n�y gi�p h?n ch? s? k?t d�nh (coupling) gi?a c�c l?p ??i t??ng v?i nhau. Tr??ng h?p l� t??ng l� t?t c? thu?c t�nh c?a ??i t??ng ???c ??t t?m v?c private. vi?c thay ??i tr�n thu?c t�nh ch? c� th? ???c th?c hi�n th�ng qua nh?ng x? l� c?a ph??ng th?c. Nh?ng ph??ng th?c c?a ??i t??ng kh�c, k? c? ??i t??ng k? th?a kh�ng th? truy xu?t ???c ??n nh?ng thu?c t�nh n�y.
iv) Vi?c h?n ch? s? d?ng �p ki?u ??ng (runtime type-casting) trong c�c th?c th? ph?n m?m c?ng s? gi�p l�m t?ng kh? n?ng tu�n th? nguy�n l� Open-Closed c?a ch�ng. V� b?n ch?t c?a vi?c �p ki?u ??ng l� l�m vi?c v?i m?t ki?u d? li?u c? th?. Khi mu?n n�ng c?p, m? r?ng th?c th? ?? n� c� th? l�m vi?c v?i nh?ng ki?u d? li?u kh�c, ?o?n ch??ng tr�nh s? d?ng �p ki?u ??ng ph?i ???c thay ??i ?? c� th? l�m vi?c ???c v?i c�c ki?u d? li?u kh�c n�y.
public void doSomething(Vehicle vehicle)
{
Car car = (Car)vehicle;
car.run();
car.stop();
}
Khi c?n n�ng c?p, m? r?ng ?? ?o?n ch??ng tr�nh tr�n c� th? l�m vi?c ???c v?i c�c l?p ??i t??ng kh�c k? th?a t? �Vehicle�, ch�ng ta ph?i ch?nh s?a l?i n�.
� ngh?a
Nguy�n l� Open-Closed l� nguy�n l� c?t l�i v� l� m?t trong b?n nguy�n l� c? b?n l�m n?n t?ng cho ph�n t�ch thi?t k? h??ng ??i t??ng. N� gi�p cho ph?n m?m d? b?o tr�, n�ng c?p v� m? r?ng.
Nguy�n l� Ngh?ch ??o ph? thu?c
(The Dependency Inversion Principle) Ph�t bi?u
C�c th�nh ph?n trong ph?n m?m kh�ng n�n ph? thu?c v�o nh?ng c�i ri�ng, c? th? (details) m� ng??c l?i n�n ph? thu?c v�o nh?ng c�i chung, t?ng qu�t (abstractions) c?a nh?ng c�i ri�ng, c? th? ?�.
Nh?ng c�i chung, t?ng qu�t (abstractions) kh�ng n�n ph? v�o nh?ng c�i ri�ng, c? th? (details). S? ph? thu?c n�y n�n ???c ??o ng??c l?i.
N?i dung
Nh?ng c�i chung, t?ng qu�t l� t?p h?p c?a nh?ng ??c t�nh chung nh?t t? nh?ng c�i ri�ng, c? th?. Nh?ng c�i ri�ng, c? th? d� kh�c nhau th? n�o ?i n?a c?ng ??u tu�n theo c�c quy t?c chung m� c�i chung, t?ng qu�t c?a n� ?� ??nh ngh?a. Nh?ng c�i chung, t?ng qu�t l� nh?ng c�i �t thay ??i v� �t bi?n ??ng. Trong khi ?�, s? thay ??i l?i th??ng xuy�n x?y ra ? nh?ng c�i ri�ng, c? th?. Vi?c ph? thu?c v�o nh?ng c�i chung, t?ng qu�t s? gi�p cho c�c th�nh ph?n trong ph?n m?m tr? n�n linh ??ng (flexible) v� th�ch ?ng t?t v?i s? thay ??i th??ng xuy�n di?n ra ? nh?ng c�i ri�ng, c? th?. Khi ph? thu?c v�o nh?ng c�i chung, t?ng qu�t, c�c th�nh ph?n trong ph?n m?m v?n c� th? ho?t ??ng t?t m� kh�ng c?n ph?i s?a ??i m?t khi c�i ri�ng, c? th? ???c thay th? b?ng m?t c�i ri�ng, c? th? kh�c c�ng lo?i.
L?y v� d? ?o?n ch??ng tr�nh ??c d? li?u t? b�n ph�m v� xu?t ra m�y in.
public void copy()
{
Keyboard keyboard = new Keyboard();
Printer printer = new Printer();
char c;
while ((c = keyboard.read()) != �q�)
printer.write(c);
}
Khi n�ng c?p, m? r?ng ?o?n ch??ng tr�nh tr�n ?? n� c� th? xu?t d? li?u ra m�y in ho?c t?p tin th� ch�ng ta ph?i ch?nh s?a l?i ?o?n ch??ng tr�nh tr�n nh? sau.
public void copy(OutputType type)
{
Keyboard keyboard = new Keyboard();
Printer printer = new Printer();
File file = new File();
char c;
while ((c = keyboard.read()) != �q�)
if (type == OutputType.PRINTER)
printer.write(c);
else if (type == OutputType.FILE)
file.write(c);
}
R� r�ng h�m �copy� nh? tr�n ?� vi ph?m nguy�n l� Open-Closed do khi m?i l?n c?n th�m m?t thi?t b? ??c ghi m?i v�o, ch�ng ta ph?i ch?nh s?a l?i n�. Nguy�n nh�n l�m cho h�m �copy� vi ph?m nguy�n l� Open-Closed l� do n� l�m vi?c v?i t?ng thi?t b? ??c ghi c? th?. Khi th�m m?t thi?t b? ??c ghi m?i, ch�ng ta ph?i th�m v�o h�m �copy� ?o?n l?nh ?? l�m vi?c v?i thi?t b? ??c ghi m?i. Khi ?� ch�ng ta n�i h�m �copy� vi ph?m nguy�n l� Ngh?ch ??o ph? thu?c.
?? ?o?n ch??ng tr�nh tr�n tu�n th? Nguy�n l� Ngh?ch ??o ph? thu?c, t? ?� tu�n th? Nguy�n l� Open-Closed, ch�ng ta ph?i cho n� l�m vi?c v?i thi?t b? ??c ghi t?ng qu�t.
public void copy(Reader reader, Writer writer)
{
char c;
while ((c = reader.read()) != �q�)
writer.write(c);
}
H�m �copy� nh? tr�n c� th? l�m vi?c t?t v?i b?t k? thi?t b? ??c ghi n�o tu�n th? interface c?a Reader v� Writer. Khi c?n th�m thi?t b? ??c ghi m?i, ch�ng ta ch? vi?c th�m l?p ??i t??ng k? th?a t? Reader ho?c Writer m� kh�ng ph?i ch?nh s?a l?i h�m �copy�.
Tr�ch l?i Allen Holub: �The more abstraction you add, the greater the flexibility. In today�s business environment, where requirements regularly change as program develops, this flexibility is essential.�.
Ch� �
i) Nguy�n l� Ngh?ch ??o ph? thu?c c� m?i li�n h? m?t thi?t v?i nguy�n l� Open-Closed. M?t khi nguy�n l� Ngh?ch ??o ph? thu?c b? vi ph?m, c� ngh?a l� nh?ng th�nh ph?n trong ph?n m?m ph? thu?c v�o nh?ng c�i ri�ng, c? th?, vi?c n�ng c?p, m? r?ng ? nh?ng c�i ri�ng, c? th? (?i?u n�y r?t th??ng x?y ra) bu?c nh?ng th�nh ph?n ph? thu?c v�o n� b? thay ??i theo. ?i?u n�y d?n ??n vi ph?m nguy�n l� Open-Closed.
ii) S? ngh?ch ??o ???c ?? c?p ??n ? ?�y nh?m nh?n m?nh ??n vi?c c?n ph?i thay ??i quan ?i?m trong ph�n t�ch thi?t k? ph?n m?m. Theo l?i suy ngh? �chia ?? tr?� c?a l?p tr�nh h??ng c?u tr�c, nh?ng c�ng vi?c l?n, ph?c t?p, mang t�nh tr?u t??ng cao th??ng ???c ph�n ra th�nh nh?ng c�ng vi?c nh?, ??n gi?n v� c? th? h?n. Khi ?�, c?u tr�c ph?n m?m c� xu h??ng theo d?ng nh?ng th�nh ph?n l?n (tr?u t??ng) g?i ??n nh?ng th�nh ph?n nh? (c? th?) h?n ?? y�u c?u ch�ng th?c hi?n c�ng vi?c. ?i?u n�y th??ng l�m cho nh?ng th�nh ph?n trong ph?n m?m ph? thu?c v�o nh?ng c�i ri�ng, c? th?. Trong ph�n t�ch thi?t k? h??ng ??i t??ng, s? ph? thu?c n�y n�n ???c ??o ng??c l?i.
iii) M?t th�nh ph?n trong ph?n m?m vi ph?m nguy�n l� Ngh?ch ??o ph? thu?c s? c� t�nh t�i s? d?ng (reusability) kh�ng cao. Vi?c mang nh?ng th�nh ph?n n�y s? d?ng v�o m?t ng? c?nh kh�c v?i nh?ng c�i ri�ng, c? th? kh�c l� kh� c� th? th?c hi?n ???c n?u nh? kh�ng th?c hi?n vi?c ch?nh s?a n�o tr�n ch�ng.
iv) M?t quy ??c trong l?p tr�nh h??ng ??i t??ng gi�p cho c�c th�nh ph?n trong ph?n m?m t?ng kh? n?ng tu�n th? nguy�n l� Ngh?ch ??o ph? thu?c l� th?c hi?n vi?c truy xu?t ??n c�c ??i t??ng th�ng qua interface c?a ch�ng. ?i?u n�y s? l�m cho c�c th�nh ph?n b�n trong ph?n m?m c� t�nh linh ??ng (flexibility) cao, kh�ng ph?i s?a ??i khi thay th? c�c ??i t??ng ???c truy xu?t ??n b?ng ??i t??ng kh�c c�ng lo?i.
public void doSomething(Car car)
{
car.run();
car.stop();
}
public void doSomething(Vehicle vehicle)
{
vehicle.run();
vehicle.stop();
}
Trong hai ?o?n ch??ng tr�nh tr�n, ?o?n ch??ng tr�nh th? hai v?n l�m vi?c t?t khi ch�ng ta th�m v�o c�c ??i t??ng kh�c c�ng lo?i v?i �Car� m� k? th?a t? �Vehicle�.
� ngh?a
Nguy�n l� Ngh?ch ??o ph? thu?c c� m?i li�n h? m?t thi?t v?i nguy�n l� Open-Closed v� l� m?t trong b?n nguy�n l� c? b?n l�m n?n t?ng cho ph�n t�ch thi?t k? h??ng ??i t??ng. N� gi�p cho ph?n m?m c� t�nh t�i s? d?ng cao, linh ??ng v� b?n v?ng (robustness) tr??c nh?ng s? thay ??i.
Nguy�n l� Thay th? Liskov
(The Liskov Substitution Principle)
Ph�t bi?u
L?p B ch? n�n k? th?a t? l?p A khi v� ch? khi v?i m?i h�m F thao t�c tr�n c�c ??i t??ng c?a A, c�ch c? x? (behaviors) c?a F kh�ng thay ??i khi ta thay th? (substitute) c�c ??i t??ng c?a A b?ng c�c ??i t??ng c?a B.
N?i dung
K? th?a (inheritance) l� m?t trong nh?ng t�nh ch?t c? b?n c?a l?p tr�nh h??ng ??i t??ng. ?� l� kh? n?ng ??nh ngh?a m?t l?p ??i t??ng d?a tr�n c�c l?p ??i t??ng ?� ???c ??nh ngh?a tr??c ?�. C�c ??i t??ng c?a l?p k? th?a c� kh? n?ng c? x? (behave) nh? c�c ??i t??ng c?a l?p c? s?. ?i?u n�y c� ngh?a l� c�c ??i t??ng c?a l?p k? th?a ho�n to�n c� th? thay th? c�c ??i t??ng c?a l?p c? s? trong nh?ng h�m thao t�c tr�n c�c ??i t??ng c?a l?p c? s?.
Ch�nh v� t�nh ch?t n�y m� ch�ng ta kh�ng th? s? d?ng k? th?a m?t c�ch t�y ti?n. Gi? s? ta c� l?p A v� h�m F thao t�c tr�n c�c ??i t??ng c?a A. ?? n�ng c?p, m? r?ng ph?n m?m, ta c?n th�m v�o l?p B k? th?a t? A. Nh?ng vi?c thay th? c�c ??i t??ng c?a A b?ng c�c ??i t??ng c?a B l?i l�m cho F c? x? sai l?ch so v?i tr??c khi th?c hi?n vi?c thay th?. L�c n�y, ?? F c� th? c? x? kh�ng ??i so v?i tr??c, ta ph?i ch?nh s?a l?i F. ?i?u n�y l�m cho F vi ph?m nguy�n l� Open-Closed.
?o?n ch??ng tr�nh sau cho th?y vi?c k? th?a t�y ti?n ch? v?i m?c ?�ch t�i s? d?ng nguy hi?m nh? th? n�o.
public class Stack
{
private ArrayList data;
// More data members of stack.
public virtual void push(int n)
{
// Pushes n to stack...
}
public virtual int pop()
{
// Pops value from stack...
}
}
public class Queue: Stack
{
// Data members of Queue.
public override void push(int n)
{
// Pushes n to queue...
}
public override int pop()
{
// Pops value from queue...
}
}
public int func(Stack p)
{
p.push(5);
p.push(6);
p.push(7);
int a = p.pop();
int b = p.pop();
if (a == 7 && b == 6)
return a * b;
throw new ArgumentException();
}
V?i m?c ?�ch t�i s? d?ng l� m?t s? thu?c t�nh v� ph??ng th?c trong �Stack�, ch�ng ta cho �Queue� k? th?a t? Stack. X�t h�m �func� thao t�c tr�n ??i t??ng c?a �Stack�, do �Queue� k? th?a t? �Stack� n�n ch�ng ta ho�n to�n c� th? truy?n ??i t??ng c?a �Queue� v�o h�m n�y. Nh?ng c�ch c? x? c?a h�m �func� khi thao t�c tr�n c�c ??i t??ng c?a �Stack� v� �Queue� l� kh�c nhau. V?i c�c ??i t??ng c?a �Stack� h�m func lu�n tr? v? ch�nh x�c t�ch c?a hai s? 7 v� 6. Nh?ng v?i c�c ??i t??ng c?a �Queue� h�m func l?i lu�n g�y ra m?t exception. ?? h�m �func� c� th? c? x? tr�n c�c ??i t??ng c?a �Stack� v� �Queue� nh? nhau, ch�ng ta ph?i vi?t l?i n�. ?i?u n�y l�m cho h�m �func� vi ph?m nguy�n l� Open-Closed. Khi ?� ta n�i h�m �func� vi ph?m nguy�n l� Thay th? Liskov.
Ch� �
i) Nguy�n l� Thay th? Liskov c� m?i li�n h? m?t thi?t v?i Nguy�n l� Open-Closed. S? vi ph?m nguy�n l� Thay th? Liskov s? d?n ??n s? vi ph?m nguy�n l� Open-Closed. M?t th?c th? ph?n m?m vi ph?m nguy�n l� Thay th? Liskov s? c? x? kh�c nhau tr�n c�c ??i t??ng c?a l?p c? s? v� l?p k? th?a. ?? th?c th? ph?n m?m n�y v?n c� th? l�m vi?c t?t tr�n c�c ??i t??ng c?a c? l?p c? s? v� l?p k? th?a, ch�ng ta ph?i ch?nh s?a l?i n�. ?i?u n�y d?n ??n vi ph?m nguy�n l� Open-Closed.
ii) Kh�ng ph?i l�c n�o t?t c? c�c th?c th? trong ph?n m?m ??u c� th? tu�n th? nguy�n l� Thay th? Liskov. Nh?ng m?c ti�u c?a ph�n t�ch thi?t k? h??ng ??i t??ng l� ph?i l�m sao cho s? l??ng c�c th?c th? tu�n th? nguy�n l� l� l?n nh?t, trong ?� ?u ti�n c�c th?c th? th??ng xuy�n ph?i n�ng c?p, m? r?ng th?a nguy�n l�.
iii) Vi?c tu�n th? nguy�n l� Thay th? Liskov c?a m?t th?c th? ph?n m?m ch? mang t�nh t??ng ??i, ph? thu?c v�o ng? c?nh. C� th? trong ng? c?nh n�y, th?c th? th?a nguy�n l�, nh?ng trong m?t ng? c?nh kh�c, th?c th? n�y kh�ng c�n tu�n th? nguy�n l� n?a. M?c ti�u c?a ph�n t�ch thi?t k? h??ng ??i t??ng l� ph?i l�m sao cho c� nhi?u th?c th? ph?n m?m nh?t tu�n th? nguy�n l� trong ng? c?nh th??ng x?y ra nh?t c?a ph?n m?m, trong ?� ?u ti�n c�c th?c th? th??ng xuy�n ph?i n�ng c?p, m? r?ng th?a nguy�n l�.
iv) Quan h? �IS-A� th??ng ???c d�ng ?? ph�t hi?n k? th?a. Khi l?p ??i t??ng B v? m?t ng? ngh?a l� m?t tr??ng h?p ??c bi?t c?a l?p ??i t??ng A th� ta c� th? cho B k? th?a t? A. Nh?ng th?c t? cho th?y, trong m?t s? ng? c?nh c?a ph?n m?m, m?t l?p ??i t??ng c� quan h? �IS-A� v?i nh?ng l?p ??i t??ng kh�c nh?ng vi?c ?? n� k? th?a nh?ng l?p ??i t??ng n�y s? d?n ??n vi?c vi ph?m nguy�n l� Thay th? Liskov.
X�t ?o?n ch??ng tr�nh sau.
public class Rectangle
{
// Data members of rectangle...
// Member functions of rectangle...
}
public class Square: Rectangle
{
// Data members of square...
// Member functions of square...
}
public double doSomething(Rectangle obj)
{
obj.setWidth(5);
obj.setHeight(6);
if (obj.Area == 30)
return obj.Area;
throw new ArgumentException();
}
? ?o?n ch??ng tr�nh tr�n, m?c d� v? m?t ng? ngh?a, h�nh vu�ng l� m?t tr??ng h?p c?a h�nh ch? nh?t. ?i?u n�y ho�n to�n ?�ng!!! Nh?ng trong ng? c?nh n�y, vi?c ?? �Square� k? th?a �Rectangle� l� kh�ng ph� h?p. L�c n�y h�m �doSomething� c? x? kh�c nhau tr�n c�c ??i t??ng c?a �Rectangle� v� �Square�. Nh? v?y h�m �doSomething� ?� vi ph?m nguy�n l� Thay th? Liskov. ?? h�m �doSomething� c� th? l�m vi?c ???c tr�n c? �Rectangle� v� �Square� ch�ng ta ph?i ch?nh s?a l?i n�. Nh? v?y vi?c vi ph?m nguy�n l� Thay th? Liskov ?� l�m cho h�m �doSomething� vi ph?m nguy�n l� Open-Closed.
v) Nguy�n l� Thay th? Liskov c� m?i li�n h? m?t thi?t v?i k? thu?t �Design by Contract� ???c ?? c?p b?i Bertrand Meyers. K? thu?t n�y ch? ra r?ng: m?i ph??ng th?c trong m?t l?p ??i t??ng, khi ???c ??nh ngh?a, ?� h�m ch?a trong n� ti?n ?i?u ki?n (pre-condition) v� h?u ?i?u ki?n (post-condition). Ti?n ?i?u ki?n l� nh?ng ?i?u ki?n c?n ?? ph??ng th?c c� th? th?c hi?n ???c. H?u ?i?u ki?n l� nh?ng r�ng bu?c ph�t sinh sau khi th?c hi?n ph??ng th?c. Khi th?c hi?n vi?c k? th?a, ph??ng th?c ???c ??nh ngh?a l?i trong l?p k? th?a ph?i c� ti?n ?i?u ki?n l?ng l?o h?n (weaker) v� h?u ?i?u ki?n ch?t ch? h?n (stronger). ?i?u n�y c� ngh?a l� tr??c khi th?c hi?n, ph??ng th?c ???c ??nh ngh?a l?i trong l?p k? th?a kh�ng ???c ?�i h?i nhi?u h?n nh? khi n� ???c ??nh ngh?a trong l?p c? s?. V� sau khi th?c hi?n, ph??ng th?c ???c ??nh ngh?a l?i trong l?p k? th?a ph?i ??m b?o t?t c? nh?ng r�ng bu?c ph�t sinh nh? khi n� ???c ??nh ngh?a trong l?p c? s?. Ch? khi n�o nh?ng ?i?u tr�n ???c ?�p ?ng cho m?i ph??ng th?c trong l?p k? th?a th� l?p k? th?a m?i ???c xem l� c? x? nh? l?p c? s?. V� khi ?�, vi?c ?? n� k? th?a t? l?p c? s? m?i l� ?�ng ??n trong ng? c?nh ph?n m?m ?ang x�t.
vi) Nguy�n l� Thay th? Liskov v� k? thu?t �Design by Contract� v� t�nh l�m cho vi?c k? th?a tr? n�n r?t kh� th?c hi?n. Khi c?n th�m v�o m?t l?p k? th?a, ch�ng ta ph?i xem x�t r?t k? l??ng l?i t?t c? h�m c� thao t�c tr�n l?p c? s? xem ch�ng c� vi ph?m nguy�n l� Thay th? Liskov hay kh�ng. Ch�ng ta c?ng c?n ph?i xem x�t t?t c? c�c ph??ng th?c c?a l?p k? th?a xem ch�ng c� vi ph?m nh?ng quy ??nh c?a k? thu?t �Design by Contract� hay kh�ng. T?t c? nh?ng ?i?u n�y l� do l?p k? th?a c� m?t m?i li�n h? m?t thi?t v?i l?p c? s?. L?p k? th?a b? k?t d�nh (coupling) ch?t ch? v?i l?p c? s?. S? k?t d�nh n�y r� r�ng l�m cho ph?n m?m k�m linh ??ng (flexibility) m?t khi c� s? thay ??i x?y ra. Do ?�, ?? h?n ch? s? k?t d�nh n�y m� v?n ??m b?o ???c t�nh t�i s? d?ng, ch�ng ta ch? n�n k? th?a interface v� s? d?ng composition thay cho vi?c k? th?a.
� ngh?a
Nguy�n l� Thay th? Liskov c� m?i li�n h? m?t thi?t v?i nguy�n l� Open-Closed v� l� m?t trong b?n nguy�n l� c? b?n l�m n?n t?ng cho ph�n t�ch thi?t k? h??ng ??i t??ng. N� gi�p n�ng cao t�nh t�i s? d?ng v� b?n v?ng c?a ph?n m?m tr??c nh?ng s? thay ??i.
Nguy�n l� Ph�n t�ch interface
(The Interface Segregation)
Ph�t bi?u
Kh�ng n�n bu?c c�c th?c th? ph?n m?m ph? thu?c v�o nh?ng interface m� ch�ng kh�ng s? d?ng ??n.
N?i dung
Khi x�y d?ng m?t l?p ??i t??ng, ??c bi?t l� nh?ng l?p tr?u t??ng (abstract class), nhi?u ng??i th??ng c� xu h??ng ?? cho l?p ??i t??ng th?c hi?n c�ng nghi?u ch?c n?ng c�ng t?t, ??a th?t nhi?u thu?c t�nh v� ph??ng th?c v�o l?p ??i t??ng ?�. Nh?ng l?p ??i t??ng nh? v?y ???c g?i l� nh?ng l?p ??i t??ng c� interface b? �� nhi?m� (fat interface or polluted interface).
Khi m?t l?p ??i t??ng c� interface b? �� nhi?m�, n� s? tr? n�n c?ng k?nh. M?t th?c th? ph?n m?m n�o ?� ch? c?n th?c hi?n m?t c�ng vi?c ??n gi?n m� l?p ??i t??ng n�y h? tr? bu?c ph?i l�m vi?c v?i to�n b? interface c?a l?p ??i t??ng ?�. Vi?c ph?i truy?n ?i truy?n l?i nhi?u l?n nh?ng ??i t??ng c� interface b? �� nhi?m� s? l�m gi?m hi?u n?ng c?a ph?n m?m.
??c bi?t ??i v?i l?p tr?u t??ng c� interface b? �� nhi?m�, m?t s? l?p k? th?a ch? quan t�m ??n m?t ph?n interface c?a l?p c? s? nh?ng b? bu?c ph?i th?c hi?n vi?c c�i ??t cho c? ph?n interface kh�ng h? c� � ngh?a ??i v?i ch�ng. ?i?u n�y d?n ??n s? d? th?a kh�ng c?n thi?t trong c�c th?c th? ph?n m?m. Quan tr?ng h?n n?a, vi?c bu?c c�c l?p k? th?a ph? thu?c v�o ph?n interface m� ch�ng kh�ng s? d?ng ??n s? l�m t?ng s? k?t d�nh (coupling) gi?a c�c th?c th? ph?n m?m. M?t khi s? n�ng c?p, m? r?ng di?n ra, ?�i h?i ph?n interface ?� ph?i thay ??i, c�c l?p k? th?a n�y b? bu?c ph?i ch?nh s?a theo. ?i?u n�y l�m cho ch�ng vi ph?m nguy�n l� Open-Closed.
H�nh b�n d??i l� s? ?? l?p cho ?o?n ch??ng tr�nh t�nh ?i?n tr? m?ch ?i?n. �Resistor� v� �Lamp� l� nh?ng m?ch ?i?n ??n gi?n v?i ?i?n tr? l� m?t thu?c t�nh c?a m?ch. Trong khi �SeriesCircuit� v� �ParallelCircuit� l� nh?ng m?ch ?i?n ph?c h?p v?i ?i?n tr? c?a m?ch ???c t�nh t? c�c m?ch ?i?n con. ?? c� th? c? x? nh? nhau tr�n c�c lo?i m?ch ?i?n n�y hay n�i c�ch kh�c l� truy xu?t ??n ch�ng m?t c�ch �trong su?t� (transparency), ch�ng ta c� �Circuit� l� l?p tr?u t??ng chung ??i di?n cho c�c m?ch ?i?n kh�c nhau.
L?p �Circuit� ???c thi?t k? nh? tr�n ???c g?i l� c� interface b? �� nhi?m�. �Resistor� v� �Lamp� b? bu?c ph?i th?c hi?n vi?c c�i ??t cho c�c ph??ng th?c �add� v� �remove� ho�n to�n ch?ng c� � ngh?a g� v?i ch�ng. ?i?u n�y g�y ra s? d? th?a code kh�ng c?n thi?t c?ng nh? g�y �kh� ch?u� cho nh?ng th?c th? ph?n m?m kh�c s? d?ng �Resistor� v� �Lamp�.
Nh?ng v?n ?? ch? th?t s? x?y ra khi ch�ng ta n�ng c?p, m? r?ng ?o?n ch??ng tr�nh tr�n. Gi? s? ch�ng ta c?n th�m v�o ph??ng th?c �removeAt� ?? h? tr? vi?c x�a m?ch ?i?n con t?i v? tr� n�o ?� trong m?ch ?i?n ph?c h?p. L�c n�y, ch�ng ta ph?i th?c hi?n vi?c ch?nh s?a tr�n t?t c? c�c l?p ??i t??ng k? th?a t? �Circuit�. Vi?c ch?nh s?a tr�n �SeriesCircuit� v� �ParallelCircuit� xem ra c�n c� th? ch?p nh?n ???c. Nh?ng vi?c ph?i ch?nh s?a tr�n �Resistor� v� �Lamp� l� kh�ng th? ch?p nh?n ???c v� ph??ng th?c �removeAt� ch?ng h? c� � ngh?a g� ??i v?i ch�ng. ?i?u n�y r� r�ng l�m cho �Resistor� v� �Lamp� vi ph?m nguy�n l� Open-Closed m?t c�ch �kh�ng ch�nh ?�ng�.
Ch� �
i) Nguy�n l� Ph�n t�ch interface c� m?i li�n h? v?i nguy�n l� Open-Closed. S? vi ph?m nguy�n l� Ph�n t�ch interface c� kh? n?ng d?n ??n s? vi ph?m nguy�n l� Open-Closed (xem ph�n t�ch ? tr�n).
ii) ?? tr�nh vi ph?m nguy�n l� Ph�n t�ch Inteface, ch�ng ta n�n gi? cho interface c?a l?p ??i t??ng ??n gi?n v� g?n nh?, n�n l�m theo ti�u ch� �a class should do one thing and do it well�. Ch�ng ta kh�ng n�n ?? cho l?p ??i t??ng ??m nh?n qu� nhi?u tr�ch nhi?m v� ?i?u n�y d? l�m cho interface c?a n� b? �� nhi?m�.
iii) Interface b? �� nhi?m� c?a l?p ??i t??ng n�n ???c ph�n t�ch ngay khi c� th? ?? tr�nh kh? n?ng d?n ??n s? vi ph?m nguy�n l� Open-Closed. Vi?c ph�n t�ch interface b? �� nhi?m� c?a m?t l?p c? s? c� th? ???c th?c hi?n th�ng qua vi?c t?ng th�m m?c ?? tr?u t??ng trong c�y k? th?a c?a n�. L?p c? s? ban ??u ch? n�n c� interface ??n gi?n m� m?i l?p k? th?a c?a n� ??u c?n ph?i c�. Sau ?�, ph?n interface chung c?a m?t b? ph?n l?p k? th?a ???c t?ng h?p l?i trong m?t l?p c? s?. V� l?p c? s? n�y l?i k? th?a t? l?p c? s? ban ??u. Nh? v?y nh?ng l?p k? th?a thu?c nh�nh kh�c kh�ng b? ph? thu?c v�o ph?n interface m� ch�ng kh�ng s? d?ng ??n c?a b? ph?n l?p k? th?a kia.
V?i tr??ng h?p ?o?n ch??ng tr�nh t�nh ?i?n tr? m?ch ?i?n, ?? gi?i quy?t v?n ?? interface c?a �Circuit� b? �� nhi?m�, ch�ng ta t?ng th�m m?t m?c ?? tr?u t??ng trong c�y k? th?a c?a n�. Khi ?�, �Circuit� ?�ng vai tr� l� l?p tr?u t??ng cho c�c m?ch ?i?n kh�c nhau. N� ch? ch?a ph?n interface chung nh?t c?a t?t c? c�c m?ch ?i?n n�y. V� trong ng? c?nh b�i to�n t�nh ?i?n tr? ??n gi?n th� n� ch? ch?a ph??ng th?c �calcResistance�.
Ch�ng ta s? c� l?p �SingleCircuit� ??i di?n cho c�c m?ch ?i?n ??n gi?n v� �ComplexCircuit� ??i di?n cho c�ch m?ch ?i?n ph?c h?p. �SingleCircuit� ch?a ph?n interface chung c?a c�c m?ch ?i?n ??n gi?n nh? �Resistor� v� �Lamp� trong khi �ComplexCircuit� ch?a ph?n interface chung c?a c�c m?ch ?i?n ph?c h?p. Ch�ng ta s? c� ???c c�y k? th?a nh? h�nh b�n d??i.
L�c n�y, khi c?n th�m v�o ph??ng th?c �removeAt� ch�ng ta ch? vi?c n�ng c?p ph?n interface c?a �ComplexCircuit�, nh�nh k? th?a b�n �SingleCircuit� s? kh�ng b? ?nh h??ng.
iv) Trong m?t s? tr??ng h?p, sau khi ph�n t�ch interface, m?t s? l?p k? th?a m?i th�m v�o mu?n s? d?ng nh?ng ph?n interface ?� ph�n t�ch, ch�ng c� th? th?c hi?n vi?c ?a k? th?a t? nh?ng l?p ??i t??ng h? tr? nh?ng ph?n interface n�y ho?c c?ng c� th? k? th?a t? m?t l?p ??i t??ng h? tr? m?t ph?n interface ch�ng c?n v� th?c hi?n composition ??i v?i nh?ng ??i t??ng h? tr? ph?n interface c�n l?i.
� ngh?a
Nguy�n l� Ph�n t�ch interface c� m?i li�n h? v?i nguy�n l� Open-Closed v� l� m?t trong b?n nguy�n l� c? b?n l�m n?n t?ng cho ph�n t�ch thi?t k? h??ng ??i t??ng. N� gi�p gi?m s? c?ng k?nh, d? th?a kh�ng c?n thi?t cho ph?n m?m v� quan tr?ng h?n l� gi?m s? k?t d�nh (copuling) l�m h?n ch? t�nh linh ??ng (flexibility) c?a ph?n m?m.
http://www.ciren.gov.vn/forums/showthread.php?t=528
__________________
Tr?n D?ng - CIRENet
Tr?n D?ng - CIRENet
download file now