Professional Documents
Culture Documents
06-Thiet Ke Lop
06-Thiet Ke Lop
Thiết kế lớp
1 2
Nội dung
Từ các lớp phân tích tới các thành phần thiết kế
Lớp phân tích Thành phần thiết kế
1. Tạo các lớp khởi tạo <<lớp biên>>
6. Sơ đồ lớp
<<lớp biên>>
<<subsystem>>
Subsystem
3
Quan hệ ánh xạ nhiều-nhiều (n-n)
3 4
1
Nhận diện các lớp thiết kế Class Design Considerations
❖Một lớp phân tích ánh xạ trực tiếp tới một lớp
thiết kế nếu:
▪ Đó là một lớp có cấu trúc đơn giản ❖Ký pháp
▪ Chỉ biểu diễn một sự logic trừu tượng ▪ Boundary (lớp biên)
❖Những lớp phân tích phức tạp hơn có thể ▪ Entity (lớp thực thể)
▪ Chia nhỏ thành nhiều class ▪ Control (lớp điều khiển)
▪ Chuyển thành package ❖Áp dụng các mẫu thiết kế (design pattern)
▪ Chuyển thành subsystem (thảo luận ở sau)
▪…
5 6
<<subsystem>>
MainForm
7 8
2
Những chiến lược để nhận diện ra các lớp
điều khiển
Những chiến lược thiết kế các lớp điều khiển
❖Các lớp điều khiển thường mang tính chủ động và ❖Những vấn đề đặt ra với các lớp điều khiển?
❖Những yêu cầu về hiệu năng có thể bắt buộc chúng ta phải tái cấu trúc ▪Chúng thực sự cần thiết không?
(refactoring)
Analysis Design ▪Có nên chia nhỏ ra?
<< Entity >>
FatClass
FatClass ❖Việc quyết định dựa vào?
- privateAttr
- privateAttr
+ getCommonlyUsedAttr1()
▪Độ phức tạp
- commonlyUsedAttr1
- commonlyUsedAttr2
- rarelyUsed1
+ getCommonlyUsedAttr2()
+ getRarelyUsedAtt1() ▪Khả năng thay đổi
- rarelyUsed2 + getRarelyUsedAtt2() ▪Khả năng phân bổ và hiệu năng
1 0..1
▪Quản lý giao dịch
FatClassDataHelper FatClassLazyDataHelper
- commonlyUsedAttr1 - rarelyUsedAttr1
- commonlyUsedAttr2 - rarelyUsedAttr2
9 10
9 10
Package
Name
11 12
3
Gom nhóm các lớp có chức năng liên quan
Gợi ý trong việc gom nhóm các lớp biên tới nhau
• Những tiêu chí để xem xét các lớp có liên quan về
Nếu như giao diện hệ thống sẽ trải If it is unlikely the system interface mặt chức năng hay không :
qua những sự thay đổi đáng kể will undergo considerable changes • Sự thay đổi trong hành vi và cấu trúc của một class làm
thay đổi các class khác
• Xóa một class sẽ tác động tới những class khác
• Hai đối tượng có sự trao đổi thông điệp qua lại nhiều
hoặc có sự giao tiếp qua lại phức tạp
• Một lớp biên có thể liên quan về mặt chức năng với lớp
thực thể nếu chức năng của lớp biên đó là biểu diễn
thực thể
• Hai class tương tác hoặc chịu ảnh hưởng cùng bởi một
tác nhân
Đặt các lớp biên và những Các lớp biên được gom nhóm với
package riêng biệt những lớp có chức năng liên quan
13 14
❖Những tiêu chí để không đặt hai class cùng chung + Class A3
một package:
▪ Hai class liên quan tới các nhân khác nhau B
Chỉ những class được
khai báo public thì
▪ Một class tùy chọn và một class mang tính bắt buộc PackageB mới có thể đợc tham
chiếu từ bên ngoài
Public visibility + Class B1 package
- Class B2
Private visibility
15 16
4
Package Coupling: Gợi ý Ví dụ: Registration Package
1 1
Upper A
0..1 0..1
• Các package ở tầng dưới Layer <<boundary>> <<boundary>>
không nên phụ thuộc vào RegisterForCoursesForm CloseRegistrationForm
các package ở tần trên
X X
Lower
B 1
Layer
1 1
• Về cơ bản sự phụ thuộc <<control>>
RegistrationController
<<control>>
CloseRegistrationController
không nên nhảy cóc qua C
17 18
<<entity>>
<<entity>> Schedule
Student 1 0..*
primaryCourses alternateCourses
0..2
<<entity>> 0..4
<<entity>> <<entity>> 0..*
PrimaryScheduleOfferingInfo <<entity>> instructor <<entity>> <<entity>>
FulltimeStudent ParttimeStudent
Professor CourseOffering Course
0..*
0..1 0..* 0..* 1
Prerequisites
0..*
1
CourseOfferingList
19 20
5
Ví dụ: External System Interfaces Package Nội dung
22
21 22
2.1. Định nghĩa các thao tác Name and Describe the Operations
❖Các thông điệp được hiển thị trong các sơ đồ tương tác ❖ Create appropriate operation names
▪ Indicate the outcome
:CourseRegistrationController
▪ Use client perspective
::SubjectInfo
SubjectInfo
▪ Are consistent across classes
SubjectInfo
getSubjectPrerequisites()
❖ Define operation signatures
▪ operationName([direction]parameter: class,..) :
getSubjectPrerequisites() returnType
❖Các chức năng phụ thuộc cài đặt • Direction is in (default), out or inout
▪ Chức năng quản lý • Provide short description, including meaning of all parameters
▪ Cần cho việc sao chép các class
▪ Cần cho việc kiểm thử chất lượng
23 24
23 24
6
Đặc tả cho chương trình Hướng dẫn: Thiết kế chữ ký cho các thao
/** ❖Khi thiết kế các chữ ký cho các thao tác ta cần
* Parse XML data into a DOM representation, taking local resources and Schemas into account. tác (operation signatures)
quan tâm nếu như các tham số truyền vào là:
* @param inputData a string representation of the XML data to be parsed.
* @param validating whether to Schema-validate the XML data ▪ Tham chiếu hoặc tham trị
* @return the DOM document resulting from the parse
* @throws ParserConfigurationException if no parser could be created
▪ Bị thay đổi bởi operation đó
* @throws SAXException if there was a parse error ▪ Tùy chọn (có thể có hoặc không )
* @throws IOException if there was a problem reading from the string
*/
▪ Gán giá trị mặc định
public static Document parseDocument(String inputData, boolean validating) throws ParserConfigurationException, ▪ Trong miền giá trị không hợp lệ
SAXException, IOException {
//Change to UnicodeReader for utf-8 ❖Càng ít tham số thì càng tốt
...
} ❖Truyền các đối tượng thay vì các bit dữ liệu
25 26
25 26
Private
operations
Class1
- privateAttribute
+ publicAttribute
# protectedAttribute
Public Protected - privateOperation ()
operations operations
+ publicOPeration ()
# protecteOperation ()
27
27 28
7
Course Registration CS: Operations for
Phạm vi CourseInfo. and CourseRegistrationController
❖Nhận diện số lượng đối tượng thực thể của các
thuộc tính/thao tác
▪ Đối tượng thực thể: một đối tượng cho mỗi đối tượng
lớp CourseInfo
▪ Đối lượng lớp: một đối tượng cho tất cả các đối tượng + getCourseInfo(String): CourseInfo.
lớp
❖ Phạm vi của lớp được biểu thị bởi dấu gạch dưới
tên của các thuộc tính
CourseRegistrationController
+ registerForCourse(String, String): void
- checkPrerequisiteCondition(): boolean
Class1
- classifierScopeAttr - checkTimeAndSubjectConfliction(): boolean
- instanceScopeAttr - checkCapacityConfliction(): boolean
+ classifierScopeOp ()
+ instanceScopeOp29() 30
29 30
31 32
31 32
8
Mỗi quan hệ giữa các class 3.1. Association là gì?
▪Association ▪Mối quan hệ về mặt ngữ nghĩa giữa hai hoặc
(kết hợp) nhiều class thiết lập nên sự liên kết giữa các
đối tượng tạo ra từ các class đó
▪Một mối quan hệ về mặt cấu trúc, thể hiện
▪Aggregation (kết tập) rằng các đối tượng của một vật thì được liên
▪Composition (hợp thành) kết tới đối tượng của vật khác
33 34
33 34
Sơ đồ lớp
Tên vai trò
Client 0..* 0..* Supplier
<<entity>>
PerformResponsibility() SubjectInfo
kết hợp
điều kiện tiên quyết
Mối quan hệ cho mỗi liên kết 35 36
35 36
9
3.1.2. Multiplicity là gì? Các giá trị chỉ số
37 38
/* Methods */
}
<<entity>> <<entity>> // InsuranceContract.java file
0..* 1
CourseInfo. Subject
public class InsuranceContract
{
0..*
private InsuranceCompany refers_to;
điều kiện tiên quyết 0..3
/* Methods */
}
@Nguyễn Thị Thu Trang,
39
trangntt@soict.hust.edu.vn
40
39 40
10
3.1.3. Các loại liên kết Review: Kết tập là gì?
❖Một dạng đặc biệt của kết hợp (association), mô
❖ Association Car Driver
hình hóa nên mối quan hệ tổng thể - bộ phận giữa
▪ use-a (sử dụng)
một lớp kết tập-aggregate (the whole) và các phần
của nó
▪ Các đối tượng của một class được kết hợp với các
đối tượng của class khác ▪ Kết tập là mối quan hệ "is a part of" (là một phần của).
❖ Aggregation Car Door ❖Multiplicity được biểu diễn như các liên kết khác.
▪ có / là một phần
▪ Liên kết mạnh, một đối tượng của một lớp tạo ra các
đối tượng của lớp khác tổng thể bộ phận
❖ Composition
▪ Kết tập mạnh, đối tượng được hợp thành không thể
được chia sẻ bởi các đối tượng khác và chết đi cùng <<entity>> <<entity>>
CourseInfo. CourseRegistrationInfo
với lớp kết tập nó Car Body 0..*
1
▪ Chia sẻ vòng đời
41 42
41 42
thành phần.
▪ Thành phần sẽ bị mất đi khi tổng thể bị mất đi.
▪ Thành phần có thể bị bỏ đi trước khi tổng thể bị phá
hủy. CourseRegistrationForm 1 CourseRegistrationController
1
Whole Part
43 44
43 44
11
Dùng association hay aggregation? Aggregation – Cài đặt trong java
class Car {
❖Nếu 2 đối tượng được gắn chặt bởi một mối quan private List<Door> doors;
Car Door
1 0..2,4
@Nguyễn Thị Thu Trang,
Nếu nghi ngờ, hãy chọn association. 45
trangntt@soict.hust.edu.vn
46
45 46
final class Car { ❖Chỉ ra một class liên kết có thể điều hướng tới một
// For a car to move, it need to have a engine. class mục tiêu khi sử dụng association hay không
private final Engine engine; // Composition
//private Engine engine; // Aggregation
Car(Engine engine) {
this.engine = engine;
<<control>>
}
CourseRegistrationController
47 48
12
Sự điều hướng: Hướng nào thì thực sự cần
thiết? Ví dụ: Điều chỉnh hướng
❖Số lượng Schedules thì nhỏ hoặc
không cần một danh sách Schedules
❖Khai thác sơ đồ tương tác để CourseInfo xuất hiện
Schedule CourseInfo.
❖Thậm chỉ ngay cả khi cả hai hướng dường như được + primaryCourses
yêu cầu, một hướng cũng có thể thực hiện ❖số lượng CourseInfo thì nhỏ, hoặc
0..* 0..4
▪ Sự điều hướng theo một phía thường không phổ biến không cần một danh sách
▪ Số lượng đối tượng của một class nhỏ CourseInfo cho một Schedule
? cả hai phía
49 50
51 52
51 52
13
Associations vs. Dependencies in
Collaborations
3.2.1. Tầm nhìn biến cục bộ
❖Một đối tượng của associton là một liên kết ❖op1() operation chứa một biến cục bộ với loại dữ
▪Tất cả các liên kết trở thành liên kết ngoại trừ liệu là ClassB
global, local, parameter
▪Các mối quan hệ là phụ thuộc ngữ cảnh
❖Dependencies là những liên kết tạm thời: ClassA
▪Giới hạn về mặt thời gian
+ op1 ( )
▪Mối quan hệ độc lập về mặt ngữ cản
▪Một mối quan hệ tổng quát
ClassB
Một dependency là một loại quan hệ thứ cấp, không cung cấp nhiều thông tin về
quan hệ. Để xem chi tiết bạn cần kiểm tra sự giao tiếp giữa các class
53 54
53 54
3.2.2 Tầm nhìn theo dạng tham số 3.2.3. Tầm nhìn toàn cục
❖Đối tượng của ClassB được truyền tới đối tượng ❖Đối tượng ClassUtility thì có thể nhìn được bởi vì
của ClassA nó là toàn cục
ClassA
ClassA
+ op1 ([in] aParam : ClassB) + op1 ( )
ClassB
ClassB
+ utilityOp ( )
55 56
55 56
14
Nhận diện sự phụ thuộc 3.3. Tổng quát hóa
❖Một mối quan hệ giữa các class nơi mà một class
chia sẻ cấu trúc và/hoặc hành vi của một hoặc
❖Quan hệ bền vững — Association (tầm nhìn trường nhiều class.
dữ liệu)
❖Định nghĩa một sự phân cấp tính trừu tượng nơi
❖Quan hệ tạm thời — Dependency các class con kết thừa từ một hoặc nhiều class cha.
▪ Nhiều đối tượng chia sẻ cùng đối tượng
• Truyền đối tượng theo dạng tham số (parameter visibility)
▪ Đơn kế thừa
• Tạo một đối tượng toàn cục (global visibility) ▪ Đa kế thừa
▪ Nhiều đối tượng không chia sẻ cùng đối tượng (local ❖Là mối quan hệ "is a kind of" (là một loại của)
visibility)
❖Thời gian khởi tạo và phá hủy hết bao lâu?
▪ Chi phí cao? Sử dụngtầm nhìn trường, tham số hoặc toàn
cục
▪ Cố gắng tạo ra các mối quan hệ đơn giản nhất có thể
57 58
57 58
+ withdraw()
4. Định nghĩa ra các trạng thái
+ createStatement()
5. Định nghĩa ra các thuộc tính
Generalization
Relationship 6. Sơ đồ lớp
Subclasses
(children)
Savings Checking
Descendents 59 60
59 60
15
4. Định nghĩa các trạng thái Máy trạng thái là gì?
❖Mục đích ❖Một sơ đồ có hướng của các trạng thái được liên kết
▪ Thiết kế cách trạng thái của đối tượng ảnh hưởng đến hành vi
với nhau bằng các dịch chuyển
của nó ❖Mô tả lịch sử vòng đời của một đối tượng
▪ Thiết kế máy trạng thái để mô hình hóa hành vi này
Guard Condition
❖Những điều cần quan tâm:
Event Activity
▪ Những đối tượng nào có những trạng thái quan trọng?
▪ Làm thế nào để xác định được các trạng thái có thể của một State1
Event(args)[guard condition]/activity
State2
đối tượng?
▪ Làm thế nào để máy trạng thái ánh xạ tới phần còn lại của mô
hình?
Transition
State State
61 62
61 62
63 64
63 64
16
Nhận diện các sự kiện
Nhận diện sự chuyển dịch
❖Với mỗi trạng thái, xác định sự kiện nào gây ra sự
❖Nhìn vào các thao tác của class, interface chuyển dịch tới trạng thái đó, bao gồm các điều kiện khi
cần thiết
CourseInfo.
❖Các chuyển dịch mô tả những điều xảy khi có sự phải
0..* Lecturer hồi lại với sự kiện nhận được
+ addLecturer() 0..1
+ removeLecturer()
CourseInfo 0..*
Lecturer
+ addLecturer() 0..1
+ removeLecturer()
Events: addLecturer,
removeLecturer Unassigned
removeLecturer addLecturer
65 Assigned 66
65 66
▪ Được thực thi khi trạng Entry/anAction / numStudents = 0 removeStudent [numStudents >0]/ numStudents = numStudents - 1
closeRegistration [numStudents<3]
67 68
17
Đối tượng nào có những trạng thái
quan trọng Máy trạng thái ánh xạ tới phần còn lại
của mô hình như thế nào?
❖Các sự kiện có thể ánh xạ tới các thao tác
❖Những đối tượng mà vai trò của nó được phân biệt
bởi các chuyển dịch ❖Các phương thức nên được cập nhật cùng các thông tin
trạng thái cụ thể
❖Các usecase phức tạp và bị điều khiển bởi trạng thái ❖Các trạng thái thường được biểu diễn sử dung các thuộc tính
❖Không cần thiết để mô hình hóa các đối tượng như: ▪ Diều này đóng vai trò như đầu vào cho "Định nghĩa các thuộc tính"
bước
▪Những đối tượng có sự ánh xạ đơn giản với cài đặt
▪Những đối tượng không bị điều khiển bởi trạng thái CourseInfo.
▪Những đối tượng có duy nhất một trạng thái tính toán - numStudents
+ addStudent()
[numStudents<10] [numStudents>=10]
69 70
69 70
<<stereotype>>
1. Tạo các lớp khởi tạo ClassName
2. Định nghĩa ra các thao tác/phương thức Attribute : Type = InitValue
Attribute : Type = InitValue
3. Định nghĩa ra mối quan hệ giữa các lớp Attribute : Type = InitValue
courseID: String
6. Sơ đồ lớp description: String
attribute startDate: DateTime
endDate: DateTime
lecturer: Lecturer
location: String
71 72
71 72
18
5.1. Nhận diện các thuộc tính 5.1. Nhận diện các thuộc tính (2)
❖Những đặc trưng của các class xác định ❖Kiểm tra các mô tả về phương thức
❖Thông tin được lưu giữ bởi các class xác ❖Kiểm tra các trạng thái
định ❖Kiểm tra bất kỳ thông tin nào
❖Những “Danh từ” không tạo thành class ❖mà bản thân class đó cần duy trì
▪Những thông tin mà giá trị của nó không quan
trọng
▪Những thông tin duy nhất được sở hữu bởi đối
tượng
▪Những thông tin mà không có hành vi
73 74
73 74
5.2. Biễu diễn các thuộc tính 5.3. Những thuộc tính được dẫn xuất
❖Mô tả tên, kiểu và giá trị mặc định tùy chọn ❖Thuộc tính dẫn xuất là gì?
▪ attributeName : Type = Default ▪ Một thuộc tính mà giá trị của nó có thể được tính toán
dựa và giá trị của các thuộc tính khác
❖Tuân theo quy ước đặt tên của ngôn ngữ và dự án
❖Sử dụng chúng khi nào?
❖Kiểu nên là kiểu dữ liệu cơ bản trong ngôn ngữ cài
▪ Khi không có đủ thời gian để tính toán lại giá trị mỗi
đặt lần nó cần được sử dụng
▪ dữ liệu có sẵn, dữ liệu người dùng định nghĩa,
▪ Khi có sử đánh đổi về mặt hiệu năng giữa yêu cầu về
hoặc class người dùng định nghĩa
hiệu năng và bộ nhớ
❖Thiết lập phạm vi (tầm nhìn)
▪ Public: + Private: -
Protected: #
75 76
75 76
19
Ví dụ: Định nghĩa các thuộc tính Nội dung
<<entity>>
Schedule
<<boundary>>
CourseRegistrationForm
<<controll>> 1. Tạo các lớp khởi tạo
CourseRegistrationController
- scheduleID: int - courseID: String - courseID: String 2. Định nghĩa ra các thao tác/phương thức
- day: String - studentID: String - studentID: String
- teachingPeriod: int
3. Định nghĩa ra mối quan hệ giữa các lớp
4. Định nghĩa ra các trạng thái
<<entity>> <<entity>>
<<entity>>
StudyHistory CourseInfo. SubjectInfo. 5. Định nghĩa ra các thuộc tính
- historyNo: int
- pass: boolean
- courseID: String
- description: String
- subjectID: String
- subjectName: String
6. Sơ đồ lớp
- startDate: DateTime - goal: String
- result: int
- endDate: DateTime - description: String
- studentID: String
- studentName: String - lecturer: Lecturer - numberOfCredits: int
- location: String
77 78
77 78
79 80
79 80
20
Review: Package là gì? Review points: Lớp (class)
❖Một công cụ với mục đích tổ chức các thành phần
vào thành các nhóm. ❖Tên các class rõ ràng
❖Một thành phần mô hình có thể chứa những thành ❖Sự trừu tượng được định nghĩa rõ ràng
phần khác.
❖Thuộc tính/hành vi gắn với chức năng
❖Một package có thể được sử dụng:
▪ Để tổ chức mô hình phát triển ❖Thực hiện sự tổng quát hóa
▪ Nhưng một đơn vị quản lý phát triển ❖Tất cả các yêu cầu phần mềm được xử lý
❖Những yêu cầu thì thống nhất cùng với máy trạng
thái
❖Vòng đời đối tượng được mô tả
University
❖Lớp có hành vi được yêu cầu
Artifacts
81
81 82
Review points: Thao tác (operation) Review points: Thuộc tính (attribute)
83 84
21
Review points: Quan hệ (relationship) Câu hỏi?
86
85 86
Thiết kế lớp
Đặc tả chương trình
/**
* Parse XML data into a DOM representation, taking local resources and Schemas into account.
* @param inputData a string representation of the XML data to be parsed.
❖Thiết kế các thuộc tính * @param validating whether to Schema-validate the XML data
87 88
22