Software Development và UML Class diagram
“Cho tôi sáu giờ để chặt một cái cây, tôi sẽ dành bốn giờ đầu tiên để mài rìu.”
- Abraham Lincoln
Trích dẫn này cũng phù hợp cho developer chúng ta. Thay vì cắm đầu vào code một project mà không biết trước các thành phần cấu tạo nên ứng dụng, chúng ta nên thiết lập một mô hình dữ liệu. Đây cũng chính là cách chúng ta mài chiếc rìu của mình. Chúng ta cần xem xét những gì chúng ta cần phải có, làm sao để nhận được phản hồi và cải thiện các thiếu sót. Những cân nhắc này sẽ làm giảm khả năng thất bại bằng cách chuẩn bị cho cho chúng ta một mô hình ứng dụng phù hợp thực tế hơn.
Vẽ ra một mô hình giúp chúng ta viết code một cách gọn gàng hơn vì thông qua nó chúng ta nhìn thấy một bức tranh tổng thể về ứng dụng cần xây dựng. Mô hình hóa phần mềm đã xuất hiện trong nhiều thập kỷ và UML đã trở thành tiêu chuẩn được áp dụng rộng rãi nhất.
A picture is worth a thousand words — UML
Quá trình phát triển phần mềm hiếm khi là một quá trình độc lập chỉ đơn thuần là code. Vì thế là một developer, chúng ta làm việc không chỉ với developer mà còn là nhà thiết kế, quản lý dự án và cả khách hàng để tạo ra một sản phẩm phần mềm phù hợp với mọi người.
Giao tiếp là một điều cực kỳ quan trọng để giữ cho các dự án đi đúng hướng, nhưng việc thông tin sai cũng dễ xảy ra khi có quá nhiều stakeholders trong một lĩnh vực. Đôi khi, những developer như chúng ta cũng thấy rằng sau một cuộc trò chuyện dài về technical, bỗng chợt nhận ra rằng cả nhóm hoàn toàn không nói về cùng một thứ.
Object Management Group đang duy trì Unified Modeling Language là tiêu chuẩn cho việc sơ đồ hóa và nó được International Organization for Standardization chấp thuận. Một tiêu chuẩn lập sơ đồ để tránh các thông tin sai lệch do sử dụng kiểu sơ đồ khác nhau.
Sơ đồ lớp - Class Diagram
Sơ đồ lớp thể hiện các loại đối tượng trong hệ thống, cũng như mối quan hệ giữa chúng. Chúng cũng là đại diện cho mức trừu tượng thấp nhất, ví dụ như classes và interfaces. Đây là loại mô hình hóa được sử dụng phổ biến nhất, cung cấp cái nhìn tĩnh của hệ thống và là một phần của quá trình thiết kế phần mềm.
Có ba nhóm yếu tố chính tạo nên sơ đồ lớp: Classifier, Feature và Relationship.
Lớp (Classifiers) - Đại diện cho các loại thực thể trong hệ thống như một super type, chẳng hạn như các abstract hoặc concrete classes, interfaces, enumerations, generic classes,... Lớp là một chiếc hộp chứa với ba ngăn, tên ở ngăn trên cùng, hai ngăn dưới cùng liệt kê các đặc điểm cấu trúc và hành vi (structural and behavioral features).
Các tính năng (Features) - Xác định các đặc điểm cấu trúc và hành vi của lớp. Các structural features là các thuộc tính được đề cập ngăn thứ 2 trong một lớp, và behavioral features là các hoạt động hoặc phương thức ở ngăn dưới cùng.
Mối quan hệ (Relationships) - Cho biết các thực thể này có liên quan với nhau như thế nào, giúp hệ thống hoạt động bằng cách kết nối tất cả các lớp lại với nhau. Các mối quan hệ giúp thể hiện các lớp phụ thuộc vào nhau, kế thừa lẫn nhau hoặc là triển khai các interfaces. Các mối quan hệ thường được chia thành ba loại: liên kết (associations), khái quát (generalizations) và phụ thuộc(dependencies).
Làm cách nào để xác định các thành phần của mô hình?
Để vẽ được một sơ đồ lớp từ các đặc điểm kỹ thuật:
Bước đầu tiên, xác định tất cả các danh từ - các danh từ này thường có tiềm năng trở thành một lớp, được xem như là các thực thể sẽ được đưa vào hệ thống.
Tiếp theo, xác định các thuộc tính của các lớp.
Cuối cùng, xác định các động từ chỉ ra mối quan hệ giữa các lớp thực thể này và mô hình hóa các method.
Sau khi xác định được các yếu tố chính này, chúng ta có thể tạo sơ đồ lớp bằng cách sử dụng ký hiệu UML.
Classifiers
Classifiers là một trừu tượng chung cho các loại đối tượng khác nhau như lớp và giao diện. Có sáu loại Classifiers.
Khi chúng ta bắt đầu lập mô hình cho classifier, mọi thứ bắt đầu như một lớp bình thường. Trong thời gian đó, rất khó để quyết định xem nó nên là một lớp trừu tượng, một giao diện hay một loại classifier nào đó khác. Khi đã tham gia phát triển một số phần trong hệ thống, chúng ta sẽ bắt đầu thấy khả năng áp dụng design patterns có thể nâng cao chất lượng thiết kế của bạn. Những patterns sẽ giúp chúng ta trong việc lựa chọn sử dụng các loại classifier.
Cùng xem qua 6 loại classifier trong hình dưới đây:
Các lớp cụ thể (Concrete class), lớp trừu tượng (abstract class) và giao diện (interface) là những kiểu phổ biến nhất, với ký hiệu chung là hộp có ba ngăn, ngăn trên cùng chứa tên của Classifier.
Tên lớp cụ thể thường được viết bằng kiểu chữ thông thường.
Tên của các lớp trừu tượng được in nghiêng, stereotyped hoặc cả hai. Stereotyped là đặt kiểu trừu tượng trong dấu ngoặc kép. Đây là thứ mà UML cung cấp để phân loại bổ sung nhiều thứ nâng cao hơn những gì ký hiệu UML tiêu chuẩn cung cấp.
Với interface, chúng ta có thể dùng stereotyped hoặc chữ I, hoặc bạn có thể sử dụng ký hiệu hình kẹo mút, như được hiển thị bên dưới, trong đó interface được vẽ dưới dạng một vòng tròn gắn với lớp triển khai của nó.
Tương tự với enumeration, chúng ta có thể dùng stereotyped hoặc chữ E.
Một lớp chung (generic class) sử dụng một tham số mẫu, được hiển thị dưới dạng một hình chữ nhật nhỏ ở góc trên cùng bên phải.
Các Active Class được biểu diễn bằng hình chữ nhật với các thanh ở hai bên. Ký hiệu mô tả một lớp chạy tự động trong luồng của chính nó.
Feature
Trong sơ đồ lớp, yếu tố chính thứ hai xác định các đặc điểm cấu trúc và hành vi của Classifier. Trong một lớp, các đặc điểm cấu trúc là các thuộc tính và các đặc điểm hành vi là các phương thức.
Mặc dù chúng ta chỉ có thể viết những điều cơ bản về thuộc tính, chẳng hạn như tên và kiểu dữ liệu, UML cung cấp một số ký hiệu hữu ích để thêm các chi tiết về chúng.
Attributes - Structural Features Đặc điểm cấu trúc
Chuỗi này hiển thị các khía cạnh khác nhau của thuộc tính.
visibility attribute-name: type multiplicity = default-value {property-modifier} |
Visibility
private : -
protected : #
package: ~
public: +
Tiếp theo là tên của thuộc tính, sau đó là kiểu dữ liệu của nó.
Multiplicity: Nó cho biết thuộc tính này sẽ chứa bao nhiêu trường hợp giá trị:
không hoặc nhiều: *
một hoặc nhiều: 1 .. *
chỉ một: 1
giữa m và n: m..n
Giá trị mặc định: Nếu thuộc tính có giá trị mặc định, thì bạn có thể đặt giá trị đó sau dấu bằng.
Property-modifier: Trong dấu ngoặc nhọn, chúng ta có thể cung cấp các bổ sung khác cho thuộc tính như readOnly, unique, ...
Methods - Behavioural Features - Đặc điểm hành vi
Các thuộc tính về hành vi là các hoạt động hoặc phương thức và được mô hình hóa theo cách tương tự như các thuộc tính.
visibility method-name (parameter-list): return-type {property-modifier} |
Visibility
private : -
protected : #
package: ~
public: +
Tiếp theo là tên của phương thức, sau đó là các tham số trong ngoặc đơn.
Parameter-list: Các tham số có thể là input, output hoặc cả hai.
direction name:type = default-value |
Return-type: Giá trị trả về sau khi gọi phương thức.
Property-modifier: Trong dấu ngoặc nhọn, chúng ta có thể cung cấp các bổ sung khác cho thuộc tính như ordered, unique, ...
Relationship
Mối quan hệ là yếu tố quan trọng thứ ba trong sơ đồ lớp. Có nhiều loại mối quan hệ giữa hai Classifier bất kỳ.
Chúng có thể được chia thành association, generalization và dependency..
Association
Có hai cách mà các liên kết có thể được thể hiện, các liên kết liên kết và các lớp liên kết. Ngoài ra, các liên kết liên kết có thể là các compositions or aggregations.
Association link
Một liên kết kết hợp được tạo ra khi một lớp nguồn, sử dụng một thể hiện của một lớp khác - lớp đích. Liên kết này thể hiện ở cấp độ chủ thể - instance. Lưu ý rằng lớp nguồn tham chiếu đến một số thuộc tính của lớp đích, điều này cho biết rằng nó tham chiếu đến một instance của lớp đích. Mối quan hệ được biểu diễn với các mũi tên với các nhãn, nhãn sao và nhãn 1 biểu thị bản số - multiplicity.
Aggregation and Composition
Liên kết có thể là một tập hợp (aggregation) nếu cá thể nguồn chứa một hoặc nhiều cá thể đích - ký hiệu hình thoi rỗng. Còn các liên kết thuộc loại composition được biểu diễn dưới dạng hình thoi.
Sự khác biệt giữa aggregation và composition là aggregation chứa một lớp đích, nhưng đích cũng có thể thuộc về các lớp nguồn khác và chúng tồn tại riêng biệt, trong khi trong một composition, quyền sở hữu lớp đích không được chia sẻ giữa các nguồn khác và lớp đích tồn tại khi lớp nguồn của nó tồn tại.
Association Class
Association Class là một lớp kết hợp mô hình hóa mối quan hệ giữa hai lớp phụ thuộc lẫn nhau. Một lớp kết hợp giúp tách hai lớp phụ thuộc lẫn nhau bằng cách đưa các lớp phụ thuộc của chúng vào một lớp thứ ba.
Generalization
Loại mối quan hệ thứ hai giữa các classifiers là khái quát hóa, đơn giản là mối quan hệ kế thừa giữa hai lớp hoặc interface biểu diễn bằng một mũi tên dẫn từ lớp con đến lớp cha. Mối quan hệ tổng quát hóa chỉ ra rằng lớp con kế thừa các lớp cha của chúng một cách ngầm định.
Dependency
Loại mối quan hệ thứ ba là mối quan hệ phụ thuộc giữa các classifiers, trong đó một classifiers hoạt động như một client và một classifiers khác đóng vai trò là supplier cho các đặc điểm và triển khai. Đây là một mối quan hệ compiled time. Ví dụ đơn giản về điều này là mối quan hệ giữa một lớp và một interface. Nếu một lớp triển khai một interface, thì nó là một client của interface. Mối quan hệ phụ thuộc được biểu diễn bằng các mũi tên chấm hoặc đứt nét đi từ client đến supplier.