Design Patterns, lập trình viên cần phải biết.

Trong cty mình làm chỉ có 1 vài cá nhân chịu khó tìm hiểu vấn đề này còn lại hầu như không ai quan tâm và nhìn nó với ánh mắt chẳng ra gì. Thật đáng buồn!

Đang nghiền ngẫm thật kĩ các Design Patterns, lang thang trên google tìm được bài viết này, thấy cũng khá thú vị nên post lên cho bà con ngắm nghía, thư giãn và quan trọng hơn là để mọi người thấy được tầm quan trọng của nó trong việc thiết kế phát triển phần mềm. Một lập trình viên đúng nghĩa phải biết những vấn đề này, nếu không chúng ta mãi là những thợ code tồi.
Có 2 cuốn sách về vấn đề này mình rất tâm đắc:
1. Design Patterns: Elements of Resuable Object-Oriented Software.
2. Head First Design Patterns.
Nếu ai quan tâm thì mình có thể cho mượn photo, còn ebook thì mọi người có thể dùng Emule hay vào gigapedia.com để search.

Thợ hồ tin học và các mẫu dáng thiết kế
Tâm… đa sự của một lập trình viên

Có người ví ngành tin học, hay nói “dông dài” hơn là công nghệ thông tin, giống như ngành xây dựng: muốn tạo ra hệ thống nào đó, cần có “kiến trúc sư” và… “thợ hồ”, tức những người thiết kế hệ thống và những người viết nên mã chương trình cụ thể. Theo tiêu chí này, dường như số đông sinh viên tin học tốt nghiệp sẽ làm… “thợ hồ” (thợ dĩ nhiên phải cần nhiều hơn thầy). Công việc “kiến trúc sư” có lẽ phải dành cho các bậc “sồn sồn” dày dạn kinh nghiệm trận mạc.

Quả quyết rằng người Việt có năng khiếu tin học bẩm sinh (không rõ tôi “tiêm nhiễm” điều này từ bao giờ), tôi hăm hở lao vào tin học. Thế rồi đúng như số mệnh mà ai cũng biết rõ mười mươi: tôi trở thành… “thợ hồ”! Quả thực, công việc thường chỉ là gắn lại với nhau những “viên gạch” có sẵn mà người ta gọi là các thành phần (component). Ngày ngày tôi lầm lũi xây những bức tường, có khi chẳng thấy ngôi nhà hay cao ốc nó ra sao.

Tuy nhiên, cái chân “thợ hồ” của tôi xem ra cũng không dễ dàng chút nào! Nếu như thợ hồ trong xây dựng có thể về nhà ngủ khò sau một ngày làm việc (tôi ghen với họ!), tôi luôn phải loay hoay tìm đọc sách này, sách kia, thức đêm thức hôm để tiêu hóa một cách khó nhọc những kiến thức mới mẻ cứ nảy sinh đều đều (giờ đây tôi thường tự nhủ: người mình chắc chắn thông minh… bằng người ta!).

Một trong những thứ khó nuốt (đối với tôi) kêu bằng design pattern. Khái niệm này trở nên thịnh hành từ khi xuất hiện quyển sách “đáng ghét”, từng làm xôn xao giới lập trình, mang tên Design Patterns: Elements of Reusable Object-Oriented Software của bốn tác giả Erich Gamma, Richard Helm, Ralph Johnson và John Vlissides. Bên Mỹ người ta gọi đùa họ là “bè lũ bốn tên” (Gang of Four). “Bè lũ” này làm cho đời sống của cánh “thợ hồ” như tôi thêm vất vả nhưng có lẽ cũng vì thế mà quyển sách nổi tiếng của họ được đưa vào… chương trình đại học.(*)

Decorator, Iterator, Mediator,…

Bạn có thấy dòng chữ nêu trên giống câu thần chú kiểu trong… Harry Potter không? Lần đầu tiên, tôi đụng phải một cái design pattern (thường gọi ngắn gọn là pattern) là khi người ta gửi cho tôi một bản vẽ (thế đấy, làm “thợ hồ” vẫn phải đọc bản vẽ) và yêu cầu tôi thực hiện một decorator ở chỗ “được khoanh tròn”. Vờ như đã hiểu, tôi “không thèm” hỏi lại xem decorator là cái giống gì. Từ đó, tôi bắt đầu để ý những đồng nghiệp thường xuyên nói chuyện với nhau bằng những từ lạ lùng hơn, nào là iterator, rồi mediator,… Dường như họ muốn chứng tỏ mình sành điệu thì phải.

Học thầy không tày học bạn, tôi đem chuyện bí hiểm ấy kể với một người bạn học cũ. Anh nói ngay: “Mấy thứ đó gọi chung là pattern! Cũng chẳng có gì, đại khái nó là những data structure (cấu trúc dữ liệu) thôi mà”. Có thật vậy chăng? Hình như anh cũng hiểu… đại khái như thế thôi vì anh không thể giải thích cho tôi rõ tại sao người ta “bịa” ra các tên mới để làm gì.

Thật may, cuối cùng một vị tiền bối trong ngành tin học nói cho tôi biết design pattern có thể dịch là mẫu dáng thiết kế. Nó không phải là… cấu trúc dữ liệu (nhầm lẫn tai hại!). Mỗi một mẫu dáng không phải là vật liệu để dùng ngay (khổ thật, tôi đã quen với “tư duy lắp ráp”) mà là một giải pháp kiến trúc hợp lý và hiệu quả, từng được kiểm nghiệm nhiều trong thực tế, do đó có tính phổ quát và tính ứng dụng cao. Tôi rất tâm đắc với thuật ngữ “mẫu dáng” mới toanh để dịch nghĩa cho pattern hơn là cách gọi “mẫu mực” hay “mẫu hình” (theo từ điển) vì từ “dáng” bao hàm sự uyển chuyển, tính linh hoạt, đòi hỏi người ta phải cảm nhận, hiểu biết sâu sắc để vận dụng, không thể sao chép rập khuôn. Mẫu dáng ở đâu ra?

Hóa ra thuật ngữ design pattern lại xuất phát từ ngành xây dựng, do kiến trúc sư!

Comments

43 comments in this post. Add your comments below

  1. Ban gia, cung co gang nuot no lau lam roi, nhung design pattern khong phai la mot mon de hieu. Cung chua doc nhieu, nen chua hieu tuong tan ve design pattern. Doc va nghien ngam no, moi chi hieu no phan nao do thoi ban gia. Cuon sach hay, ban gia a

  2. Bạn già cố gắng đọc 2 cuốn này sẽ ổn, tối thứ 2 sẽ nhâm nhi cafe với bạn già :D

    Thấy Duy nghiên cứu nhiều về OOP mình rất khâm phục.
    Mình có đọc sơ qua khái niệm Interface của Java và C# nhưng ko hiểu lắm -> chả thấy lợi ích. Mình có 1 số thắc mắc mong Duy chia sẽ.
    1. Interface là gi?
    2. Interface lợi ích chỗ nào (trong 1 trường hợp cụ thể (*)).
    3. Nếu ko có interface thì tôi sẽ làm việc nó (*) như thế nào để thấy đc lợi ích của nó.
    4. Trong C++(tôi chỉ biết thứ này) có khái niệm nào tương tự hay ko, nếu ko thì có thể cài đặt cái gì tương tự để có thể áp dụng lợi ích của interface ko?
    5. more and more :D
    Cám ơn Duy nhiều.

    Hiện tại mình đang đi công tác tại Vũng Tàu nên chưa trả lời các câu hỏi của bạn đc, mình sẽ sớm trả lời câu hỏi của bạn khi về lại SG.

    HMP

    Em mới chân ướt chân ráo bước vô ngành này. Em rất quan tâm tới OPP. Hy vọng sau này sẽ được anh Duy chỉ giáo ạh. :) Cảm ơn anh nhiều.
    ——————
    Thực sự thì bây giờ em mới học, nên cái gì cũng hơi mông nung…

    ——————
    Anh Duy cho phép em copy bài viết của anh chia sẻ với bạn bè trong lớp nhé, có chú thích nguồn đàng hoàng ạh. Thanks anh nhiều!

    @HMP: Cảm ơn em đã ghé thăm blog của anh, em cứ thoải mái chia sẻ các kiến thức này với các bạn nếu em cảm thấy nó có ích ;-)

    Chào Duy.
    Rất hân hạnh được làm quen.
    Vì mình cũng đang làm java nhưng thực sự là có những cái chỉ biết làm theo mẫu còn hiểu rõ bản chất thì chịu. Do đó đôi lúc thấy rất khó khoăn trong công việc. Có thấy Duy nhắc đến hai quyển sách trên. Vậy xin hãy cho địa chỉ để mình có thể mượn photos được không? Đọc sách trên máy đôi lúc thấy ngán quá. Thanks. Chúc làm việc vui vẻ.

    Xin chào! Em đang tìm tài liệu trên Google thì vô tình đọc được bài viết của anh.Rất hay.Em cũng đang theo học ngành lập trình.Rất vui nếu được làm quen với anh.

    @NTDoan: Kiểm tra mail nhé.
    @DuyNhat: Rất vui được làm quen với em ;-)

    Bài viết rất hay mặc dù không sâu lắm. Góp phần giúp anh em “Thợ hồ” nhận thức được tầm quan trọng của Design Pattern.Cám ơn bạn rất nhiều.

    Mình thấy rất vui khi có nhiều lập trình viên ở VN quan tâm đến vấn đề này ;-)

    Cảm ơn chú Duy Đỗ, sau này cháu sẽ thường xuyên vào đây hơn!

    Hello Anh Duy
    Bài viết của anh rất có ý nghĩa, em download ebook về rồi cũng đã dọc được 1 ít,Nhưng khổ nổi nó viết by english, mà em thì không hiểu được rỏ ràng.(Không hiểu thấy người khó chịu quá)Anh có sách by ViêtName không) Send cho em với.
    Thank’s

    A address email của em là :o nlyone253@gmail.com :D

    Mấy tài liệu thuộc loại này anh thấy ít có bản dịch tiếng Việt. Đã trót theo IT thì chịu khó luyện tiếng Anh một chút đi em ;-)

    Chào anh. Rất vui được biết anh. Em đọc bài viết về Desing Patterns rất hay. Mong muốn của em là anh có thể cho 1 ví dụ được không ạ ? đỂ em hiểu rõ hơn ấy mà. Cảm ơn anh.

    Anh cho hỏi câu nữa ha. Interface là gì ? Khi nào sử dụng interface ?

    Anh có thể cho em biết các mẫu này sử dụng như thế nào không?Em chưa biết về tác dụng của nó!xem nó lợi hại như thế nào.Anh cũng cho em biết lun về mẫu Singleton và mẫu Facade được không?cảm ơn anh nhìu!

    @Thinhhp: Em tham khảo thêm bài này http://doquocduy.wordpress.com/2008/09/28/singleton-pattern-when-and-how-use-it-effectively/
    @nguoinhaqueIT: Tân Anh cứ trêu :P

    Bạn nên đọc hiểu thêm về lý thuyết trước khi đụng đến nó, cố gắng hiểu được khái niệm “MỀM DẺO” khi đọc DP. nên tìm hiểu 23 patterns của Gò và thêm mấy cái của Enterprise Pattern của Microsoft nhé.
    Good luck!

    Chao Ban Minh Cung Dang Rat Can 2 tai lieu o Tren ma ban gioi thieu, Ban co the send cho minh wa mail duoc khong ? Thanks ban
    Mail Cua Minh : Ne7ven@yahoo.com

    vô tình lang thang tìm tài liệu về design patterns. Thấy anh viết vài dòng về nó làm em vỡ ra nhiều điều. Một SV chuẩn bị sang năm 2 . Cám ơn anh nhiều.

    Vu

    Mình cũng là một coder c/c++, nói theo ngôn ngữ của Duy thỉ là thợ hồ :D mình cũng đang nghiên cứu DP nên rất muốn có thể muợn và photo những cuốn sách của D đuợc ko? đọc ebook oải lắm :D .mail của mình là thevuuranusls.a mốc.gmail.com.Chúc sức khỏe!

    Chao a Duy ! Rat vui dc lam quyen voi anh.Em cung dang nghien cuu Design Pattern .A co the share em link download 2 quyen sach ma anh neu tren vao mail cua em dc hok.Cam on anh nhieu.Hy vong a share nhieu ebook bo ich cho a,e lap trinh vien VN :)

    Chào anh Duy!
    Trước hết cám ơn anh đã chia sẻ một bài viết rất hay.
    Anh Duy cho em hỏi khi em muốn xây dựng một ứng dụng để đề mô về Design paterns thì e có thể xây dựng một ứng dụng theo mô hình MVC hay 3-tiers thì có được coi là một Design paterns hay không?
    Cám ơn anh!

    @QuangVan

    Mô hình MVC nên xem là Architectural Pattern thì có vẻ hợp lý hơn là xem nó như 1 Design pattern. Bản thân MVC được cấu thành từ các Design Patterns: Observer, Composite, Strategy. Vì thế em hoàn toàn có thể ứng dụng demo về các Design Patterns sử dụng mô hình MVC.

    Cám ơn anh Duy nhiều!
    Em sẽ sử dụng mô hình MVC để demo về Design Patterns.:d

    Anh Duy!
    Em có thể xây dựng mô hình MVC để demo về Design Patterns nhưng e hay làm ứng dụng sử dụng mô hình 3-Ties. Vậy a Duy cho e hỏi e có thể dùng mô hình 3 – Ties để demo đc ko?Và nếu được thì mô hình 3- Ties đc cấu thành từ các Design Patern nào?
    Cám ơn anh!

    Khi đề cập đến kiến trúc 3-tier (n-tier) thường người ta ám chỉ đến mô hình vật lý mỗi tier (layer) nằm trên những thành phần khác nhau thông qua network. Nghĩa là tầng presentation sẽ nằm trên web server, còn tầng business logic sẽ nằm trên môt application server khác, tầng business này sẽ truy xuất đến 1 database server. Các server này có thể nằm trên các máy khác nhau hoặc cùng nằm trên 1 máy. Có lẽ em đang nhập nhằng khái niệm MVC và N-tier architect. Em xem kỹ lại nhé.

    Thưa anh! Theo e hiểu
    MVC chỉ là sự chia nhỏ các thành phần tương tác với user, nghĩa là các thành phần trong Presentation layer chứ không phải là cách chia toản bộ một application ra thành 3 tier là Model – View – Controller.
    Lý thuyết MVC Design Pattern em đọc cũng hiểu được phần nào đó. Anh Duy có một demo nào bằng C# về MVC thì giúp em. Vì bắt tay vào làm quả thật nhiều vướng mắc quá

    Với một người ít kinh nghiệm lập trình thì để hiểu MVC như vậy quả thật không dễ. Thường hay bị nhập nhằng sang 3-Tier

    a ở TPHCM hả , cho e mươn quyen sach di photo với, newbie thợ hồ =.=

    Chào bạn.bạn có thể gủi ebook tiếng việt vào mail của mình được không.rất cảm ơn bạn nhiều. danghien.cntt@gmail.com

    Anh ơi! Anh có thể cho em xin ebook tiếng Việt với được không anh. Nếu được anh gởi vào mail leminhtrang0202@gmail.com cho em với nha anh. Em cảm ơn.

    Rất tiếc, mình k có sách tiếng Việt.

    Anh Gui cho em 2 cuon sach nay qua email : boy3n@yahoo.com.vn voi thanks nhieu!

    Anh ơi, em cảm ơn về bài viết của anh, em muốn photo 2 quyển sách đó của anh. Mà em ở Đà Nẵng, không biết làm sao để có vậy anh

    @Quy Duc: Hiện tại anh không có ebooks của 2 cuốn này.

    @Kiên: 6/2 này a ra Đà Nẵng, để coi thử a có mang đi được không.

    Hay anh gửi mail cho em ebook 2 quyển kia được không? Mail em: ntkien92@gmail.com

    Dạ, em hiện đang học bách khoa, mà lúc đó nghỉ tết em về nhà rồi anh à.

    Em tình cờ xem được bài này của a nó rất hay và ý nghĩa. Rất vui được làm quen vs mọi người để chia sẻ cùng nhau.

    cảm ơn anh về bài viết.em chưa bao giờ đọc 1 cuốn sách nào mà nhiều lần như design paterns.đọc đến thuộc nhưng để áp dụng nó thì chưa thể,
    anh có thể gửi em cuốn sách nào hay về design paterns
    và có thêm nhiều ví dụ về nó thân.
    ngovanbang92@gmail.com

Add comment

  • required
  • required