Sắp đặt kế hoạch hành đọc với mẫu chiến lược. Trong chương này, chúng ta sẽ đi qua các nội dung sau: -Mở rộng việc lập trình hướng đối tượng -Làm quen với các khái niệm trừu tượng, đóng gói, đa hình và kế thừa -Chuyển đổi qua lại giữa 2 khái niệm “is-a” và “has-a” -Xử lý công việc bằng các thuận toán -Áp dụng mẫu Strategy vào thực tế
1 CHƢƠNG II: SẮP ĐẶT KẾ HOẠCH HÀNH ĐỘNG VỚI MẪU CHIẾN LƢỢC Trong chương này, qua nội dung sau: -Mở rộng việc lập trình hướng đối tượng -Làm quen với khái niệm trừu tượng, đóng gói, đa hình kế thừa -Chuyển đổi qua lại khái niệm “is-a” “has-a” -Xử lý cơng việc thuận tốn -Áp dụng mẫu Strategy vào thực tế Bạn chuyên gia thiết kế mẫu, vào phịng họp cơng ty MegaGigaCo, giám đốc điều hành thành viên ban quản trị ăn mừng hợp đồng thiết kế xe hơi, người vỗ tay hò reo ăn mừng quang phòng “Hợp đồng đem đến nguồn thu nhập lớn cho chúng ta”, giám điều hành nói, với tiếng vang bốp bốp rượu champagne phấn khích giám đốc “Việc phải chắn có quy trình thiết kế đúng” Ông nhấn nút lên đèn chiếu hình ảnh biểu đồ lên tường Ơng nói tiếp: “Đây ý kiến tơi…” “Sai”, bạn nói Giám đốc thống chút giật nói tiếp, “Nhưng chúng ta…” “Khơng,” bạn lắc đầu nói “Xin thứ lỗi”, bạn nói với Giám đốc ban điều hành, “Rõ ràng mạo hiểm với hợp đồng sai hướng Tơi thấy tá vấn đề nhìn vào biểu đồ này” Ban giám đốc thầm với vẻ tập trung Giám đốc hỏi “Theo ý kiến anh sao…” “Tơi chun gia thiết kế mẫu, người giải tất vấn đề thíêt kế,” Bạn nói “Dĩ nhiên cho hợp đồng lớn” Giám đốc viết số dự đốn cho chi phí, số lớn, nhiên chưa đủ lớn bạn “Lại sai”, bạn nói Vị giám đốc nhìn bạn nhíu mày “Mẫu thiết kế”, bạn giải thích “Các giải pháp chung để giải cho vấn đề lập trình thường gặp Khơng vậy, cịn giúp việc lập trình tốt hơn, bảo dưỡng, cơng việc nâng cấp dễ dàng Ơng thấy đó, việc th chun gia tơi có nhiều ý nghĩa, tơi thấy vấn đề việc lập trình mà giải theo mẫu thiết kế đó, tơi nói chi tiết cho ơng biết “Tốt”, lập trình viên cơng ty nói cách miễn cưỡng, “ý kiến anh mẫu thíêt kế nghe hay Nhưng sử dụng phương pháp lập trình hướng đối tượng, điều chưa giải vấn đề à?” “Khơng” bạn nói Thực tế nội dung mẫu thiết kế chúng mở rộng khái niệm lập trình hướng đối tượng MỞ RỘNG KHÁI NIỆM LẬP TRÌNH HƢỚNG ĐỐI TƢỢNG? Chúng ta nhắc lại sách Gang Of Four (GOF: Bộ tứ tác giả), tựa đề “Mẫu thiết kế: Sử dụng lại thành phần việc lập trình phần mềm” nhà xuất Addison Wesley, 1995 xuất “Sử dụng lại” khía cạnh quan trọng làm việc với mẫu thiết kế, giải vấn đề lập trình hướng đối tượng(OOP) Tơi thảo luận trước OOP chương này, sau cho bạn thấy mối tương quan OOP mẫu “Strategy” hay gọi mẫu chiến lược OOP ban đầu phát triển phương pháp lập trình cho vấn đề lớn phức tạp Ý tưởng đóng gói tất chức vào đối tượng Nói cách khác, phương pháp chia để trị Trước OOP đời, bạn lập trình theo phương pháp thủ tục, bạn chia tính chương trình thành thủ tục khác nhau, điều ngày phức tạp kích cỡ chương trình lớn thêm Khi cần phải có phương pháp để quản lý thủ tục cách dễ dàng, nguyên nhân đời phương pháp mới, phương pháp quản lý đối tượng Ví dụ, bạn nhìn vào nhà bếp cách hoạt động nó, thật man phức tạp Tủ lạnh phải có bơm làm mát, phận cảm biến nhiệt, quạt vân vân Bếp lò bao gồm nhiều thiết bị phận nhiệt độ, định thời gian, đèn Theo cách nhìn nhận này, ta xem xét nhà bếp với phận lúc, ta thấy nhà bếp phức tạp Nhưng bạn bao bọc thành phần, thành đối tượng, tình hình dễ dàng xử lý nhiều Đây tủ lạnh Đây bếp lị Đó máy rửa chén vân vân Khơng vấn đề lớn Các chi tiết nhỏ làm việc ta đóng gói thành đối tượng Đó đối tượng lập trình hướng đối tượng Bạn gộp chức vào đối tượng chúng dễ dàng nhận biết, tủ lạnh, bếp lò hay máy rửa chén…Và phương pháp lập trình dựa đối tượng gọi lập trình hướng đối tượng ( Tất nhiên bạn chẳng nghe nói tới lập trình hướng tủ lạnh, hay lập trình hướng bếp lị… ) Ví dụ, chương trình bạn, bạn có đối tượng tên “Màn hình”, bao gồm chức để hiển thị liệu mà bạn mong muốn Một đối tượng khác tên “Cơ sở liệu” làm nhiệm vụ giao tiếp với máy chủ sở liệu vân vân…Có thể có nhiều phức tạp bên đối tượng, bạn đóng gói thứ vào đối tượng, thứ trở nên dễ dàng nhiều Bạn làm việc với khái niệm đối tượng “Màn hình” số chức đơn giản ThiếtLậpHệSốQt, CanhChỉnhMànHình, ThíêtLậpBộĐệmVideo… hàng tá chức khác Nó làm cho lập trình trở nên dễ dàng hơn, lý lập trình hướng đối tượng trở thành phương pháp mạnh mẽ phổ biến hết BỐN KHÁI NIỆM CHÍNH CỦA OOP OOP bao gồm bốn khái niệm trừu tượng, đóng gói, đa hình kế thừa Tôi thảo luận chúng phần sau đây: Trừu tƣợng gì? Khi bạn làm việc với mẫu thiết kế, bạn thấy phần lớn liên quan đến khái niệm trừu tượng Trừu tượng cách thức bạn nghĩ để xem xét việc giải vấn đề Trừu tượng khơng phải kỹ thuật lập trình Thực chất, có nghĩa bạn phải nhận thức vấn đề trước áp dụng kỹ thuật hướng đối tượng Trừu tượng cách bạn phân chia, cách giải vấn đề thành phân đoạn nhỏ Đây cách thức bạn giải vấn đề cách chia chúng thành phần nhỏ quản lý Nói cách khác, trừu tượng hóa tốn, đơn giản cách giải toán theo kiểu hướng đối tượng Các liệu cần thiết cho đối tượng trở thành thuộc tính đối tượng đó, thuộc tính riêng tư cho đối tượng công cộng cho đối tượng khác sử dụng Các hành vi mà đối tượng thể giới thực trở thành hành động chúng viết thành mã chương trình Khi bạn chắn tìm hướng giải tốn đắn, bạn áp dụng mẫu thiết kế Thông thường, làm việc với mẫu thiết kế bạn tốn nhiều thời gian cho việc trừu tượng hóa khái niệm, làm việc với đối tượng cụ thể Đóng gói gì? Khi bạn đưa tất chức liệu vào đối tượng, bạn “đóng gói” chúng Đây sức mạnh thực việc lập trình hướng đối tượng Bạn gỡ bỏ phức tạp đối tượng đóng gói tất liệu vào đối tượng “Đóng gói” cách bạn đưa hàng tá đường dây điện, ống, cảm biến nhiệt, đèn… vào đối tượng tủ lạnh Khi bạn đóng gói chức vào đối tượng, bạn định cách thức mà đối tượng giao tiếp với giới bên Một tủ lạnh quản lý hàng tá thứ phức tạp bên trong, nhiên người sử dụng quan tâm làm lạnh thức ăn hay khơng? Cùng cách thức đó, bạn định đâu chức năng, thuộc tính bên tủ lạnh, đâu chức thuộc tính giao tiếp với giới bên ngồi Có ý tưởng đằng sau việc đóng gói – Bạn che giấu thứ phức tạp bên đối tượng tạo giao diện đơn giản để đối tượng giao tiếp với phần mã cịn lại bạn Mẫu thíêt kế trường hợp đặc biệt đóng gói Bạn phải đóng gói bạn cho dễ thay đổi Một số mẫu thiết kế xoay quanh ý tưởng trích phần mã dễ thay đổi phần cần phải bảo trì nhiều đóng gói chúng vào đối tượng riêng để dàng dàng xử lý Xuyên suốt sách này, bạn nhìn thấy nhiều đóng gói cách thức bất ngờ mà mẫu thiết kế giải vấn đề thường gặp Đa hình gì? Một tảng khác lập trình hướng đối tượng “tính đa hình” Đó khả lập trình chức năng, chức làm việc với nhiều loại đối tượng khác nhau, tùy thuộc vào kiểu thực đối tượng thực tế Ví dụ, bạn viết mã để xử lý tất hình dạng khác hình trịn, hình chữ nhật, tam giác vân vân Mặc dù chúng có hình dạng khác nhau, chúng có chung số hành động, ví dụ chúng có chung chức ĐượcVẽRa Sử dụng tính đa hình, bạn viết code để thực nhiều hành động loại hình dáng mà bạn định làm việc sau định hình dạng thực tế sử dụng chạy chương trình Đa hình ( nhiều hình thức) có nghĩa mã bạn viết sử dụng nhiều kiểu đối tượng mà bạn viết lại mã Sau ví dụ Bạn tạo lớp (class) Shape với phương thức chung draw Sau bạn mở rộng lớp mới, lớp Rectangle, từ lớp Shape, cho phép vẽ hình chữ nhật sau: Bạn muốn vẽ hình? Khơng vấn đề Bạn viết mã để tạo đối tượng tên shape gọi phương thức draw: Kết chạy chương trình: Muốn vẽ hình chữ nhật sử dụng mã trên? Khơng vấn đề Đây kỳ diệu tính “đa hình”, tạo lại biến shape với kiểu rectangle chạy lại đoạn code trên: Kết là: Trong trường hợp thứ nhất, bạn nạp đối tượng shape vào biến shape gọi phương thức draw Trong trường hợp thứ hai, bạn lấy đối tượng rectangle nạp vào biến shape ( bạn khai báo đối tượng shape) sau gọi phương thức draw Vậy bạn sử dụng biến shape, để lưu giữ đối tượng shape, đối tượng rectangle, chương trình hoạt động rectangle thừa kế từ shape Đây cách bạn định kiểu đối tượng nạp vào biến shape chạy chương trình tồn mã bạn khơng thay đổi Kế thừa gì? Đặc điểm cuối bật lập trình hướng đối tượng tính kế thừa Là qui trình mà lớp thừa hưởng tồn phương thức thuộc tính lớp khác Bạn nhìn thấy kế thừa ví dụ trước, lớp Shape: Sau lớp Rectangle kế thừa từ lớp Shape sau: Đa hình thường xuất bạn làm việc với mẫu thiết kế mẫu thiết kế có xu hướng ủng hộ “kết hợp” “kế thừa” (Bạn sử dụng “kết hợp” đối tượng bạn chứa đối tượng khác thay thừa hưởng từ chúng) Kế thừa mối quan hệ “Is-a” (là một) Ta nói Rectangle “is-a” Shape Mẫu thiết kế- lập trình hướng đối tượng thường sử dụng việc “kết hợp” “kế thừa” Khi bạn sử dụng “kết hợp”, mã bạn chứa đựng đối tượng khác, thừa hưởng từ chúng Phương pháp tỏ mềm dẻo, uyển chuyển để thích ứng với nhiều loại đối tượng cách, đoạn mã Mẫu thiết kế thường dựa tính đa hình “Kết hợp” hay “Đa hình”: Thử nghiệm thiết kế xe Vậy nói với bạn “Kết hợp” tốt “Kế thừa” Có lẽ để ví dụ sau làm sáng tỏ vấn đề Các lập trình viên MegaGigaCo (phần đầu chương) biết “kế thừa” họ bắt đầu việc thíêt kế xe bất chấp lời cảnh báo bạn bạn có hội nói chuyện với họ Họ biết họ phải thiết kế loạt xe, họ bắt đầu tạo lớp sở tên Vehicle với phương thức tên go , phương thức xuất lên dòng chữ Now I’m driving Sau họ tao tiếp lớp mới, lớp StreetRacer, sử dụng Vehicle làm lớp sở sau: Chương trình tới tốt đẹp Bạn cho chạy chương trình với lớp StreetRacer sau: Kết nhận Bạn chạy lúc street racer formula one racer với cách sau: Và kết “Không tồi” Giám đốc ban điều hành nói “Vậy cần phải sử dụng mẫu thiết kế” Họ hỏi mà mắt nhìn chằm chằm vào bạn Nhưng sau họ nhận hợp đồng sản xuất máy bay trực thăng Helicopter Máy bay trực thăng à? Họ lý luận, phương tiện vận chuyển Vì họ tạo lớp Helicopter , mở rộng từ lớp Vehicle : Nhưng lại xuất vấn đề Nếu bạn sử dụng helicopter điều kiện xe hơi: Bạn nhận phương tiện sau: xe street racer, xe Formula One, xe helicopter sau: Có khơng ổn, Giám đốc nói cách hồ nghi Tại helicopter (máy bay trực thăng) mà lại chạy? Hình bay đúng? Tuy nhiên vấn đề thực tồi tệ công ty MegaGigaCo nhận hợp đồng chế tạo máy bay phản lực Jet, chúng kế thừa từ lớp Vehicle : Khi bạn cho chạy bốn phương tiện trên: xe street racer, xe formula one, máy bay trực thăng helicopter, máy bay phản lực jet, bạn nhận kết sau: “Chắc chắn có sai sót đây” Vị giám đốc lên tiếng Máy bay phản lực Jet khơng chạy đường, chúng không Chúng bay nhanh Khơng vấn đề gì, lập trình viên công ty đáp Chúng ghi đè(override) lên phương thức go lớp Helicopter lớp Jet để sửa chữa chúng Họ chỉnh sửa lại sau: Giờ lớp máy bay trực thăng Helicopter bay “OK” Giám đốc nói “Tuy nhiên vào tuần sau, ban giám đốc họp định phải chuyển từ “Now I’m flying” sang “Now, I’m flying 200mph” nhiều thay đổi tồi tệ kế tiếp… Có vấn đề nảy sinh đây, bạn giải thích Các lập trình viên thể chức đơn giản – lái xe hay phi – qua nhiều lớp Đó chưa vấn đề lớn bạn xử lý công việc cách thường xuyên, việc phải chỉnh sửa lớp trở thành vấn đề bảo trì nghiêm trọng Bạn nói tiếp: “sự kế thừa” khơng phải câu trả lời cho tình Nơi mà bạn cần phải thay đổi chức thường xuyên lớp Bạn cần phải chỉnh sửa, bảo trì phần lớn đoạn mã lớp có thay đổi Và có nhiều lớp kế thừa liên quan, chúng cần phải bảo trì có thay đổi, bạn phải cập nhật phương thức go mãi Vấn đề bạn phải giải tránh việc thay đổi lớp Nếu bạn không tránh điều này, bạn phải chỉnh sửa nhiều file để cập nhật mã bạn Có lẽ có cách tốt để xử lý vấn đề sử dụng “kế thừa” “Hey” lập trình viên nói, “Sao anh khơng sử dụng giao diện interface thay cho kế thừa inheritance? Anh cài đặt giao diện IFly cho giao diện phương thức go lớp Helicopter thực giao diện sau: “Khơng tốt” bạn nói Anh chưa giải ổn thỏa vấn đề Mỗi lớp lớp phải thực cho riêng giao diện, giống trường hợp kế thừa Bởi giao diện khơng cài đặt nội dung, bạn phải viết code cho lớp, điều có nghĩa chẳng có sử dụng lại đoạn code Nắm vững thay đổi từ “is-a” sang “has-a” Mọi việc thay đổi Trong thời buổi thương mại phát triển, thứ thay đổi nhanh chóng Vì việc lập kế hoạch cho thay đổi đáng giá Nếu bạn có vấn đề nhỏ cần phải có giải pháp nhỏ, bạn khơng cần phải lập kế hoạch lớn lao cho thay đổi Nhưng bạn làm việc dự án nghiêm túc, với khối lượng công việc đáng kể, lúc bạn nên nhìn lại kế hoạch nghiêm túc có thay đổi Các đoạn mã mà bạn viết hôm nay, phải chỉnh sửa lại để phù hợp với yêu cầu phát triển tương lai Hầu hết nhà phát triển không ý tới vấn đề này, sau họ ln ln hối tiếc Vậy câu hỏi đặt dự án phải lớn tới đâu, để bạn quan tâm đến vấn đề thay đổi Đó đánh giá riêng bạn, phần nghệ thuật lập trình Bằng cách nắm vững phương pháp xử lý thay đổi, bạn biết rõ nên thực Có dấu hiệu đáng ý đây: Phân chia đoạn mã dễ thay đổi chương trình riêng biệt với phần cịn lại Và làm cho chúng độc lập tốt cho bảo trì nâng cấp Bạn nên cố gắng tái sử dụng phần nhiều tốt Điều có nghĩa ứng dụng bạn có phần bị thay đổi, bạn đem riêng ra, sau thay đổi phần riêng biệt cách dễ dàng không bị ảnh hưởng tác dụng phụ Và cách để lập kế hoạch cho thay đổi, “kế thừa” lại khơng thể giải tốt thay đổi Với kế thừa, lớp sở lớp có mối quan hệ “is-a” Ví dụ , lớp Helicopter có quan hệ “is-a” với lớp Vehicle, điều có nghĩa Helicopter thừa kế thứ từ Vehicle, bạn phải chỉnh sửa phương thức này, bạn gặp phải vấn đề bảo trì tương lai Lớp sở xử lý phương thức theo cách, lớp kế thừa lại thay đổi nó, lớp lại thay đổi thêm lần Và cuối bạn có lơ lốc biến thể phương thức qua lớp Mặc khác, bạn trích đoạn code dễ thay đổi đóng gói chúng vào đối tượng, bạn sử dụng đối tượng cần Nhiệm vụ xử lý đối tượng Bạn không để việc xử lý lây lan qua lớp Làm cho phép bạn chỉnh sửa mã bạn việc tạo “sự kết hợp” composites đối tượng Với composites “kết hợp” này, bạn dễ dàng chọn sử dụng đối tượng cần thiết Một quan hệ “has-a” tạo Một xe street racer có “has-a” cách để di chuyển, đóng gói vào đối tượng Một máy bay trực thăng có cách riêng để di chuyển, đóng gói vào đối tượng Từng đối tượng thực hành động riêng Một đối tượng, nhiệm vụ thường có ý nghĩa việc kế thừa lớp, tạo hàng tá lớp Nói cách khác, xếp lại dựa nhiệm vụ lớp, kế thừa Sử dụng kế thừa tự động cài đặt thuộc tính cách nghiêm ngặt, bao gồm quan hệ “is-a”, thứ gây rắc rối bảo trì mở rộng Nếu bạn đặt kế hoạch cho thay đổi, bạn nên nghĩ tới quan hệ “has-a” , nơi mà mã bạn bao gồm nhiều đối tượng mà dễ dàng cập nhật có thay đổi xảy Gợi ý: Khi có kế hoạch cho thay đổi, thay quan hệ “is-a” thành quan hệ “has-a” đặt đoạn mã dễ thay đổi vào đối tượng ứng dụng kế thừa chúng KẾ HOẠCH CHỈNH SỬA Làm mà ý tưởng phân chia đoạn mã dễ thay đổi hoạt động ví dụ Vehicle/StreetRacer/Helicopter nhắc trước Theo ý kiến giám đốc điều hành, phần thay đổi nhiều phương thức go , tách Trong thuật ngữ thiết kế mẫu, cách thực phương thức gọi thuật tốn(algorithm) hay gọi chiến lược (strategy) Vì bạn tạo tập hợp giải thuật để sử dụng cho biến bạn StreetRacer, FormulaOne, Helicopter, Jet Làm để phân chia đoạn mã dễ thay đổi vào thuật tốn Từng thuật tốn hồn thành nhiệm vụ Cách tạo thuật toán Để chắn thuật toán thực phương thức (phương thức go trên) Bạn cần phải tạo giao diện interface cho (ND: Interface khái niệm hay OOP, mà có dịp thảo luận nó) sau: Giao diện GoAlgorithm có phương thức go Để chắn thuận tốn sử dụng lớp Vehicle nào, ta cần phải thực interface Thuật toán GoByDrivingAlgorithm , hiển thị văn “Now I’m driving” Và mã thuật tốn: Ngồi ra, thuật tốn GoByFlying, hiển thị văn Now I’m flying Mã sau: Và cuối cùng, thuật toán GoByFlyingFast, sử dụng máy bay phản lực, hiển thị dòng 10 văn Now I’m flying fast Tuyệt vời Bạn vừa phân chia thuật tốn khỏi phần mã Bạn thực thao tác thực thi quan hệ “has-a” quan hệ “is-a” Bây bạn đưa thuật tốn vào sử dụng SỬ DỤNG THUẬT TỐN Bạn có số thuật tốn, bạn tạo đối tượng sử dụng quan hệ “has-a” thay cho “is-a” Sau bạn tạo đối tượng từ thuật toán, bạn cần phải lưu trữ đối tượng Vì thêm vào lớp sở Vehicle, phương thức SetGoAlgorithm Phương thức lưu trữ thuật toán mà bạn muốn sử dụng Mã sau: Bây bạn muốn sử dụng thuật toán cụ thể lớp kế thừa, tất việc cần làm gọi phương thức setGoAlgorithm với đối tượng thuật toán đúng, theo cách sau: Phương thức go lớp Vehicle có chút thay đổi Trước là: Tuy nhiên, phải gọi phương thức định nghĩa lớp thuật toán Mã sau: 10 11 Bây tất phải làm chọn thuật tốn mà bạn muốn sử dụng cho phương tiện Ví dụ với street racer thuật toán GoByDrivingAlgorithm: Xe Formula One sử dụng thuật toán trên, mã sau: Nhưng máy bay trực thăng helicopter sử dụng thuật toán GoByFlyingAlgorithm: Và máy bay phản lực Jet sử dụng thuật toán GoByFlyingFastAlgorithm OK Đã đến lúc chạy thử chương trình Biên dịch chạy thử chương trình sau: 11 12 Kết quả: Kết mong đợi Tuy nhiên bạn sử dụng mối quan hệ “has-a” thay quan hệ kế thừa “is-a” Từ lúc bạn sử dụng thuật tốn xun suốt chương trình, đâu, khơng cịn nằm lớp StreetRacer hay Helicopter Kỹ thuật thay cho cách tạo lớp sử dụng kế thừa Nếu bạn sử dụng quan hệ kế thừa “is-a”, bạn bắt đầu rắc rối cho việc kiểm soát phương thức lớp sở lớp – ví dụ bạn phải nạp đè lên phương thức go cho lớp Helicopter Jet Nếu bạn sử dụng mơ hình “has-a”, bạn tạo dịng họ thuật tốn cách rõ ràng, sau bạn chọn thuật tốn thích hợp để sử dụng Theo cách này, bạn khắc phục vấn đề mà kế thừa gây cho hầu hết lập trình viên: bạn phải giải chức cụ thể qua nhiều hệ lớp, chức liên tục thay đổi, bạn phải chỉnh sửa nhiều mã Mặt khác, bạn tập trung chức vào thuật tốn nhất, việc thay đổi dễ dàng nhiều Quay lại ví dụ trên, ban giám đốc muốn thay đổi từ “Now I’m flying” sang “Now I’m flying at 20 mph” Đơn giản, bạn cần chỉnh sửa thuật toán GoByFlying: Và tất mã bạn tự động cập nhật, bạn khơng cần thiết phải tìm chỉnh sửa lớp trước Theo cách này, bạn tập trung xử lý chức vào đối tượng thuật toán nhất, bạn dễ dàng quản lý đối tượng trường hợp yêu cầu chức bị thay đổi Chọn lựa thuật tốn thực thi chƣơng trình “Đợi chút,” Giám đốc MegaGigaCo nói “Có việc xảy ra, máy bay phản lực khơng bay nhanh, chạy đường băng lúc, đáp xuống mặt đất, lại tiếp tục chạy đường băng Vì phải chỉnh sửa chức cho lại : 12 13 chạy đường băng, bay, chạy tiếp?” “Đó mặt lý thuyết,” lập trình viên rên rỉ “Nhưng điều làm phải viết thêm nhiều đoạn mã nữa” “Khơng cả” Bạn nói “Đó điểm kỳ diệu việc sử dụng đối tượng thuật tốn bên ngồi Bạn thay đổi bạn thực thi chương trình” Khi bạn viết mã cho chức lớp, bạn thay đổi thực thi chương trình Tuy nhiên bạn sử dụng đối tượng thuật toán bên với mối quan hệ “has-a”, bạn dễ dàng thay đổi chức lúc chương trình hoạt động Nói cách khác quan hệ “has-a” cho phép bạn dễ dàng thay đổi quan hệ “is-a” đặc biệt chương trình hoạt động Và ví dụ cho việc sử dụng linh hoạt thuật tốn, việc thay đổi chương trình chạy Bạn tạo máy ban phản lực, chạy đường băng với thuật tốn GoByDrivingAlgorithm, mã sau: Để máy bay phản lực chạy đường băng, bạn gọi phương thức go: Bạn cài đặt thuật tốn setGoAlgorithm cho máy bay phản lực, để thay đổi phương thức go cách linh động, sau gọi lại phương thức go để thấy khác biệt 13 14 Và kết quả: máy bay phản lực, chạy đường băng, bay, chạy đường, không vấn đề Bạn thấy đó, việc chuyển đổi thuật tốn lúc thực thi chương trình dễ dàng Nói cách khác, bạn để việc xử lý thuật toán vào nội lớp, bạn thay đổi lúc chạy chương trình Nhưng bạn cài đặt chiến lược “Strategy”, bạn dễ dàng thay đổi chạy chương trình Tất điều mang đến mẫu thiết kế “Strategy”, hay gọi mẫu “chiến lược” MẪU “STRATEGY” – Mẫu chiến lƣợc Mẫu chiến lược mẫu thiết kế học sách này, thực tế xuyên suốt qua chương để hiểu Ý nghĩa thực mẫu chiến lược bạn tách rời phần xử lý chức cụ thể khỏi đối tượng bạn Sau tạo tập hợp thuật tốn để xử lý chức lựa chọn thuật toán mà bạn thấy đắn thực thi chương trình Mẫu thiết kế thường sử dụng để thay cho kế thừa, bạn muốn chấm dứt việc theo dõi chỉnh sửa chức qua nhiều lớp Chúng ta nhìn thấy vấn đề tổng qt sau Đầu tiên việc ổn, bạn có đối tượng, chức Một thời gian sau đó, yêu cầu đặc biệt, bạn cần có thêm lớp mới, bạn kế thừa lớp cũ, ghi đè lên phương thức thừa hưởng Bạn dàn trải việc xử lý chức qua nhiều lớp hình: 14 15 Mẫu “Strategy”, mẫu chiến lược nói rằng: bạn cần phải tách phần dễ thay đổi đóng gói chúng vào đối tượng bạn sử dụng đối tượng cần Bây bạn chỉnh sửa mã thơng qua việc tạo “kết hợp” đối tượng Khi chương trình thực thi, bạn cần sử dụng đối tượng mà bạn cần Như hình sau: Cuốn sách GoF nói mẫu Strategy, mẫu chiến lược sau: “Định nghĩa tập hợp thuật tốn, đóng gói chúng thành loại một, giúp chúng hốn đổi cho Mẫu chiến lược giúp thuật toán độc lập sử dụng Mẫu chiến lược rằng, đơi khi, áp dụng tốt cho mục đích hướng chức Và đặc biệt quan trọng bạn muốn thực cơng việc nâng cấp, bảo trì cho đoạn mã dễ thay đổi bạn cách riêng biệt với tồn mã chương trình, bạn muốn thay đổi thuật toán sử dụng chương trình thực thi Gợi ý: Bạn nên sử dụng mẫu Strategy có tình sau: Bạn có đoạn mã dễ thay đổi, bạn tách chúng khỏi chương trình để dễ dàng bảo trì Bạn muốn tránh rắc rối, phải thực chức qua nhiều lớp Bạn muốn thay đổi thuật toán sử dụng chạy chương trình 15 16 Chúng tơi khơng cung cấp mã nguồn cho bạn Thay vào đó, bạn làm quen với việc suy nghĩ, ý tưởng tới lúc bạn nắm vững mẫu thiết kế Điều giống công việc phải thực cho mẫu “Chiến lược” Việc hiểu biết cách thức làm việc mẫu thiết kế khác giúp bạn có hội thảo luận với đồng nghiệp khác Hầu hết lập trình viên chuyên nghiệp biết số mẫu thiết kế Và người nhóm bạn nói tới mẫu chiến lược, người gật đầu vẻ hiểu biết, bạn làm 16 ... bạn cài đặt chiến lược “Strategy”, bạn dễ dàng thay đổi chạy chương trình Tất điều mang đến mẫu thiết kế “Strategy”, hay gọi mẫu ? ?chiến lược? ?? MẪU “STRATEGY” – Mẫu chiến lƣợc Mẫu chiến lược mẫu thiết... Bạn nhìn thấy kế thừa ví dụ trước, lớp Shape: Sau lớp Rectangle kế thừa từ lớp Shape sau: Đa hình thường xuất bạn làm việc với mẫu thiết kế mẫu thiết kế có xu hướng ủng hộ “kết hợp” ? ?kế thừa” (Bạn... đó, bạn làm quen với việc suy nghĩ, ý tưởng tới lúc bạn nắm vững mẫu thiết kế Điều giống công việc phải thực cho mẫu ? ?Chiến lược? ?? Việc hiểu biết cách thức làm việc mẫu thiết kế khác giúp bạn