Thuộc tính của lớp
Mỗi thuộc tính có: + Tên của thuộc tính, + Kiểu xác định các loại giá trị mà thuộc tính mô tả, + Giá trị mặc định (khởi đầu) cho mỗi thuộc tính. Việc gán giá trị khởi đầu cho thuộc tính là tuỳ chọn, không bắt buộc. Kiểu của ...
Mỗi thuộc tính có:
+ Tên của thuộc tính,
+ Kiểu xác định các loại giá trị mà thuộc tính mô tả,
+ Giá trị mặc định (khởi đầu) cho mỗi thuộc tính. Việc gán giá trị khởi đầu cho thuộc tính là tuỳ chọn, không bắt buộc.
Kiểu của thuộc tính
Kiểu của thuộc tính là kiểu dữ liệu cơ sở hoặc là các lớp đã xây dựng trước. Kiểu thuộc tính nói cho ta biết về loại giá trị kiểu số nguyên (Integer, int), số thực (Real, Float), giá trị logic (Boolean), ký tự (Character), thời gian (Time), v.v. được gọi là các kiểu nguyên thuỷ (primitive type). Ngoài các kiểu nguyên thuỷ, người phát triển hệ thống có thể tạo ra những kiểu mới tuỳ ý.
Phạm vi của thuộc tính
còn có thêm đặc tính để thể hiện khả năng nhìn thấy được hay đặc tính quản lý khả năng truy nhập của thuộc tính đối với các đối tượng khác, gọi chung là phạm vi quan sát (gọi tắt là phạm vi) của thuộc tính nói riêng và của các thành phần trong lớp nói chung. Đó là các đặc tính được khai báo trong lớp bằng các ký hiệu:
‘+’ đứng trước thuộc tính trong UML, hoặc biểu tượng ổ khoá nhưng không bị khoá trong Rose để thể hiện thuộc tính này là công khai (public), mọi đối tượng đều nhìn thấy được. Bất kỳ đối tượng nào trong hệ thống cũng nhì thấy được và được quyền truy cập từ mọi lớp khác.
‘#’ đứng trước thuộc tính trong UML, hoặc biểu tượng ổ khoá và có chìa để bên cạnh trong Rose để thể hiện thuộc tính này là được bảo vệ (protected), những đối tượng có quan hệ kế thừa có thể nhìn thấy được.
‘-’ đứng trước thuộc tính trong UML, hoặc biểu tượng khoá bị khoá và chìa bị cất đi trong Rose, để thể hiện thuộc tính này là sở hữu riêng (private), chỉ bản thân đối tượng của một lớp nhìn thấy được, những đối tượng khác không được phép truy cập.
Mặc định: trường hợp những thuộc tính không có ký hiệu đặc tính phạm vi nào đứng trước thì được xem là mặc định, biểu tượng mặc định trong Rose là , nghĩa là những thuộc tính có thể quan sát được đối với các lớp trong cùng gói. Phạm vi mặc định còn được gọi là phạm vi gói hay phạm vi cài đặt (Implementation).
Các thuộc tính của lớp trong UML và trong Rose
Thuộc tính hoTen có kiểu String và là công khai, soTaiKhoan có kiểu int (các số nguyên) là riêng còn diaChi là được bảo vệ, có kiểu String.
Đặc tính mặc định, hay được bảo vệ của thuộc tính trong C++ và Java là khác nhau.
Tính chất lưu trữ thuộc tính
Các thuộc tính trong lớp nếu được xác định thì có thể lưu trữ theo giá trị, hoặc theo tham chiếu, ngược lại chưa xác định.
- Giá trị (By value): thuộc tính được gán tính chất By value trong mô hình thì nó sẽ được lưu trong lớp bền vững chứa thuộc tính đó.
- Tham chiếu (Reference): thuộc tính được gán giá trị này cho biết nó sẽ được lưu trữ ở bên ngoài lớp, nhưng có con trỏ tham chiếu đến nó.
- Chưa xác định (Unspecified): thuộc tính được gán tính chất này cho biết cách lưu trữ là chưa xác định, nhưng khi phát sinh mã chương trình thì Rose coi là By value.
Thuộc tính tĩnh (static)
Thông thường mỗi thuộc tính có một bản sao dữ liệu riêng cho từng đối tượng của một lớp.
Lớp NguoiBanHang của một Công ty có thuộc tính tenGoi và taiKhoan. Khi thực hiện hệ thống tạo ra hai đối tượng là hai người bán hàng cụ thể và mỗi đối tượng có một bản sao tenGoi và taiKhoan riêng, như vậy mỗi người sử dụng một tài khoản riêng. Việc này không thật phù hợp với thực tế, vì tất cả những người bán hàng chỉ có chung một tài khoản, đó là tài khoản của Công ty. Việc này có thể thực hiện được bằng cách sử dụng thuộc tính static cho taiKhoan.
Những thuộc tính khai báo static trong một lớp là những thuộc tính được chia sẻ đối với tất cả các đối tượng, nghĩa là chỉ có một bản sao dữ liệu cho tất cả các đối tượng của lớp đó.
UML biểu diễn thuộc tính static bằng dấu ‘$’ trước tên thuộc tính.
Thuộc tính suy dẫn(derived)
Một số thuộc tính có thể được suy dẫn từ những thuộc tính khác.
Lớp HinhChuNhat có thuộc tính chieuCao, chieuRong, nếu có thêm thuộc tính dienTich thì tất nhiên dienTich là có thể suy ra từ tích của chieuCao * chieuRong.
Trong UML, thuộc tính suy dẫn được ký hiệu bằng dấu ‘/’ trước tên thuộc tính.
Đặc tính lưu trữ đối tượng
Trong các hệ thống đối tượng, có những đối tượng cần phải được lưu trữ vào CSDL được gọi là đối tượng duy trì, những đối tượng không cần lưu trữ ở bộ nhớ ngoài được gọi là đối tượng không bền vững. Trong Rose có thể gán đặc tính lưu trữ cho lớp, các đặc tính này có thể là:
- Persistent: cho những lớp có các đối tượng được lưu trữ trong CSDL hay trong một khuôn mẫu nào đó, nghĩa là chúng vấn tồn tại khi hệ thống không thực hiện.
- Transient: cho những lớp mà các đối tượng của nó không cần lưu trữ vào bộ nhớ ngoài.
- Absract: cho những lớp trừu tượng, những lớp không có đối tượng thể hiện trong thực tế. Thường lớp trừu tượng được xây dựng làm các lớp cơ sở cho các lớp khác kế thừa.
Với mỗi lớp được tạo ra trong biểu đồ lớp như hình 4-10, chúng ta mong muốn tìm được những thuộc tính sao cho:
- Đầy đủ: chứa đựng tất cả các thông tin về đối tượng của lớp,
- Tách biệt hoàn toàn: mỗi thuộc tính thể hiện được một đặc tính khác nhau của đối tượng,
- Độc lập với nhau: đối với mỗi đối tượng, các giá trị của các thuộc tính là độc lập với đối tượng khác, tốt nhất là loại bỏ những thuộc tính có thể được suy dẫn từ những thuộc tính khác.
- Liên quan đến các yêu cầu và các ca sử dụng: các thuộc tính được đưa vào lớp phải được xác định trên cơ sở các yêu cầu thực hiện công việc hoặc cần để tổ chức, lưu trữ, trao đổi các thông tin về đối tượng.
Trong mô hình hoá các khái niệm, có thể có những nhầm lẫn giống nhau. Nhiều khi ta sử dụng những thuộc tính để biểu diễn cho những cái mà đáng lý ra phải sử dụng khái niệm lớp hay các mối quan hệ liên kết để thể hiện chúng.
Sau đây chúng ta xét một số lưu ý nhằm xác định chính xác các thuộc tính cho lớp nhằm đáp ứng các nguyên tắc cơ bản và tránh được những sai sót trên.
Đảm bảo các thuộc tính đơn giản
Các thuộc tính trong mô hình lớp phải là những thuộc tính đơn giản hoặc là những kiểu dữ liệu thuần tuý:
- Một cách trực quan, thuộc tính đơn giản nhất là những thuộc tính có giá trị kiểu dữ liệu nguyên thuỷ: Boolean, Number, String (Text), Time, v.v.
- Một số các kiểu phổ dụng bao gồm: DiaChi (Address), MauSac (Color), HinhHoc (Geometrics), SoDienThoai (PhoneNumber), SoBaoHiem (SocialSecurityNumber), MaSanPham (Universa ProductCode), các kiểu liệt kê (EnumeratedTypes), v.v.
Thông thường, nên cố tránh những thuộc tính phức tạp và nên thay vào đó là những quan hệ liên kết giữa các lớp.
Hãy xét lớp NguoiBan, có thể đưa thuộc tính heThongHienThoi vào để thể hiện là người bán hàng đang sử dụng hệ thống bán hàng nào đó. Bởi vì hệ thống HBH là lớp, nên nó là kiểu phức tạp. Do vậy, cách làm như thế không phải là tốt (hình 2). Để thể hiện được mối quan hệ này, ta có thể sử dụng mối quan hệ kết hợp như hình 3.
Trường hợp thiết kế lớp không tốt
Tốt hơn là chuyển thuộc tính phức thành quan hệ kết hợp
Qui tắc hướng dẫn đầu tiên là:
1. Liên kết các khái niệm với nhau bằng quan hệ kết hợp, không bằng các thuộc tính phức hợp.
Sử dụng giá trị dữ liệu thuần tuý
Nói một cách tổng quát, các thuộc tính phải có giá trị dữ liệu thuần tuý hoặc kiểu Data Type trong UML, trong đó việc xác định duy nhất không có nhiều ý nghĩa trong ngữ cảnh của mô hình hệ thống.
Đối với những kiểu dữ liệu nguyên thuỷ thì:
+ Không cần tách biệt các giá trị số giống nhau,
+ Không cần tách biệt các thể hiện của SoDienThoai mà chúng có thể có cùng số,
+ Không cần tách biệt hai địa chỉ vì chúng có thể giống nhau, v.v.
Song, đối với các đối tượng thì việc phân biệt chúng (thông qua định danh) lại có ý nghĩa và bắt buộc.
Ví dụ, hai khách hàng có thể cùng tên “Nguyễn Lam”, nhưng trong hệ thống phải được xác định riêng biệt bằng định danh.
Qui tắc hướng dẫn thứ hai là:
2. Phần tử của kiểu dữ liệu thuần tuý có thể được xác định trong một thuộc tính của một lớp, mặc dù nó cũng có thể được sử dụng như một khái niệm (lớp) tách biệt trong mô hình.
Không sử dụng thuộc tính như khoá ngoại
Các thuộc tính không nên sử dụng để liên kết các khái niệm lại với nhau trong mô hình khái niệm, mà chỉ được sử dụng để lưu giữ các thông tin chính các đối tượng của lớp có các thuộc tính đó. Trong thiết kế mô hình CSDL quan hệ thì nguyên lý này bị vi phạm vì, người ta thường sử dụng thuộc tính là khoá ngoại để kết nối hai kiểu thực thể với nhau.
Trong hình 4, lớp NguoiBan có thuộc tính soHieuHT được xem như là khoá ngoại để thể hiện một người bán hàng sử dụng hệ thống bán hàng có số hiệu xác định. Mặc dù thuộc tính này là thuộc tính đơn (không vi phạm hướng dẫn 1), nhưng nó là khoá ngoại vì thế vẫn không tốt và do đó, nên thay bằng quan hệ kết hợp như hình 5.
Trường hợp sử dụng khóa ngoại
Tốt hơn là chuyển thuộc tính phức thành quan hệ kết hợp
Từ đó ta có qui tắc hướng dẫn thứ ba.
3. Nên kết nối các khái niệm với nhau bằng các quan hệ kết hợp, không sử dụng thuộc tính (khoá ngoại).
Tìm thuộc tính ở đâu và như thế nào?
- Đọc kỹ các mô tả bài toán, nghiên cứu các hồ sơ các chức năng hệ thống, các đặt tả ca sử dụng, các kịch bản để tìm tất cả những thông tin, dữ liệu cần phải lưu trữ, xử lý và cập nhật. Các mục này thường là các danh từ, hoặc mệnh đề danh từ đơn, được xem như là đại biểu của các thuộc tính.
Khi xem xét luồng các sự kiện: “Đối với mỗi mặt hàng, người bán nhập vào mã sản phẩm thông qua máy đọc thẻ và số lượng hàng mà khách hàng chọn mua”. Như vậy, trong lớp MatHang tất nhiên phải có thuộc tính maSanPham, và qua nó có thể xác định được tên gọi, chủng loại, giá bán, v.v là những thuộc tính của MoTaMatHang.
- Sử dụng các qui tắc hướng dẫn nêu trên để xác định chính xác các thuộc tính: đặc tính xác định phạm vi quan sát, tên gọi, kiểu và giá trị khởi đầu (nếu có) của mỗi thuộc tính.
- Đọc những giả thiết, sự phân loại hay những qui ước cần áp dụng cho hệ thống hiện thời để khẳng định lại những thuộc tính của từng lớp.
- Gán các thuộc tính cho các lớp đối tượng trong biểu đồ lớp.
Theo cách hướng dẫn nêu trên, chúng ta có thể xác định được các thuộc tính cho các lớp để thực hiện ca sử dụng “Mua hàng bằng tiền mặt” trong biểu đồ ở hình 6 như sau:
Các thuộc tính của các lớpĐó là những thuộc tính được xác định để thực hiện ca sử dụng “Thanh toán tiền mặt”. Tương tự, xem xét các chức năng của hệ thống, nghiên cứu các ca sử dụng còn lại và dựa vào những tài liệu khác để xác định đầy đủ và chính xác các thuộc tính cho các lớp đối tượng.
Biểu đồ các lớp với các thuộc tính mô tả cấu trúc tĩnh của hệ thống. Nó mô tả mối liên kết có cấu trúc giữa các mục dữ liệu được thao tác, xử lý trong hệ thống. Nó cũng mô tả cách các thông tin được phân chia thành từng phần cho các đối tượng, chỉ ra cách các đối tượng được chia thành các lớp và thể hiện mối quan hệ giữa các đối tượng là gì.
Tóm lại, trong mô hình khái niệm chúng ta tập trung mô tả:
- Những khái niệm là các lớp đối tượng trong hệ thống,
- Các mối liên kết giữa các lớp,
- Các thuộc tính của các lớp.