Dependency Injection with Spring.Net p3

(Bài viết dịch từ bài Dependency Injection with Spring.Net của David Consdorf, thêm hành thêm tiêu rồi nấu lại bởi Nguyễn Thoại :bbpraroi:)




Contstructer Injection vs. Property Injection

- Trong ví dụ trước, chúng ta đã sử dụng kĩ thuật “constructor injection” để set giá trị cho 1 property của đối tượng được Spring tạo ra. Thật ra có một cách khác để làm chuyện này, Spring cũng hỗ trợ chúng ta set giá trị cho object gọi là “property injection”. Các bạn hãy xem cách chúng ta cấu hình trong file xml:


<object name="SimpleMessageByProperty" type="SimpleMessage, __Code" singleton="false">
<property name="Message" value="Hello, I am a simple message
set by using property-based dependency injection.
" />
<object>

Hình 5: Simple Message by Property Object Mapping

- Trong hình trên, chúng ta không thấy thẻ <constructor-arg> như ở file xml trong bài trước. Điều này có nghĩa là chúng ta sẽ không sử dụng constructor có arg để thiết lập giá trị cho đối tượng mà giá trị đó được set một cách trực tiếp thông qua public property. Điểm khác nhau duy nhất trong code khi chúng ta cần tạo ra lớp SimpleMessage là là thay vì sử dụng giá trị string “SimpleMessage” để tạo la instance của lớp SimpleMessage, ta sẽ sử dụng string “SịmpleMessageByProperty” như phần định nghĩa trong file xml ở trên.

- Nói chung, tôi vẫn thích sử dụng cách “constructor injection” hơn bởi vì nó giúp chúng ta thấy rõ cách đối tượng được thiết lập. Tuy nhiên, có nhiều trường hợp buộc chúng ta phải sử dụng property injection. Vấn đề là chúng ta nên chọn loại injection nào để sử dụng mà thôi.


Reference Injection Example with the Strategy Pattern.

- Tuy ví dụ về SimpleMessagephần 2 là một ví dụ tốt về mapping một đối tượng, nhưng nó không thể hiện được sức mạnh của Spring.Net. Set giá trị cho một property chẳng có gì đặc biệt cả. Vì vậy, chúng ta hãy xem 1 ví dụ lý thú nữa: inject một reference đến đối tượng khác trong một đối tượng và chúng ta sẽ kết hợp kĩ thuật này với một ví dụ về mẫu thiết kế strategy (strategy pattern).

- Trước hết, tôi sẽ giải thích cho những ai chưa quen với mẫu thiết kế Strategy. Đây là mẫu thiết kế giúp bạn trừu tượng hoá (abstract) những hành vi (behavior, method, function) của đối tượng với nhiều cách bằng cách đưa những cài đặt (implement) đó vào những lớp (class) khác nhau. Giả sử tôi nhận được yêu cầu thiết kế một lớp với một behavior nào đó, và tôi nghĩ ra được rất nhiều cách để làm cài đặt behavior này. Nếu không biết trước mẫu thiết kế strategy, tôi có thể implement một lớp đơn giản với nhiều method với những tên khác nhau. Khi nào muốn sử dụng cách nào thì tôi gọi method đấy. :bbpnghi:Cách này cũng giải quyết được bài toán nhưng tồn tại bên trong nó nhiều risk tiềm ẩn và theo tôi nó không có tính hướng đối tượng. Nếu làm theo cách đó chẳng khác thời mình học Pascal là mấy, lập trình thủ tục. Mục tiêu của design pattern là giúp chúng ta giải quyết các bài toán kiểu như vậy và trường hợp này chúng ta có thể sử dụng mẫu thiết kế Strategy cho chương trình của mình. Trước lúc tôi nấu lại bài viết của tác giả, rất nhiều lần tôi đã vô tình sử dụng mẫu thiết kế này nhưng không hề biết đó là mẫu Strategy và tôi nghĩ cũng có một số người giống như tôi. Trong yêu cầu trên, thay vì implement cách tạo ra những method khác nhau với những tên khác nhau, tôi sẽ đưa những xử lý trong các method ấy ra nhiều lớp độc lập. Những lớp này sẽ cùng implement một interface và chương trình của tôi sẽ giữ một instance thuộc về kiểu Interface này. Nói cách khác, một xử lý phức tạp không được chia nhỏ theo nhiều hàm mà chia nhỏ ra nhiều lớp, hướng tiếp cận này sẽ giúp các bạn tăng tính loose coupling giữa những đối tượng và chương trình của bạn sẽ rất dễ sửa đổi về sau. Những tài liệu design pattern thường dùng 1 ví dụ kinh điển về các thuật toán sort để giải thích mẫu thiết kế Strategy. Các bạn có thể tham khảo bài gốc của tác giả hoặc trên trang wiki cũng tốt.Tuy nhiên tôi sẽ sử dụng một ví dụ khác bình dân hơn và vui hơn để những bạn muốn tìm hiểu mẫu thiết kế Strategy có thể tiếp nhận một cách nhẹ nhàng.


- Giả sử, à không, tất nhiên bây giờ tôi đã có một cô bạn gái :bbpraroi:, và cuối tuần phải dẫn đi đâu đó chơi. Theo tôi, có nhiều cách đi chơi cuối tuần (strategy) như đi ăn tối, đi xem phim, đi café, đi karaoke, nấu ăn, … Tất cả những cách đấy đều cùng mục đích là giải trí vào ngày cuối tuần và sau khi thực hiện những cách ấy tôi và bạn gái của tôi đều nhận được một kết quả là cả 2 đều cảm thấy hài lòng, tinh thần thoải mái để bắt đầu một tuần làm việc mới:bbpxtay:. Tuy quá trình thực hiện những cách ấy có khác nhau, thời gian địa điểm khác nhau nhưng đều giải quyết được yêu cầu của tôi. Như vậy tôi vẽ bản kế hoạch như sau:

Strategy Pattern


Hình 6: Bản kế hoạch ăn chơi theo Strategy Pattern

- Và đây là lịch đi chơi tuần tới hê hê, xin mẹ được có 100 ngàn thì đi coi film chứ sao giờ.:bbptuc:


public class NguyenThoai : IHuman {
private int _money = 0;
private Vehicle _vehicle = null;
private bool _isHappy = false;
private ICachDiChoi _cachDiChoi;

public NguyenThoai(ICachDiChoi cachDiChoi) {
_
cachDiChoi = cachDiChoi;
}


public void DanBanGaiDiChoi() {
_
cachDiChoi.DiChoi();
}
// implement some public properties...
}

public interface ICachDiChoi {
void DiChoi();
}

public class DiXemPhim : ICachDiChoi {
public void DiChoi() {
// _isHappy = true;
}
}

public class DiAnToi : ICachDiChoi {
public void DiChoi() {
// _isHappy = true;
}
}

public class DiUongCafe : ICachDiChoi {
public void DiChoi() {
// _isHappy = true;
}
}

public class ThuBayTuanToi {
public void main() {
NguyenThoai _thoai = new NguyenThoai(new DiXemPhim());
_thoai.Money = 100.000 VND;
_thoai.Vehicle =
new Vehicle("Xe Bus");
_thoai.
DanBanGaiDiChoi();
}
}


Hình 7: Chương trình ăn chơi

- Mẫu thiết kế Strategy pattern rất hữu ích khi bạn muốn trừu tượng hoá những thuật toán, những xử lý phức tạp và những gì có thể bạn sẽ thay đổi sau này. Tuy thực hiện việc dẫn bạn gái đi chơi là không quá phức tạp nhưng tôi hi vọng ví dụ trên có thể giúp bạn hiểu được Strategy pattern là gì, nó giải quyết vấn đề gìkhi nào ta nên sử dụng Strategy Pattern. Nếu như bạn vẫn chưa hiểu rõ và còn mơ hồ, bạn có thể phản hồi bằng cách comment trược tiếp vào entry này. Ngoài ra, nếu có quan tâm đến những Design Pattern khác, bạn sẽ thấy rằng mẫu thiết kế Bridge sẽ có sơ đồ lớp (Class Diagram) rất giống với mẫu thiết kế Strategy nhưng nó sẽ giải quyết một vấn đề khác tương tự. Hi vọng tôi có cơ hội để nấu nướng về mẫu thiết kế Bridge này. Quay lại ví dụ của chúng ta, như thiết kế lớp ở trên, chúng ta sẽ tìm hiểu cách sử dụng Spring.Net để chuyển đổi các strategy bằng file config; để có thể dễ dàng thay đổi thuật toán trong ứng dụng mà chẳng cần phải build lại chương trình:bbpraroi:. Xem phần tiếp theo.


Phần 1

Phần 2

Phần 4

Phần 5

Phần 6

(Các bạn đang xem phần 3)

1 comments:

  1. Nam Says:

    Để minh họa cho Strategy Pattern thì em cứ lấy ví dụ viết một hàm sort tổng quát, trong đó có thể thay đổi kiểu sort (bubble, quick, binary), thay đổi thứ tự (tăng dần, giảm dần), và kể cả cách thức xuất ra mảng kết quả.

    Thoại luyện hết 24 chiêu trong Design Pattern của GoF chưa? :D

    Khi nào luyện xong hết rồi thì luyện tiếp anti-pattern đi, để hiểu khi nào KHÔNG nên dùng pattern.

    Trong võ học thì có 3 hạng người:
    - Lính lác, quần chúng thì không biết tí võ công gì hết.

    - Nhân sĩ võ lâm thì biết mấy đường võ công, khi giáp trận thì có thể thi triển võ công mình biết.

    - Bậc đại cao thủ thì đạt đến trình đó hư chiêu: đỉnh cao của võ học là nhiều khi không dùng đến chiêu thức vẫn có thể chiến thắng đối phương. :D

rss
 

About Me

Place I've live
Near Bossley Park, Sydney, NSW, Australia
Place I've work
  • Freelancer (from 06/2010 to present)
  • Harvey Nash (from 05/2008 to 06/2010)
  • DataDesign Vietnam (10/2005 to 04/2008)
Place I've studied
  • University of Natural Science (Bachelor of Science HoChiMinh City Vietnam From 2001 to 2005)
  • Le Hong Phong High School (HoChiMinh City Vietnam From 1997 to 2000)