Professional Documents
Culture Documents
Phần 12 (dịch)
Phần 12 (dịch)
Phần 12 (dịch)
Phân tích miền được coi là giai đoạn tiếp theo của phát triển phần mềm, nó liên
quan đến việc tạo ra một mô hình chính xác, ngắn gọn, dễ hiểu và đúng đắn trong thực tế.
Trước khi xây dựng bất cứ thứ gì phức tạp, người thiết kế phải hiểu các yêu cầu. Các yêu
cầu có thể được nêu bằng lời nói, nhưng thông thường chúng không chính xác và mơ hồ.
Trong quá trình phân tích, chúng ta cần xây dựng các mô hình liên quan và bắt đầu hiểu sâu
hơn các yêu cầu đã đề cập.
Để xây dựng một mô hình miền (Domain Model), bạn phải phỏng vấn các chuyên
gia kinh doanh, kiểm tra các bản báo cáo về các yêu cầu và xem xét kỹ lưỡng các tạo tác liên
quan. Bạn phải phân tích ý nghĩa của các yêu cầu và trình bày lại chúng một cách chặt chẽ.
Điều quan trọng là phải trừu tượng hóa các tính năng quan trọng trước và để các chi tiết nhỏ
sau. Mô hình phân tích thành công là mô hình phải nêu rõ những gì phải được thực hiện mà
không hạn chế cách thức thực hiện và tránh các quyết định bất ngờ.
Trong chương này, bạn sẽ học cách lấy các khái niệm hướng đối tượng và áp dụng
chúng để xây dựng một mô hình miền. Mô hình này có thể phục vụ một số mục đích: làm rõ
các yêu cầu, cung cấp cơ sở cho sự đồng thuận giữa các cổ đông và lập trình viên và là điểm
khởi đầu cho thiết kế và triển khai.
Hình 12.1 Tổng quan về phân tích. Bản báo cáo vấn đề không nên được coi là không thể
thay đổi, mà là cơ sở để tinh chỉnh các yêu cầu
Có lẽ điều quan trọng hơn, quá trình xây dựng một mô hình nghiêm ngặt của miền vấn đề
buộc lập trình viên phải sớm đối mặt với những nhầm lẫn trong quá trình phát triển trong khi
chúng vẫn còn dễ sửa.
Mô hình phân tích đề cập đến ba khía cạnh của đối tượng: cấu trúc tĩnh của đối
tượng (mô hình lớp), tương tác giữa các đối tượng (mô hình tương tác) và lịch sử vòng đời
của đối tượng (mô hình trạng thái). Cả ba mô hình con đều không quan trọng như nhau
trong mọi vấn đề. Hầu như tất cả các vấn đề đều có các mô hình lớp hữu ích bắt nguồn từ
các thực thể trong thực tế. Các vấn đề liên quan đến điều khiển phản ứng và thời gian, chẳng
hạn như giao diện người dùng và điều khiển quy trình, có các mô hình trạng thái quan trọng.
Các vấn đề chứa tính toán quan trọng cũng như các hệ thống tương tác với các hệ thống
khác và các loại người dùng khác nhau có các mô hình tương tác quan trọng.
Phân tích không phải là một quá trình diễn ra quá máy móc. Các miêu tả chính xác
liên quan đến phán đoán và về nhiều mặt là một vấn đề nghệ thuật. Hầu hết các báo cáo vấn
đề đều thiếu thông tin cần thiết, thông tin này phải được lấy từ người yêu cầu hoặc từ kiến
thức của nhà phân tích về miền vấn đề trong thực tế. Ngoài ra, có một sự lựa chọn về mức
độ trừu tượng cho mô hình. Người phân tích phải liên lạc với người yêu cầu để làm rõ sự mơ
hồ và quan điểmbị hiểu lầm. Các mô hình phân tích cho phép giao tiếp chính xác.
Chúng tôi đã chia phân tích thành hai giai đoạn. Phần đầu tiên là phân tích miền,
thứ sẽ được trình bày trong chương này và tập trung vào việc hiểu bản chất thực tế của một
vấn đề. Phần thứ hai là phân tích ứng dụng, điều mà được trình bày trong chương tiếp theo
và được xây dựng trên mô hình miền kết hợp các tạo phẩm ứng dụng chính mà người dùng
nhìn thấy và phải được họ chấp thuận.
12.2 Mô Hình Lớp Miền
Bước đầu tiên khi phân tích các yêu cầu là xây dựng một mô hình lớp miền. Mô hình miền
hiển thị cấu trúc tĩnh của hệ thống thế giới thực và sắp xếp nó thành các phần khả thi. Mô
hình miền mô tả các lớp trong thế giới thực và mối quan hệ của chúng với nhau. Trong quá
trình phân tích, mô hình lớp đứng trước các mô hình trạng thái và tương tác vì cấu trúc tĩnh
có xu hướng được xác định tốt hơn, ít phụ thuộc vào chi tiết ứng dụng và ổn định hơn khi
giải pháp phát triển. Thông tin cho mô hình miền đến từ vấn đề nêu lên, tạo tác từ các hệ
thống liên quan, kiến thức chuyên môn về miền ứng dụng và kiến thức chung về thế giới
thực. Đảm bảo rằng bạn xem xét tất cả thông tin có sẵn và không dựa vào một nguồn duy
nhất.
Tìm các lớp và sự liên kết trước, vì chúng cung cấp cấu trúc tổng thể và cách tiếp cận
vấn đề. Tiếp theo, thêm các thuộc tính để mô tả mạng lưới lớp và liên kết cơ bản. Sau đó kết
hợp và tổ chức các lớp bằng kế thừa. Nỗ lực chỉ định kế thừa trực tiếp mà không cần hiểu
trước các lớp và các thuộc tính của chúng có thể làm sai lệch cấu trúc lớp để phù hợp với các
khái niệm định sẵn. Sự vận hành thường không quan trọng trong một mô hình miền. Mục
đích chính của mô hình miền là nắm bắt nội dung thông tin của một miền.
Tốt nhất là ghi ý tưởng ra giấy trước khi cố gắng sắp xếp chúng quá nhiều để không làm
mất các chi tiết quan trọng, mặc dù chúng có thể dư thừa và không nhất quán. Một mô hình
phân tích ban đầu có khả năng chứa các sai sót phải được sửa chữa bằng các lần làm lặp lại
sau này. Toàn bộ mô hình không cần phải được xây dựng thống nhất. Một số khía cạnh của
vấn đề có thể được phân tích sâu thông qua một số lần lặp lại trong khi các khía cạnh khác
vẫn còn sơ sài.
Bạn phải thực hiện các bước sau để xây dựng mô hình lớp miền.
■ Tìm các lớp. [12.2.1–12.2.2]
■ Chuẩn bị từ điển dữ liệu. [12.2.3]
■ Tìm các mối liên kết. [12.2.4–12.2.5]
■ Tìm thuộc tính của đối tượng và đường liên kết. [12.2.6–12.2.7]
■ Tổ chức và đơn giản hóa lớp bằng kế thừa. [12.2.8]
■ Xác minh rằng đường dẫn truy cập tồn tại cho các truy vấn có khả năng. [12.2.9]
■ Lặp lại và tinh chỉnh mô hình. [12.2.10]
■ Xem xét lại mức độ trừu tượng. [12.2.11]
■ Nhóm các lớp thành các gói. [12.2.12]
Như Hình 12.2 cho thấy, hãy bắt đầu bằng cách liệt kê các lớp ứng cử viên được tìm
thấy trong mô tả bằng văn bản về vấn đề. Đừng quá chọn lọc; Viết ra mọi lớp nghĩ ra. Các
lớp thường tương ứng với danh từ. Ví dụ: trong câu "một hệ thống đặt chỗ để bán vé xem
các buổi biểu diễn tại các nhà hát khác nhau", các lớp dự kiến sẽ là Sự đặt chỗ, Hệ thống,
Vé, Biểu diễn và Nhà hát. Tuy nhiên, đừng làm một cách mù quáng. Ý tưởng là nắm bắt các
khái niệm; Không phải tất cả các danh từ đều là khái niệm, và các khái niệm cũng được thể
hiện trong các phần khác của lời nói.
Hình 12.2 Tìm các lớp. Bạn có thể tìm thấy nhiều lớp bằng cách xem xét danh từ.
Đừng lo lắng nhiều về kế thừa hoặc các lớp cấp cao; Trước tiên, hãy làm đúng các lớp
cụ thể để bạn không vô thức ngăn chặn khi vào chi tiết hơn khi cố gắng làm phù hợp với cấu
trúc định sẵn. Ví dụ: nếu bạn đang xây dựng hệ thống danh mục và thanh toán cho thư viện,
hãy xác định các loại vật liệu khác nhau, chẳng hạn như sách, tạp chí, báo, hồ sơ, video, v.v.
Bạn có thể sắp xếp chúng thành các danh mục rộng hơn sau này, bằng cách tìm kiếm những
điểm tương đồng và khác biệt.
Ví dụ ATM. Việc kiểm tra các khái niệm trong vấn đề về ATM được nêu từ chương 11
mang lại các lớp dự kiến được thể hiện trong Hình 12.3. Hình 12.4 cho thấy các lớp bổ sung
không xuất hiện trực tiếp trong câu lệnh nhưng có thể được xác định từ kiến thức của chúng
ta về miền vấn đề.
Hình 12.3 Các lớp ATM được trích xuất từ danh từ trong câu vấn đề
Hình 12.4 Các lớp ATM được xác định từ kiến thức về vấn đề của miền
12.2.2 Giữ lại các lớp chính xác
Bây giờ loại bỏ các lớp không cần thiết và không chính xác theo các tiêu chí sau. Hình 12.5
cho thấy các lớp bị loại khỏi ví dụ ATM.
Hình 12.5 Loại bỏ các lớp không cần thiết ra khỏi vấn đề ATM
■ Các lớp dư thừa. Nếu hai lớp thể hiện cùng một khái niệm, bạn nên giữ tên mô tả nhất.
Ví dụ: mặc dù Khách hàng có thể mô tả một người đi chuyến bay của hãng hàng không,
Hành khách mô tả chính xác hơn. Mặt khác, nếu vấn đề liên quan đến các hợp đồng cho
một chuyến bay được thuê, thì Khách hàng cũng là một từ thích hợp, vì một hợp đồng
có thể liên quan đến một số hành khách.
Ví dụ ATM. Khách hàng và Người dùng là dư thừa; chúng ta giữ lại Khách hàng
vì nó mô tả chính xác hơn.
■ Các lớp không liên quan. Nếu một lớp có ít hoặc không liên quan gì đến vấn đề, hãy loại
bỏ nó. Điều này liên quan đến sự nhận định, bởi vì trong một bối cảnh khác, lớp này có
thể quan trọng. Ví dụ, trong hệ thống đặt vé rạp hát, nghề nghiệp của người giữ vé là
không liên quan, nhưng nghề nghiệp của nhân viên rạp hát có thể quan trọng.
Ví dụ ATM. Phân bổ chi phí nằm ngoài phạm vi của phần mềm ATM.
■ Các lớp mơ hồ. Một lớp nên được cụ thể. Một số lớp dự kiến có thể có ranh giới không rõ
ràng hoặc phạm vi quá rộng.
Vi dụ ATM. Cung cấp hệ thống lưu trữ hồ sơ thì mơ hồ và được xủ lý bởi Công
việc giao dịch. Trong các ứng dụng khác, điều này có thể được bao gồm trong các lớp
khác, chẳng hạn như Bán hàng tồn kho, Gọi điện thoại hoặc Lỗi máy.
186 Chương 12 / Phân Tích Miền
■ Thuộc tính. Thuộc tính. Các tên chủ yếu mô tả các đối tượng riêng lẻ nên được trình bày
lại dưới dạng thuộc tính. Ví dụ: tên, ngày sinh và cân nặng thường là các thuộc tính.
Nếu sự tồn tại độc lập của một thuộc tính là quan trọng, thì hãy biến nó thành một lớp
chứ không phải một thuộc tính. Ví dụ: văn phòng của nhân viên sẽ là một lớp trong ứng
dụng phân công lại văn phòng sau khi tổ chức lại.
Ví dụ ATM. Dữ liệu tài khoản không được chỉ định rõ nhưng có thể mô tả một tài
khoản trong mọi trường hợp. Máy ATM phân phát tiền mặt và biên lai, nhưng ngoài ra,
tiền mặt và biên lai là vấn đề ngoại vi, vì vậy chúng nên được coi là thuộc tính.
■ Sự vận hành. Nếu một tên mô tả một thao tác được áp dụng cho các đối tượng và không
được thao tác theo cách riêng của nó, thì đó không phải là một lớp. Ví dụ, một cuộc gọi
điện thoại là một chuỗi các hành động liên quan đến người gọi và mạng điện thoại. Nếu
chúng ta chỉ đơn giản là xây dựng lớp điện thoại, thì gọi điện là một phần của mô hình
trạng thái chứ không phải là một lớp.
Tuy nhiên, một hoạt động có các tính năng của riêng nó nên được mô hình hóa như
một lớp. Ví dụ: trong hệ thống thanh toán cho các cuộc gọi điện thoại, Cuộc gọi sẽ là
một lớp quan trọng với các thuộc tính như ngày, giờ, nguồn gốc và điểm đến.
■ Vai trò. Tên của một lớp nên phản ánh bản chất tự nhiên của nó và không phải là vai trò
của nó trong một tổ chức. Ví dụ: Chủ sở hữu sẽ là một tên kém cho một lớp trong cơ sở
dữ liệu của nhà sản xuất ô tô. Nếu một danh sách các tài xế được thêm vào sau thì sao?
Còn những người thuê xe thì sao? Các lớp thích hợp là Người (hoặc có thể là Khách
hàng), đảm nhận nhiều vai trò khác nhau, như là chủ, tài xế, and người thuê.
Một thực thể vật lý đôi khi tương ứng với một số lớp. Ví dụ: Người và Nhân viên
có thể là các lớp riêng biệt trong một số trường hợp và dư thừa trong những trường hợp
khác. Từ quan điểm của một cơ sở dữ liệu công ty về nhân viên, cả hai có thể giống hệt
nhau. Trong cơ sở dữ liệu thuế của chính phủ, một người có thể đảm nhiệm nhiều hơn
một công việc, vì vậy điều quan trọng là phải phân biệt Người với Nhân viên; mỗi người
có thể tương ứng với không hoặc nhiều trường hợp thông tin nhân viên.
■ Các cấu trúc triển khai. Loại bỏ các cấu trúc khỏi mô hình phân tích không liên quan
đến thế giới thực. Bạn có thể cần chúng sau này trong quá trình thiết kế, nhưng không
phải bây giờ. Ví dụ: CPU, chương trình con, quy trình, thuật toán và ngắt là các cấu trúc
triển khai cho hầu hết các ứng dụng, mặc dù chúng là các lớp hợp lệ cho một hệ điều
hành. Các cấu trúc dữ liệu, chẳng hạn như danh sách liên kết, cấu trúc cây, mảng và
bảng, hầu như luôn là các cấu trúc triển khai.
Ví dụ ATM. Một số lớp dự kiến thực sự là các cấu trúc triển khai. Nhật ký dữ liệu
đơn giản là tập hợp các dữ liệu; đại diện chính xác của nó là một vấn đề thiết kế. Các
liên kết giao tiếp có thể được hiển thị dưới dạng các tổ chức; Đường liên kết chỉ đơn
giản là việc triển khai vật lý của một liên kết như vậy.
■ Các lớp dẫn xuất. Theo nguyên tắc chung, bỏ qua các lớp có thể dẫn xuất từ các lớp
khác. Nếu một lớp dẫn xuất đặc biệt quan trọng, bạn có thể đưa nó vào, nhưng chỉ làm
như vậy một cách tiết kiệm.
Đánh dấu tất cả các lớp dẫn xuất bằng dấu gạch chéo ('/') trước trong tên lớp.
12.2.3 Chuẩn bị từ điển dữ liệu
Các từ riêng lẻ có quá nhiều cách hiểu, vì vậy hãy chuẩn bị một từ điển dữ liệu cho tất cả các
yếu tố mô hình hóa. Viết một đoạn văn mô tả chính xác từng lớp. Mô tả phạm vi của lớp
trong vấn đề hiện tại, bao gồm bất kỳ giả định hoặc hạn chế nào đối với việc sử dụng nó. Từ
điển dữ liệu cũng mô tả các liên kết, thuộc tính, hoạt động và giá trị liệt kê. Hình 12.6 chỉ ra
một từ điển dữ liệu cho các lớp trong bài toán ATM.
Tài khoản— một tài khoản duy nhất tại một ngân hàng mà các giao dịch có thể được áp
dụng. Tài khoản có thể thuộc nhiều loại khác nhau, chẳng hạn như séc hoặc tiết kiệm. Một
khách hàng có thể giữ nhiều hơn một tài khoản.
ATM— một trạm cho phép khách hàng nhập các giao dịch của riêng họ bằng cách sử dụng
thẻ tiền mặt làm giấy tờ tùy thân. Máy ATM tương tác với khách hàng để thu thập thông tin
giao dịch, gửi thông tin giao dịch đến máy tính trung tâm để xác nhận và xử lý, đồng thời
phân phối tiền mặt cho người dùng. Chúng tôi cho rằng một máy ATM không cần phải hoạt
động độc lập với mạng lưới.
Ngân hàng— một tổ chức tài chính giữ tài khoản cho khách hàng và phát hành thẻ tiền mặt
cho phép truy cập vào tài khoản qua mạng lưới ATM.
Máy tính ngân hàng—máy tính thuộc sở hữu của một ngân hàng giao tiếp với mạng ATM
và các trạm thu ngân của ngân hàng. Một ngân hàng có thể có máy tính nội bộ riêng để xử
lý tài khoản, nhưng chúng tôi chỉ quan tâm đến máy giao tiếp với mạng ATM.
Thẻ rút tiền—thẻ được chỉ định cho khách hàng của ngân hàng cho phép truy cập tài khoản
bằng máy ATM. Mỗi thẻ chứa một mã ngân hàng và một số thẻ. Mã ngân hàng xác định
ngân hang duy nhất trong các tập đoàn. Số thẻ xác định các tài khoản mà thẻ có thể truy cập.
Thẻ không nhất thiết phải truy cập vào tất cả các tài khoản của khách hàng. Mỗi thẻ rút tiền
thuộc sở hữu của một khách hàng, nhưng có thể tồn tại nhiều bản sao của nó, vì vậy phải
xem xét khả năng sử dụng đồng thời cùng một thẻ từ các máy khác nhau.
Thu ngân—một nhân viên của ngân hàng được ủy quyền thực hiện các giao dịch tại các
quầy thu ngân và chấp nhận cũng như phân phối tiền mặt và séc cho khách hàng. Các giao
dịch, tiền mặt và xử lý bởi mỗi nhân viên thu ngân phải được ghi lại và hạch toán chính xác.
Quầy thu ngân—một trạm mà nhân viên thu ngân nhập các giao dịch cho khách hàng.
Nhân viên thu ngân phân phối và chấp nhận tiền mặt và séc; trạm in biên lai. Trạm thu ngân
giao tiếp với máy tính của ngân hàng để xác thực và xử lý các giao dịch.
Máy tính trung tâm— một máy tính được vận hành bởi tập đoàn thực hiện các giao dịch
giữa các máy ATM và máy tính của ngân hàng. Máy tính trung tâm xác thực mã ngân hàng
nhưng không xử lý giao dịch trực tiếp.
Tập đoàn— một tổ chức của các ngân hàng ủy thác và vận hành mạng lưới ATM. Mạng chỉ
xử lý các giao dịch cho các ngân hàng trong tập đoàn.
Khách hàng—chủ sở hữu của một hoặc nhiều tài khoản trong ngân hàng. Một khách hàng
có thể bao gồm một hoặc nhiều người hoặc tập đoàn; sự tương đồng không liên quan đến
vấn đề này. Cùng một người mở tài khoản tại một ngân hàng khác nhau được coi là một
khách hàng khác nhau.
Giao dịch—một yêu cầu không thể thiếu cho các hoạt động trên tài khoản của một khách
hàng. Chúng tôi chỉ xác định rằng các máy ATM phải phân phối tiền mặt, nhưng chúng tôi
không nên loại trừ khả năng in séc hoặc nhận tiền mặt hoặc séc. Chúng tôi cũng có thể
muốn cung cấp sự linh hoạt để hoạt động trên các tài khoản của các khách hàng khác nhau,
mặc dù điều đó chưa bắt buộc.
Hình 12.6 Từ điển dữ liệu cho các lớp ATM. Chuẩn bị một từ điển dữ liệu
cho tất cả các yếu tố mô hình hóa.
Các cụm động từ
Mạng lưới ngân hàng bao gồm các quầy thu ngân và máy ATM
Các tập đoàn chia sẻ chung máy ATM
Ngân hàng cũng cấp máy tính dành cho ngân hàng
Máy tính ngân hàng duy trì tài khoản
Máy tính ngân hàng xủ lý giao dịch đối với tài khoản
Ngân hàng sở hữu quầy thu ngân
Quầy thu ngân giao tiếp với máy tính ngân hàng
Thu ngân nhập giao dịch cho tài khoản
Máy ATM giao tiếp với máy tính trung tâm về giao dịch
Máy tính trung tâm xóa giao dịch với ngân hàng
ATM chấp nhận thẻ rút tiền
ATM tương tác với ngườidùng
ATM phát tiền mặt
ATM in hóa đơn
Hệ thống xử lí truy cập đồng thời
Ngân hàng cung cấp phần mềm
Chi phí phân bổ cho các ngân hàng
Cụm động từ ẩn
Tập đoàn bao gồm các ngân hàng
Ngân hàng giữ tài khoản
Tập đoàn sở hữu máy tính trung tâm
Hệ thống cung cấp lưu trữ hồ sơ
Hệ thống cung cấp bảo mật
Khách hàng có thẻ rút tiền
Kiến thức về miền vấn đề
Thẻ rút tiền truy cập tài khoản
Ngân hàng tuyển nhân viên thu ngân
■ Hành động. Một liên kết nên mô tả một thuộc tính cấu trúc của miền ứng dụng, không
phải là một sự kiện nhất thời. Đôi khi, một yêu cầu được thể hiện dưới dạng một hành
động hàm ý một mối quan hệ cấu trúc cơ bản và bạn nên diễn đạt lại yêu cầu đó cho phù
hợp.
Ví dụ TM. ATM chấp nhận thẻ rút tiền mô tả một phần của chu trình tương tác
giữa máy ATM và khách hàng, không phải là mối quan hệ vĩnh viễn giữa máy ATM và
thẻ rút tiền. Chúng tôi cũng có thể loại bỏ tương tác ATM với người dùng. Máy tính
trung tâm xóa giao dịch với ngân hàng mô tả một hành động ngụ ý mối quan hệ cấu
trúc Máy tính trung tâm giao tiếp với ngân hàng.
■ Liên kết ba ngôi. Bạn có thể phân tách hầu hết các liên kết giữa ba hoặc nhiều lớp thành
các liên kết nhị phân hoặc diễn đạt chúng dưới dạng các liên kết đủ điều kiện. Nếu một
thuật ngữ trong một liên kết ba ngôi hoàn toàn mang tính mô tả và không có tính của
riêng nó, thì thuật ngữ đó là một thuộc tính trên một liên kết nhị phân. Liên kết Công ty
trả lương cho nhân viên có thể được viết lại như liên kết nhị phân Công ty tuyển dụng
người với một giá trị tiền lương cho mỗi liên kết Công ty-Người.
186 Chương 12 / Phân Tích Miền
Đôi khi, một ứng dụng sẽ yêu cầu một liên kết ba ngôi chung. Giáo sư dạy khóa
học trong phòng không thể được tách ra mà không làm mất thông tin. Chúng ta không
gặp phải các liên kết với bốn lớp trở lên khi làm.
Ví dụ ATM. Máy tính ngân hàng xử lý giao dịch đối với tài khoản có thể được chia
thành máy tính ngân hàng xử lý giao dịch và tài khoản liên quan đến giao dịch. Thu
ngân nhập giao dịch cho tài khoản cũng có thể được chia ra tương tự. ATM giao tiếp với
máy tính trung tâm về giao dịch thực ra là liên kết nhị phân ATM giao tiếp với máy tính
trung tâm và Giao dịch được nhập trên ATM.
■ Liên kết phát sinh. Bỏ qua các liên kết có thể được xác định theo các liên kết khác, bởi vì
chúng là dư thừa. Ví dụ: GrandparentOf có thể được định nghĩa theo một cặp liên kết
ParentOf. Cũng bỏ qua các liên kết được xác định bởi các điều kiện trên các thuộc tính.
Ví dụ: youngThan thể hiện điều kiện về ngày sinh của hai người, không phải thông tin
bổ sung.
Các lớp, thuộc tính và liên kết trong mô hình lớp nên biểu diễn thông tin độc lập
càng nhiều càng tốt. Nhiều đường dẫn giữa các lớp đôi khi biểu thị các liên kết phát sinh
là thành phần của các liên kết đầu tiên. Tập đoàn chia sẻ máy ATM là một thành phần
của liên kết Tập đoàn sở hữu máy tính trung tâm và máy tính trung tâm giao tiếp với
máy ATM.
Hãy cẩn thận, bởi vì không phải tất cả các liên kết tạo thành nhiều đường dẫn giữa
các lớp đều biểu thị sự dư thừa. Đôi khi sự tồn tại của một liên kết có thể bắt nguồn từ
hai hoặc nhiều liên kết nguyên thủy và nhiều hơn nữa thì không thể. Giữ liên kết bổ
sung nếu ràng buộc bổ sung đa dạng là quan trọng. Ví dụ, trong hình 12.8 một công ty
thuê nhiều người và sở hữu nhiều máy tính. Mỗi nhân viên được chỉ định không hay
nhiều máy tính cho mục đích sử dụng cá nhân; một số máy tính được sử dụng chung và
không được giao cho bất kì ai. Tính đa dạng của liên kết giao việc không thể được suy
ra từ liên kết thuê and chủ.
Employs
Company Person
1 *
1 `` 0..1
Owns AssignedTo
* Computer *
Hình 12.8 Liên kết không dư thừa. Không phải tất cả các liên kết hình thành nhiều
đường dẫn giữa các lớp đều biểu thị sự dư thừa.
Mặc dù các liên kết dẫn xuất không bổ sung thêm thông tin nhưng chúng rất hữu
ích trong thế giới thực và trong thiết kế. Ví dụ: các mối quan hệ họ hàng như Chú, Mẹ
chồng và Anh họ có tên vì chúng mô tả các mối quan hệ phổ biến được coi là quan trọng
trong xã hội của chúng ta. Nếu chúng đặc biệt quan trọng, bạn có thể hiển thị các liên
kết dẫn xuất trong sơ đồ lớp, nhưng hãy đặt dấu gạch chéo trước tên của chúng để biểu
thị trạng thái phụ thuộc của chúng và để phân biệt chúng với các liên kết cơ bản.
Chỉ định thêm ngữ nghĩa của các liên kết như sau:
■ Liên kết bị sai tên. Đừng hỏi làm thế nào hoặc tại sao một tình huống xảy ra, hãy hỏi nó
là gì.Tên rất quan trọng để hiểu và nên được chọn cẩn thận.
Ví dụ ATM. Máy tính ngân hàng duy trì tài khoản là một tuyên bố hành động; viết
lại là Ngân hàng giữ tài khoản.
■ Tên kết thúc của liên kết. Thêm tên kết thúc liên kết khi thích hợp. Ví dụ: trong liên kết
WorksFor, Công ty là chủ đối với một Người và một Người là nhân viên đối với Công
ty. Nếu chỉ có một liên kết giữa một cặp lớp và ý nghĩa của liên kết là rõ ràng, bạn có
thể bỏ qua các tên cuối của liên kết. Ví dụ, ý nghĩa của các máy ATM giao tiếp với máy
tính trung tâm là rõ ràng từ các tên lớp. Một liên kết giữa hai phiên bản của cùng một
lớp yêu cầu tên kết thúc liên kết để phân biệt các phiên bản. Ví dụ: liên kết Người quản
lý sẽ có tên cuối là ông chủ và công nhân.
■ Liên kết đạt chuẩn. Thông thường, một cái tên xác định một đối tượng trong một số ngữ
cảnh; hầu hết các tên không phải là duy nhất trên toàn cầu. Bối cảnh kết hợp với tên để
xác định duy nhất đối tượng. Ví dụ: tên của một công ty phải là duy nhất trong tiểu bang
đã đăng kí nhưng có thể trùng lặp ở các tiểu bang khác (đã từng có Công ty Standard Oil
ở Ohio, Indiana, California và New Jersey). Tên của một công ty đủ điều kiện liên kết
tiểu bang mà công ty thành lập; Tiểu bang và tên công ty xác định duy nhất đối tượng
Công ty. Một vòng loại phân biệt các đối tượng ở phía "nhiều" của một liên kết.
Ví dụ ATM. Mã ngân hàng đủ kiều kiện phân biệt các ngân hàng khác nhau trong
tập đoàn. Mỗi thẻ rút tiền cần một mã ngân hàng để giao dịch có thể chuyển đến ngân
hàng thích hợp.
■ Sự đa dạng. Chỉ rõ sự đa dạng, nhưng đừng nỗ lực quá mức để làm nó đúng, vì sự đa
dạng thường thay đổi trong quá trình phân tích. Thử thách đa dạng giá trị của “Một”. Ví
dụ, liên kết một Quản lý quán lý nhiều nhân viên ngăn cản ma trận quản lý hay một
nhân viên được phân chia nhiều trách nhiệm. Đối với sự đa dạng giá trị của “nhiều” hãy
xem xét liệu có cần phải đạt điều kiện; cũng như nên đặt câu hỏi các đối tượng có cần
phải sắp xếp theo thứ tự nào không.
■ Liên kết bị mất. Thêm vào bất cứ liên kết bị mất nào khi tìm lại được.
Ví dụ ATM. Chún ta bỏ qua Giao dịch được nhập ở quầy thu ngân, Khách hàng có
tài khoản, và Giao dịch được cho phép qua thẻ rút tiền. Nếu nhân viên chỉ được giới hạn
trong quầy thu ngân cụ thể, thì liên kết Nhân viên thu ngân được ủy quyền ở quầy thu
ngân sẽ cần thiết.
■ Tổng hợp. Tổng hợp rất quan trọng đối với một số loại ứng dụng, đặc biệt đối với những
ứng dụng liên quan đến các bộ phận cơ khí và hóa đơn vật liệu. Đối với các ứng dụng
khác, tổng hợp tương đối nhỏ và có thể không rõ có nên sử dụng tổng hợp hay liên kết
thông thường. Đối với những ứng dụng khác này, đừng dành nhiều thời gian để phân
biệt giữa liên kết và tổng hợp. Tổng hợp chỉ là một liên kết với ý nghĩa bổ sung. Sử
dụng bất cứ điều gì có vẻ tự nhiên hơn vào thời điểm đó và đi tiếp.
Ví dụ ATM. Chúng tôi quyết định rằng Ngân hàng là một phần của Tập đoàn và
xác định mối quan hệ với tổng hợp.
Ví dụ ATM. Hình 12.9 cho thấy một sơ đồ lớp với các liên kết còn lại. Chúng ta chỉ bao
gồm các tên liên kết quan trọng. Lưu ý rằng chúng ta đã chia Giao dịch thành Giao dịch từ
xa và Giao dịch thu ngân để phù hợp với các liên kết khác nhau. Biểu đồ hiển thị các giá trị
186 Chương 12 / Phân Tích Miền
đa dạng. Chúng ta có thể đã thực hiện một số quyết định phân tích khác nhau. Đừng lo lắng;
có nhiều mô hình chính xác có thể có của một vấn đề. Chúng ta đã chỉ ra quá trình phân tích
theo từng bước nhỏ; với thực hành, bạn có thể lướt qua vài bước với nhau trong tâm trí của
bạn.
Consortium bankCode
0..1
Bank 1 * Account * 1
Customer
1
1 1
1 1 1 1 * 1
Employs
1 1
Communicates *
Central With Bank
Computer 1 Computer Cashier
*
1 1 1
CommunicatesWith EnteredBy
* * * *
Communicates Cashier EnteredOn Cashier
With Station 1 Transaction
*
*
EnteredOn Remote * *
ATM CashCard
1 Transaction
* * AuthorizedBy 1 *
Hình 12.9 Sơ đồ lớp ban đầu cho hệ thống ATM
hơn trên các liên kết một-nhiều bởi vì chúng có thể được gắn vào lớp “nhiều” mà
không làm mất thông tin. Kháng cự sự thôi thúc gắn chúng vào các lớp, vì chúng sẽ
không hợp lệ nếu bội số thay đổi. Các thuộc tính cũng tinh tế trên các liên kết một đối
một.
■ Giá trị nội tại. Nếu một thuộc tính mô tả trạng thái bên trong của một đối tượng là vô
hình bên ngoài đối tượng, sau đó loại bỏ nó khỏi phân tích.
■ Chi tiết tốt. Bỏ qua các thuộc tính nhỏ không có khả năng ảnh hưởng đến hầu hết các
hoạt động.
■ Thuộc tính không phù hợp. Một thuộc tính dường như hoàn toàn khác và không liên
quan đối với tất cả các thuộc tính khác có thể chỉ ra một lớp nên được chia thành hai
lớp riêng biệt. Một lớp nên đơn giản và mạch lạc. Trộn lẫn các lớp riêng biệt với nhau
là một trong những nguyên nhân chính gây ra các mô hình rắc rối. Các lớp không tập
trung thường dẫn đến sớm xem xét các quyết định thực hiện trong quá trình phân tích.
■ Thuộc tính Boolean. Xem xét lại tất cả các thuộc tính boolean. Thường thì bạn có thể mở
rộng một thuộc tính boolean và trình bày lại nó dưới dạng liệt kê [Coad-95].
Ví dụ ATM. Chúng tôi áp dụng các tiêu chí này để có được các thuộc tính cho mỗi lớp
(Hình 12.10). Một số thuộc tính dự kiến thực sự là đạt chuẩn trên các liên kết. Chúng tôi
xem xét một số khía cạnh của mô hình.
■ BankCode và cardCode hiện diện trên thẻ. Định dạng của chúng là một chi tiết triển khai,
nhưng chúng tôi phải thêm một liên kết mới Ngân hàng phát hành Thẻ rút tiền.
CardCode là một lớp về liên kết này; bankCode là tiêu chuẩn của Ngân hàng đối với
Consortium.
■ Các máy tính không có trạng thái liên quan đến vấn đề này. Cho dù máy đang mở hay tắt
là một thuộc tính tạm thời là một phần của quá trình triển khai.
■ Tránh bị cám dỗ bỏ qua Consortium, mặc dù nó hiện là duy nhất. Nó cung cấp bối cảnh
cho bộ định tính bankCode và có thể hữu ích cho việc mở rộng trong tương lai.
Hãy nhớ rằng vấn đề ATM chỉ là một ví dụ. Các ứng dụng thực tế, khi được bổ sung, có xu
hướng có nhiều thuộc tính hơn cho mỗi lớp so với Hình 12.10 cho thấy.
Trong khi chắc chắn hữu ích trong một số ứng dụng ngân hàng, sự khác biệt này không
ảnh hưởng đến hành vi trong ứng dụng ATM; type có thể được tạo thành một thuộc tính
đơn giản của Tài khoản.
■ Đa kế thừa. Bạn có thể sử dụng đa kế thừa để tăng khả năng chia sẻ, nhưng chỉ khi cần
thiết, vì nó làm tăng cả độ phức tạp về khái niệm và triển khai.
■ Các liên kết tương tự. Khi cùng một tên liên kết xuất hiện nhiều lần với về cơ bản là
cùng một ý nghĩa, cố gắng khái quát hóa các lớp liên quan. Đôi khi các lớp không có
điểm chung nào ngoài sự liên kết, nhưng thường thì bạn sẽ phát hiện ra một tính tổng
quát cơ bản mà bạn đã bỏ qua.
Ví dụ ATM. Giao dịch được nhập trên cả CashierStation và ATM; EntryStation
khái quát hóa CashierStation và ATM.
■ Điều chỉnh mức thừa kế. Bạn phải gán thuộc tính và liên kết cho cụ thể các lớp trong hệ
thống phân cấp lớp. Chỉ định mỗi người vào lớp tổng quát nhất mà nó là phù hợp. Bạn
có thể cần một số điều chỉnh để có được mọi thứ đúng. đối xứng có thể đề xuất các
thuộc tính bổ sung để phân biệt giữa các lớp con rõ ràng hơn.
Hình 12.11 thể hiện mô hình lớp ATM sau khi thêm tính kế thừa.
Hình 12.11 Mô hình lớp ATM với các thuộc tính và kế thừa
■ Bất đối xứng trong các liên kết và khái quát hóa. Thêm các lớp mới bằng cách tương
tự.
■ Phân biệt các thuộc tính và hoạt động trên một lớp. Tách một lớp để mỗi phần được
mạch lạc.
■ Khó khăn trong việc khái quát hóa một cách rõ ràng. Một lớp có thể đóng hai vai trò.
Tách nó ra và sau đó một vai trò có thể đáp ứng hợp lý.
186 Chương 12 / Phân Tích Miền
■ Các liên kết trùng lặp có cùng tên và mục đích. Tổng quát hóa để tạo siêu lớp còn thiếu
để hợp nhất các liên kết.
■ Một vai trò định hình ngữ nghĩa cho một lớp. Có lẽ nó nên là một lớp riêng biệt. Điều
này thường có nghĩa là chuyển đổi một liên kết thành một lớp. Ví dụ, một người có thể
được tuyển dụng bởi một số công ty với các điều kiện làm việc khác nhau tại mỗi công ty;
Sau đó, nhân viên là một lớp biểu thị một người làm việc cho một công ty cụ thể, bên cạnh
lớp Person và Company.
Cũng tìm kiếm các liên kết bị thiếu.
■ Thiếu đường dẫn truy cập cho các hoạt động. Thêm các liên kết mới để bạn có thể trả
lời các truy vấn.
Một mối quan tâm khác là các yếu tố mô hình không cần thiết.
■ Thiếu các thuộc tính, hoạt động và liên kết trên một lớp. Tại sao lớp là cần thiết?
Tránh sản sinh ra các lớp con chỉ để biểu thị một phép liệt kê. Nếu các lớp con được đề
xuất giống hệt nhau, hãy đánh dấu sự khác biệt bằng cách sử dụng một thuộc tính.
■ Thông tin dư thừa. Xóa các liên kết không thêm thông tin mới hoặc đánh dấu chúng là đã
có nguồn gốc.
Và cuối cùng, bạn có thể điều chỉnh vị trí của các thuộc tính và liên kết.
■ Tên kết thúc liên kết quá rộng hoặc quá hẹp đối với các lớp của chúng. Di chuyển liên
kết lên hoặc xuống trong hệ thống phân cấp lớp.
■ Cần truy cập một đối tượng bằng một trong các giá trị thuộc tính của nó. Hãy xem
xét một liên kết đủ điều kiện.
Trong thực tế, việc xây dựng mô hình không được sắp xếp theo thứ tự cứng nhắc như chúng
tôi đã chỉ ra. Bạn có thể kết hợp nhiều bước khi đã có kinh nghiệm. Ví dụ, bạn có thể tìm các
lớp thành phần, loại bỏ những lớp không đúng mà không cần viết chúng ra và thêm chúng
vào sơ đồ lớp cùng với các liên kết của chúng. Bạn có thể thực hiện một số phần của mô
hình qua một số bước và phát triển chúng một cách chi tiết, trong khi các phần khác vẫn còn
sơ sài. Bạn có thể trao đổi thứ tự các bước khi thích hợp. Tuy nhiên, nếu bạn chỉ đang học
mô hình hóa trên lớp học, chúng tôi khuyên bạn nên làm theo các bước một cách chi tiết đầy
đủ trong vài lần đầu tiên.
Ví dụ ATM. CashCard thực sự có một tính cách riêng biệt—nó vừa là một đơn vị được
ủy quyền trong ngân hàng cho phép truy cập vào tài khoản của khách hàng, vừa là một phần
dữ liệu nhựa mà máy ATM đọc để lấy ID được mã hóa. Trong trường hợp này, các mã thực
sự là một phần của thế giới thực, không chỉ là các tạo tác máy tính; các mã, không phải thẻ
rút tiền, được truyền tới máy tính trung tâm. Chúng tôi nên chia thẻ tiền mặt thành hai loại:
CardAuthorization, quyền truy cập vào một hoặc nhiều tài khoản khách hàng; và CashCard,
một miếng nhựa có chứa mã ngân hàng và số thẻ tiền mặt có ý nghĩa đối với ngân hàng. Mỗi
ủy quyền thẻ có thể có nhiều thẻ rút tiền, mỗi thẻ có một số sê-ri vì lý do bảo mật. Mã thẻ,
xuất hiện trên thẻ vật lý, xác định ủy quyền thẻ trong ngân hàng. Mỗi ủy quyền thẻ xác định
một hoặc nhiều tài khoản—ví dụ: một tài khoản séc và một tài khoản tiết kiệm.
Giao dịch không đủ tổng quát để cho phép chuyển giữa các tài khoản vì nó chỉ liên quan
đến một tài khoản. Nói chung, một giao dịch bao gồm một hoặc nhiều cập nhật trên các tài
khoản cá nhân. Cập nhật là một hành động đơn lẻ (rút tiền, gửi tiền hoặc truy vấn) trên một
tài khoản. Tất cả các cập nhật trong một giao dịch phải được xử lý cùng nhau dưới dạng một
đơn vị nguyên tử; nếu bất kỳ cái nào không thành công, thì tất cả chúng đều bị hủy bỏ.
Sự khác biệt giữa Bank và BankComputer và giữa Consortium và CentralComputer
dường như không ảnh hưởng đến phân tích. Thực tế là các thông tin liên lạc được xử lý bởi
máy tính thực sự là một tạo phẩm triển khai. Hợp nhất BankComputer thành Bank và
CentralComputer thành Consortium.
Customer dường như không tham gia vào phân tích cho đến nay. Tuy nhiên, khi chúng
tôi xem xét các hoạt động để mở tài khoản mới, nó có thể là một khái niệm quan trọng, vì
vậy hãy để nó yên vào lúc này.
Hình 12.12 cho thấy một sơ đồ lớp đã được sửa đổi đơn giản và rõ ràng hơn.
Hình 12.12 Mô hình lớp ATM sau khi chỉnh sửa thêm
Ví dụ: chúng tôi đã gặp một ứng dụng trong đó các nhà phát triển có các lớp riêng biệt
cho IndividualContributor(Người đóng góp cá nhân), Supervisor(Người giám sát), and
Manager(Người quản lý). IndividualContributors báo cáo cho Supervisors và Supervisors
báo cáo cho Managers. Mô hình này chắc chắn là đúng, nhưng nó có một số vấn đề. Có
nhiều điểm chung giữa ba lớp—sự khác biệt duy nhất là hệ thống phân cấp báo cáo. Ví dụ,
tất cả họ đều có số điện thoại và địa chỉ. Chúng tôi có thể xử lý điểm chung với một lớp cha,
nhưng điều đó chỉ làm cho mô hình lớn hơn. Một vấn đề khác phát sinh khi chúng tôi nói
chuyện với các nhà phát triển và họ nói rằng họ muốn thêm một lớp khác cho những người
mà người quản lý đã báo cáo.
Hình 12.13 cho thấy mô hình ban đầu và một mô hình cải tiến trừu tượng hơn. Thay vì
“mã hóa cứng” hệ thống phân cấp quản lý trong mô hình, chúng tôi có thể “mã hóa mềm” nó
với sự liên kết giữa sếp và nhân viên. Một người có employeeType là “individual-
Contributor” là nhân viên báo cáo cho người khác có employeeType là “supervisor”. Tương
tự, một Supervisor báo cáo cho một Manager. Trong mô hình cải tiến, một nhân viên có một
ông chủ tùy chọn, vì hệ thống phân cấp báo cáo cuối cùng cũng dừng lại. Mô hình cải tiến
nhỏ hơn và linh hoạt hơn. Mức báo cáo bổ sung không thay đổi cấu trúc của mô hình; nó chỉ
làm thay đổi dữ liệu được lưu trữ.
Hình 12.13 Chuyển đổi mức độ trừu tượng. Tính trừu tượng làm cho mô hình trở nên
phức tạp hơn nhưng có thể tăng tính linh hoạt và làm giảm số lớp.
Một cách mà bạn có thể tận dụng sự trừu tượng là suy nghĩ theo các mẫu. Các loại mẫu
khác nhau áp dụng cho các giai đoạn phát triển khác nhau, nhưng ở đây chúng tôi quan tâm
đến các mẫu để phân tích. Một mô hình chắt lọc kiến thức của các chuyên gia và cung cấp
một giải pháp đã được chứng minh cho một vấn đề chung. Ví dụ, phía bên phải của Hình
12.13 là một mẫu để lập mô hình phân cấp quản lý. Bất cứ khi nào chúng tôi gặp phải nhu
cầu về một hệ thống phân cấp quản lý, chúng tôi ngay lập tức nghĩ đến mô hình trên và đặt
nó vào mô hình ứng dụng của chúng tôi. Việc sử dụng các mẫu đã được thử và chứng minh
mang lại cho chúng tôi sự tự tin về cách tiếp cận hợp lý và tăng năng suất của chúng tôi
trong việc xây dựng các mô hình.
Ví dụ về máy ATM. Chúng tôi đã bao hàm một số khái niệm trừu tượng trong mô hình
ATM. Chúng tôi phân biệt giữa CashCard và CardAuthorization. Hơn nữa, chúng tôi đã đưa
vào khái niệm giao dịch thay vì cố gắng liệt kê từng loại tương tác có thể có.
12.2 Mô Hình Lớp Miền 183
Mỗi gói có thể có thêm chi tiết. Gói tài khoản có thể bao gồm nhiều loại giao dịch, thông tin
về khách hàng, thanh toán lãi và phí. Gói ngân hàng có thể chứa thông tin về chi nhánh, địa
chỉ và phân bổ chi phí.
Đầu tiên xác định các lớp miền với các trạng thái quan trọng và lưu ý các trạng thái
của mỗi lớp. Sau đó xác định các sự kiện đưa một đối tượng từ trạng thái này sang trạng thái
khác. Với các trạng thái và các sự kiện, bạn có thể xây dựng sơ đồ trạng thái cho các đối
tượng bị ảnh hưởng. Cuối cùng, đánh giá trạng thái sơ đồ để đảm bảo chúng đầy đủ và chính
xác.
Các bước sau đây được thực hiện trong việc xây dựng mô hình trạng thái miền.
■ Xác định các lớp miền với các trạng thái. [12.3.1]
■ Tìm trạng thái. [12.3.2]
■ Tìm sự kiện. [12.3.3]
■ Xây dựng biểu đồ trạng thái. [12.3.4]
■ Đánh giá sơ đồ trạng thái. [12.3.5]
12.2 Mô Hình Lớp Miền 185
Bạn có thể tìm các sự kiện khác bằng cách suy nghĩ đưa đối tượng vào một trạng
thái cụ thể. Ví dụ: nếu bạn nghe trên điện thoại, nó sẽ chuyển sang trạng thái Đang Nghe.
Nhiều điện thoại có các nút bấm gọi các chức năng cụ thể. Nếu bạn nhấn nút quay số lại,
điện thoại sẽ truyền số và chuyển sang trạng thái Đang gọi. Nếu bạn nhấn nút chương trình,
nó sẽ chuyển sang trạng thái Chương Trình.
Những sự kiện bổ sung có thể xảy ra trong trạng thái và không gây ra chuyển đổi.
Đối với mô hình trạng thái miền, bạn nên tập trung vào các sự kiện gây ra sự chuyển tiếp
giữa các trạng thái. Khi bạn phát hiện ra một sự kiện, hãy nắm bắt mọi thông tin mà sự kiện
đó truyền tải dưới dạng danh sách các tham số.
Ví dụ ATM. Các sự kiện quan trọng bao gồm: đóng tài khoản, rút tiền thừa, nhập
sai mã PIN nhiều lần, nghi ngờ gian lận và hành động hành chính.
Hình 12.14 Mô hình trạng thái miền. Mô hình trạng thái miền ghi lại những lớp quan
trọng làm thay đổi trạng thái trong thực tế.
Sử dụng kiến thức của bạn về miền để tìm kiếm các đường dẫn bị thiếu. Đôi khi
các đường dẫn bị thiếu chỉ ra các trạng thái bị thiếu. Khi một mô hình trạng thái hoàn thành,
nó sẽ thể hiện chính xác vòng đời của lớp.
Ví dụ ATM. Mô hình trạng thái của chúng tôi cho Tài khoản rất đơn giản nhưng
chúng tôi hài lòng với nó. Chúng tôi sẽ yêu cầu kiến thức ngân hàng đáng kể để xây dựng
một mô hình sâu hơn.
Các phương pháp luận không bao giờ tuyến tính như trong sách. Điều này cũng
không ngoại lệ. Bất kỳ phân tích phức tạp nào cũng được xây dựng bằng cách lặp lại trên
nhiều cấp độ. Bạn không cần phải chuẩn bị tất cả các phần của mô hình với tốc độ như nhau.
Kết quả phân tích thay thế bảo cáo vấn đề ban đầu và làm nền tảng cho thiết kế.