MỤC LỤC
Interface chỉ ₫ươc dung trong trương hơp ₫ăc bi t va kh ng tương ₫ương vơi abstract type.
Bử mửn Cửng nghù phờ̀n mù̀m Khoa CNTT. ĐH Bach Khoa Tp.HCM. Mửn Phõn tớch & Thiết kế hướng ₫ối tượng dựng UML Slide 39. Bử mửn Cửng nghù phờ̀n mù̀m Khoa CNTT. ĐH Bach Khoa Tp.HCM. Mửn Phõn tớch & Thiết kế hướng ₫ối tượng dựng UML Slide 41. package graphics;. public class Circle extends Graphic implements Draggable {. la package default. trong phat bi ̉u package).
Mửn Phõn tớch & Thiết kế hướng ₫ối tượng dựng UML Slide 55 Chương 3: Nguy n tăc dịch OOP.
Mửn Phõn tớch & Thiết kế hướng ₫ối tượng dựng UML Slide 63 Chương 3: Nguy n tăc dịch OOP.
Mửn Phõn tớch & Thiết kế hướng ₫ối tượng dựng UML Slide 65 Chương 3: Nguy n tăc dịch OOP.
Mửn Phõn tớch & Thiết kế hướng ₫ối tượng dựng UML Slide 105 Trương Đai Hoc Bach Khoa Tp.
Mửn Phõn tớch & Thiết kế hướng ₫ối tượng dựng UML Slide 117 C us tom er.
Mửn Phõn tớch & Thiết kế hướng ₫ối tượng dựng UML Slide 127 Trương Đai Hoc Bach Khoa Tp.
Mửn Phõn tớch & Thiết kế hướng ₫ối tượng dựng UML Slide 147 Trương Đai Hoc Bach Khoa Tp.
Mửn Phõn tớch & Thiết kế hướng ₫ối tượng dựng UML Slide 175 Trương Đai Hoc Bach Khoa Tp.
₫ểbiếtứng dụng chạy₫úng hay sai theo yêu cầu, lịch sử gọi hàm trong call strack, thêm/bớt các ₫iều kiện dừng,… ₫iều khiển việc thi hành tiếp theo của ứng dụng, lúc nàyứng dụng sẽchuyển sang chế ₫ộ Running. Mỗi khiứng dụng₫ược chạy tiếp, nó chuyển qua chế ₫ộRunning, nhưng sẽnhanh chóng chạy₫ến lệnh dừng và chuyển vềchế ₫ộPause (trừphi bị'blocked' chờI/O hay bị'loop' trong các vòng lặp vô tận).
Trong quá trình debug, ứng dụng ở chế ₫ộ Pause chủ yếu thời gian và người debug tương tác vớiứng dụng chủyếuở chế ₫ộnày. Đểhiệu chỉnh giá trị của 1 biến nào ₫ó (do ₫ã bị sai, nhưng muốn sửa lại cho ₫úng hầu có thể kiểm thử các lệnh còn lại), người debug có thể dời cursor về cell chứa giá trị hiện hành của biến ₫ó (trong cửa sổ Variable hay trong cửa sổ Watch rồi hiệu chỉnh lại giá trị mới).
dời chuột ₫ến tên biến trong cửa sổ code, 1 cửa sổ nhỏ chứa giá trị của biến. nhập biểu thức (thường là biến dữliệu) vào vùng Name của cửa sổWatch ₫ể xem nội dung của nó.
Xem danh sách các ₫iểm dừng hiện hành, có thể xóa hết chúng bằng cách chọn button “Remove All”, có thể xóa từng ₫iểm dừng bằng cách chọn nó rồi ấn button “Remove”. Muốn thiết lập ₫iểm dừng mới, chọn tab “Location”, nhập vị trí lệnh cần dừng và ₫iều kiện dừng mong muốn (mặc ₫ịnh là luôn luôn dừng ở vị trí qui ₫ịnh).
Muốn thiết lập ₫iểm dừng mới dựa trên 1 biến nào ₫ó bị thay ₫ổi giá trị, chọn tab “Data”, nhập biểu thức cần tính toán (biến cần quan tâm). Muốn thiết lập ₫iểm dừng mới dựa trên thông báo (message) của Windows, chọn tab “Message”, chọn hàm xử lý, chọn thông báo cần dừng.
Ta có thể(và nên) thiết lập nhiều ₫iểm dừng₫ồng thời ₫ể'rào chắn' nhiều luồng thi hành khác nhau của chương trình. chọn menu Debug.Break ₫ể dừng ₫ột ngột việc chạy ứng dụng, lệnh ₫ang thực hiện sẽ ₫ược₫ỏnh dấu₫ểta dễtheo dừi.
chọn menu Debug.Restart₫ểkết thúc việc chạyứng dụng rồi bắt₫ầu chạy lại từ ₫ầu. Nếuứng dụng₫ang bị 'block' chờ biến cốI/O, sẽkhông có lệnh nào₫ược dánh dấu cả.
Thiết kế phần mềm là một vấn ₫ề rất khó khăn, nhất là khi phần mềm lớn, mối quan hệ giữa các phần tử nhiều →bản thiết kế thường không hiệu quả hoặc có lỗi. Mục tiêu của thiết kế: không chỉ thiết kế những phần mềm ₫úng mà còn có thể hạn chế hoặc hỗ trợ tái thiết kế trong tương lai.
Các lỗi thiết kế thường phải trả giá cao do ảnh hưởng ₫ến nhiều giai. Tuy nhiên việc xây dựng những phần mềm HĐT như thế phụ thuộc nhiều vào khả năng người thiết kế.
Một biện pháp ₫ược ₫ề xuất ₫ể có những bản thiết kế tốt: sử dụng lại những mẫu thiết kế của những chuyên gia ₫ã qua kiểm nghiệm thực tế. Giúp người tìm hiểu nắm vững hơn ₫ặc ₫iểm ngôn ngữ lập trình, nhất là lập trình hướng ₫ối tượng.
Có nhiều loại Software patterns: analysis patterns, design patterns, organization patterns, process patterns… Bài giảng này chỉ tập trung vào Object Oriented Design Patterns (từ ₫ây về sau gọi là Design Patterns hay mẫu thiết kế). Structural — Cung cấp cơ chế xử lý những lớp không thể thay ₫ổi (lớp thư viện của third party…), ràng buộc muộn (lower coupling) và cung cấp các cơ chế khác ₫ể thừa kế.
Creational — Khắc phục các vấn ₫ề khởi tạo ₫ối tượng, hạn chế sự phụ thuộc platform. Behavioral — Che dấu hiện thực của ₫ối tượng, che dấu giải thuật, hỗ trợ việc thay ₫ổi cấu hình ₫ối tượng một cách linh ₫ộng.
Xác ₫ịnh số lượng và kích thước ₫ối tượng: trong trường hợp hệ thống cần ràng buộc số lượng xác ₫ịnh ₫ối tượng ₫ang hoạt ₫ộng hay người thiết kế băn khoăn về việc nên tập trung một số chức năng nào ₫ó vào trong 1 ₫ối tượng hay tách ra thành nhiều ₫ối tượng. Giúp thiết kế theo hướng tái sử dụng và linh ₫ộng bằng cách sử dụng mối quan hệ giữa các ₫ối tượng (bao gộp, thừa kế…) một cách phù hợp và thiết kế theo hướng tiên ₫oán trước các thay ₫ổi trong tương lai.
Tìm kiếm ₫ối tượng: việc phân chia hệ thống thành một tập hợp các ₫ối tượng hoạt ₫ộng hiệu quả là công việc khó khăn. ₫ưa ra những ₫ối tượng thường gặp trong những trường hợp thiết kế tương tự ₫ã gặp trước ₫ây.
Các mẫu cấu trúc (Structural Patterns) tập trung giải quyết vấn ₫ề kết hợp các lớp và/hoặc ₫ối tượng thành một kiến trúc lớn hơn. Các mẫu cấu trúc ₫ối tượng (structural object patterns) tập trung vào việc kết hợp các ₫ối tượng ₫ể thực hiện những chức năng nào ₫ó.
Tương tự quá trình ₫a thừa kế: một lớp thừa kế từ nhiều lớp cha sẽ mang ₫ặc ₫iểm của tất cả các lớp cha gộp lại. Trong các slide tiếp theo, chúng ta sẽ tìm hiểu các mẫu: Adapter, Composite, Proxy, Decorator, Facade, Flyweight.
Các mẫu cấu trúc lớp (structural class patterns) sử dụng thừa kế ₫ể kết hợp các lớp hay các interface.
muốn dùng một lớp ₫ã có sẵn nhưng interface của nó không tương thích với interface ₫ang sử dụng trong khi chúng ta chỉ muốn dùng interface. (₫ối với mẫu object adapter) muốn sử dụng nhiều lớp con ₫ã có sẵn nhưng sẽ không hiệu quả nếu phải chuyển interface (bằng mẫu Adapter) của từng lớp con.
muốn tạo ra các lớp có thể giao tiếp với các lớp khác nhưng chưa biết trước interface của những lớp ₫ó.
Khai báo interface và hiện thực một số tác vụ chung cho các ₫ối tượng của những lớp thừa kế (gọi chung là các component). Ví dụ: compiler (chương trình con hay module có thể bao gộp các chương trình con hay module khác…); chương trình giao diện GUI (window là ₫ối tượng phức, button là ₫ối tượng ₫ơn); chương trình text editor….
Mục tiêu : Cung cấp ₫ối tượng ₫ại diện cho một ₫ối tượng khác ₫ể hỗ trợ hoặc kiểm soát quá trình truy xuất ₫ối tượng ₫ó. Những ₫ối tượng lớn khi khởi tạo sẽ tốn nhiều tài nguyên, do ₫ó nên trì hoãn thời ₫iểm khởi tạo thực sự các ₫ối tượng này.
kiểm soát quá trình truy xuất ₫ến ₫ối tượng RealSubject, có thể tạo hoặc delete ₫ối tượng này. + virtual proxy: chứa các thông tin về ₫ối tượng realSubject ₫ể có thể khởi tạo lại nó sau này.
₫ịnh nghĩa interface cho các ₫ối tượng mà ta cần thêm trách nhiệm cho chúng 1 cách ₫ộng. chứa tham khảo ₫ến ₫ối tượng Component và ₫ịnh nghĩa interface tương thích với interface của Component.
Để dịch source code, ta có thể viết 1 ứng dụng gọi dịch vụ của từng class ₫ể duyệt token, parser, xây dựng cây cú pháp, tạo code ₫ối tượng. Cách khắc phục là ₫ịnh nghĩa 1 class mới với giao tiếp hợp nhất tên là Compiler, nó cung cấp 1 hàm Compile (file), ứng dụng nào cần dịch source code chỉ cần gởi thông ₫iệp Compile ₫ến ₫ối tượng Compiler.
tối thiểu hóa tính "coupling" giữa các hệ thống con ₫ể tối thiểu hóa giao tiếp giữa các hệ thống con. hệ thống con biên dịch có nhiều class phục vụ các bước biên dịch rời ràc như Scanner, Parser, ProgramNode, BytecodeStream,.
Mục tiêu : cung cấp interface hợp nhất cho tập các interface của 1 hệ thống con. Facade ₫ịnh nghĩa 1 interface cấp cao hơn các interface có sẵn ₫ể làm cho hệ thống con dễ sử dụng hơn.
₫ịnh nghĩa interface cho ₫ối tượng nhận yêu cầu và hoạt ₫ộng theo trạng thái ngoài. nhiều nhóm ₫ối tượng có thể ₫ược thay thế bằng 1 số nhỏ ₫ối tượng khi các trạng thái ngoài của chúng bị loại bỏ.
Mửn Phõn tớch & Thiết kế hướng ₫ối tượng dựng UML Slide 263 Trường Đại Học Bách Khoa Tp.
Khi ₫ó nếu muốn thay ₫ổi lớp sẽ tạo ₫ối tượng thì chỉ cần tạo một subclass thừa kế MazeGame, trong ₫ó override các phương thức khởi tạo ₫ối tượng ở trên. CreateMaze ₫ược truyền 1 ₫ối tượng mà có thể tạo mêlộ mới dùng các tác vụ thêm phòng, cửa và tường vào mêlộ mà nó xây dựng rồi ta dùng thừa kế ₫ể thay ₫ổi các phần của mêlộ hay cách thức xây dựng mêlộ.
Truyền cho phương thức CreateMaze một ₫ối tượng có khả năng sinh ra room, wall, door theo ₫ặc thù của ứng dụng. Code trong CreateMaze gọi các phương thức thông thường (hoặc virtual) ₫ể khởi tạo ₫ối tượng thay vì gọi constructor của lớp tương ứng.
CreateMaze ₫ược truyền các ₫ối tượng room, door, wall có khả năng sinh ra ₫ối tượng tương tự chúng (clone). Để khởi tạo một ₫ối tượng cụ thể, cần xây dựng 2 lớp concrete: một lớp hiện thực interface AbstractFactory ₫ể khởi tạo ₫ối tượng từ lớp hiện thực.
Cung cấp interface cho các ₫ối tượng dự ₫ịnh sẽ ₫ược khởi tạo khi hệ thống chạy, gọi là AbstractProduct.
Client dựa vào interface của các ₫ối tượng ConcreteProduct ₫ược khai báo trong AbstractProduct ₫ể sử dụng các ₫ối tượng này. hệ thống muốn tương tác với một họ trong một tập hợp họ ₫ối tượng và việc chọn họ ₫ối tượng ₫ược xác ₫ịnh tại thời ₫iểm run-time.
chương trình nhất quán trong việc sử dụng một họ các phần tử của cùng một kiểu maze, không xảy ra trường hợp 2 phần tử của 2 họ khác nhau cùng tồn tại trong code của client. việc bổ sung một loại phần tử vào maze sẽ gặp khó khăn vì phải bổ sung vào lớp MazeFactory, do ₫ó sẽ ảnh hưởng ₫ến hầu như tất cả các lớp khác.
một lớp muốn lớp con của mình thay ₫ổi hay xác ₫ịnh lớp của ₫ối tượng cần khởi tạo. một lớp muốn chuyển quá trình hiện thực một nhiệm vụ nào ₫ó cho một trong các lớp con nhưng cho phép ứng dụng xác ₫ịnh lớp con cụ thể.
Định nghĩa các lớp thừa kế từ các lớp thể hiện các phần tử tương ứng VD: RoomWithABomb thừa kế Room. Định nghĩa lớp thừa kế lớp MazeGame, trong lớp này override factory method tạo ra ₫ối tượng muốn thay ₫ổi.
Class có thể cung cấp phương thức ₫ể set giá trị cho ₫ối tượng sau khi ₫ược tạo ra bằng cách copy từ prototype. Nếu số lượng prototype trong ứng dụng không cố ₫ịnh, nên quản lý chúng bằng một ₫ối tượng prototype manager.
Đối tượng này chứa các tham khảo ₫ến các prototype và các key tương ứng ₫ể truy xuất chúng.
Định nghĩa lớp MazePrototypeFactory thừa kế lớp MazeFactory, ₫ối tượng lớp này ₫ược cung cấp các prototype ₫ể tạo ra các ₫ối tượng cùng loại. Khi bổ sung phần tử sản phẩm mới (VD: roomWithABomb), không cần phải cung cấp lớp Factory (BombedMazeFactory) ₫ể sinh ra các sản phẩm này mà chỉ cần cung cấp prototype của sản phẩm ₫ó.
xây dựng và lắp ghép các phần của Product bằng cách hiện thực interface của class Builder. bao gồm các class ₫ịnh nghĩa các thành phần bao gồm interface phục vụ việc lắp ghép các thành phần thành kết quả cuối cùng.
Ta hiệu chỉnh hàm CreateMaze() của class MazeGame thành : Maze* Mazegame::CreateMaze (MazeBuilder& builder) {. Ta có thể ₫ịnh nghĩa các subclass của class MazeBuilder ₫ể tạo ra các Maze khác nhau và tạo ₫ối tượng của subclass này rồi truyền nó như là tham số của hàm CreateMaze() ₫ể tạo các Maze khác nhau.
Cộng tác giữa các ₫ối tượng : các clients truy xuất instance của class Singleton thông qua việc gọi tác vụ Instance() của class.
Các slide sau sẽ giới thiệu các pattern Chain of Responsibility, Template Method (class pattern), Strategy (object pattern) và Command (object Pattern),.
hơn 1 ₫ối tượng có thể xử lý request nhưng ₫ối tượng nào sẽ xử lý thì chưa biết trước. bạn muốn gởi request ₫ến 1 ₫ối tượng xử lý nào ₫ó nhưng không xác ₫ịnh rừ ràng.
ConcreteClass (MyApplication) : hiện thực các primitive operation ₫ể can thiệp một phần vào quá trình thực hiện hoạt ₫ộng ở lớp cha. kiểm soát quá trình override của lớp con: chỉ cho phép override những ₫iểm hook qui ₫ịnh sẵn.
₫ịnh nghĩa các primitive operation cho lớp con override ₫ể hiện thực một phần của hoạt ₫ộng. hiện thực một phần cố ₫ịnh của hoạt ₫ộng và cho phép lớp con hiện thực phần có thể thay ₫ổi.
Có thể nhận pointer ₫ến ₫ối tượng Context trong quá trình khởi tạo ₫ối tượng ₫ể truy xuất dữ liệu trong Context. Một lớp có nhiều hành vi loại loại trừ lẫn nhau và quá trình chuyển từ hành vi này sang hành vi khác cần ₫ược thực hiện dễ dàng.
tại thời ₫iểm dịch: chỉ sử dụng ₫ối tượng kiểu Strategy khi xác ₫ịnh giải thuật cho vấn ₫ề cần xử lý. tại thời ₫iểm run-time: ₫ược cung cấp một ₫ối tượng giải thuật cụ thể thay thế cho ₫ối tượng Strategy.
Phần tử nhận của PasteCommand là ₫ối tượng Document mà PasteCommand ₫ược cung cấp trong lúc "instantiation". Tác vụ Execute của OpenCommand thì khác : nó hiển thị cửa sổ yêu cầu user nhập tên document rồi tạo ₫ối tượng Document tương ứng,.
hành vi của ₫ối tượng phụ thuộc vào trạng thái của nó và phải thay ₫ổi run- time khi trạng thái thay ₫ổi. các tác vụ có những lệnh ₫iều kiện số học lớn phụ thuộc vào trạng thái ₫ối tượng.
khi việc thay ₫ổi ₫ối tượng này ₫òi hỏi phải thay ₫ổi các ₫ối tượng khác nhưng bạn không biết trước có bao nhiêu ₫ối tượng cần thay ₫ổi. khi ₫ối tượng cần có khả năng cảnh báo các ₫ối tượng khác nhưng không muốn chúng ghép nối chặt với nhau.