JavaRush /Blog Java /Random-VI /UML: từ lý thuyết đến thực hành
Viacheslav
Mức độ

UML: từ lý thuyết đến thực hành

Xuất bản trong nhóm

Giới thiệu

Tôi nghĩ thuở nhỏ ai cũng từng nghe câu nói “ Đo hai lần, cắt một lần ”. Trong lập trình cũng vậy. Tốt hơn hết bạn nên suy nghĩ về việc triển khai trước khi dành thời gian thực hiện nó. Thông thường trong quá trình triển khai, bạn phải tạo các lớp và tạo ra sự tương tác giữa chúng. Và thường thì sự thể hiện trực quan về điều này có thể giúp giải quyết vấn đề một cách chính xác nhất. Đây là nơi UML giúp chúng ta .

UML là gì?

Nếu bạn nhìn vào hình ảnh trong các công cụ tìm kiếm, bạn sẽ thấy rõ rằng UML là một thứ gì đó về sơ đồ, mũi tên và hình vuông. Điều quan trọng là UML dịch sang Ngôn ngữ mô hình hóa thống nhất . Từ Thống nhất rất quan trọng ở đây. Nghĩa là, những bức ảnh của chúng ta sẽ không chỉ được chúng ta hiểu mà còn những người khác biết về UML sẽ hiểu được. Hóa ra đây là ngôn ngữ quốc tế để vẽ sơ đồ.

UML: từ lý thuyết đến thực hành - 1

Như Wikipedia nói

UML là ngôn ngữ mô tả đồ họa để mô hình hóa đối tượng trong phát triển phần mềm, mô hình hóa quy trình nghiệp vụ, thiết kế hệ thống và hiển thị các cấu trúc tổ chức.
Điều thú vị nhất mà không phải ai cũng nghĩ tới hay nhận ra là UML có các đặc tả. Hơn nữa, thậm chí còn có đặc tả UML2. Bạn có thể tìm thêm thông tin chi tiết về đặc tả trên trang web của Nhóm quản lý đối tượng . Trên thực tế, nhóm này đang phát triển các đặc tả UML. Điều thú vị là UML không bị giới hạn trong việc mô tả cấu trúc của các lớp. Có nhiều loại sơ đồ UML. Bạn có thể xem mô tả ngắn gọn về các loại sơ đồ UML trong cùng một Wikipedia: Sơ đồ UML hoặc trong video của Timur Batyrshinov Đánh giá sơ đồ UML . UML cũng được sử dụng rộng rãi để mô tả các quy trình khác nhau, ví dụ ở đây: Đăng nhập một lần bằng JWT . Quay trở lại việc sử dụng sơ đồ lớp UML, điều đáng chú ý là cuốn sách Head First: Design Patterns , trong đó các mẫu được minh họa bằng chính các sơ đồ UML đó. Hóa ra UML thực sự đang được sử dụng. Và hóa ra kiến ​​thức và sự hiểu biết về ứng dụng của nó lại là một kỹ năng khá hữu ích.

Ứng dụng

Hãy xem cách bạn có thể làm việc với cùng UML này từ IDE. Hãy lấy IntelliJ Idea làm IDE . Nếu chúng tôi sử dụng IntelliJ Idea Ultimate thì chúng tôi sẽ cài đặt plugin “ Hỗ trợ UML ” ngay lập tức. Nó cho phép bạn tự động tạo ra các sơ đồ lớp đẹp mắt. Ví dụ: sử dụng Ctrl+N hoặc mục menu "Điều hướng" -> "Lớp" chúng ta đi đến lớp ArrayList . Bây giờ, thông qua menu ngữ cảnh cho tên lớp, hãy chọn “Sơ đồ” -> “Hiển thị cửa sổ bật lên sơ đồ”. Kết quả là chúng ta có được một sơ đồ đẹp mắt:
UML: từ lý thuyết đến thực hành - 2
Nhưng điều gì sẽ xảy ra nếu bạn muốn tự vẽ nó và thậm chí bạn không có phiên bản Ultimate của Idea? Nếu chúng tôi sử dụng IntelliJ Idea Community Edition thì chúng tôi không có lựa chọn nào khác. Để làm được điều này, bạn cần hiểu sơ đồ UML được cấu trúc như thế nào. Đầu tiên, chúng ta cần cài đặt Graphviz . Đây là một bộ tiện ích để hiển thị đồ thị. Nó được sử dụng bởi plugin mà chúng tôi sẽ sử dụng. Sau khi cài đặt, bạn cần thêm thư mục bin từ thư mục cài đặt Graphviz vào biến môi trường PATH của mình . Sau đó, trong IntelliJ Idea, chọn Tệp -> Cài đặt từ menu. Trong cửa sổ "Cài đặt", chọn danh mục "Plugin", nhấp vào nút "Duyệt qua kho lưu trữ" và cài đặt plugin tích hợp PlantUML . Tại sao PlantUML lại tốt như vậy ? Nó sử dụng ngôn ngữ mô tả biểu đồ được gọi là " dot " để mô tả UML và điều này cho phép nó trở nên phổ biến hơn, bởi vì... Ngôn ngữ này không chỉ được PlantUML sử dụng. Hơn nữa, mọi thứ chúng tôi làm dưới đây có thể được thực hiện không chỉ trong IDE mà còn trong dịch vụ trực tuyến planttext.com . Sau khi cài đặt plugin PlantUML, chúng ta sẽ có thể tạo sơ đồ UML thông qua “File” -> “New”. Hãy tạo một sơ đồ thuộc loại "lớp UML". Trong quá trình này, một mẫu có ví dụ sẽ được tạo tự động. Hãy xóa nội dung của nó và tạo nội dung của riêng chúng ta, trang bị một bài viết từ Habr: Các mối quan hệ lớp - từ UML đến mã . Và để hiểu cách mô tả điều này trong văn bản, hãy xem hướng dẫn sử dụng PlantUML: plantuml class-diagram . Ngay từ đầu, có một bảng hiển thị cách mô tả các kết nối:
UML: từ lý thuyết đến thực hành - 3
Chúng ta cũng có thể xem xét các kết nối ở đây: " Mối quan hệ giữa các lớp trong UML. Ví dụ ." Dựa trên những tài liệu này, hãy bắt đầu tạo sơ đồ UML của chúng ta. Hãy thêm nội dung sau mô tả hai lớp:

@startuml
class ArrayList {
}
class LinkedList {
}
@enduml
Để xem kết quả trong Idea, chọn "View" -> "Tool Windows" -> "PlantUML". Chúng ta sẽ chỉ có hai hình vuông đại diện cho các lớp. Như chúng ta đã biết, cả hai lớp này đều triển khai giao diện List. Mối quan hệ lớp này được gọi là thực hiện. Để mô tả kết nối như vậy, hãy sử dụng mũi tên có đường chấm chấm. Hãy mô tả nó:
interface List
List <|.. ArrayList
List <|.. LinkedList
List- một trong những lớp trẻ em Collection. Tức là nó kế thừa từ Collection. Kết nối này được gọi là khái quát hóa. Nó trông giống như một mũi tên với một đường liên tục đều đặn. Hãy mô tả nó:
interface Collection
Collection <|-- List
Đối với loại kết nối sau, hãy thêm vào mô tả lớp ArrayListmột mục về mảng phần tử riêng của gói :
~Object[] elementData
Bây giờ chúng tôi muốn hiển thị những gì ArrayListchứa một số đối tượng. Trong trường hợp này, loại kết nối sẽ là tổng hợp . Đơn vị trong trường hợp này là ArrayList, bởi vì nó chứa các đối tượng khác. Chúng tôi chọn tập hợp vì các đối tượng trong danh sách có thể tồn tại mà không cần danh sách: chúng không phải là một phần không thể thiếu của danh sách. Thời gian tồn tại của chúng không gắn liền với thời gian tồn tại của danh sách. Tổng hợp được dịch từ tiếng Latin là "được lắp ráp", nghĩa là một cái gì đó được tạo thành từ một cái gì đó. Ví dụ, trong cuộc sống có một bộ phận bơm, bao gồm một máy bơm và một động cơ. Bản thân thiết bị có thể được tháo rời, để lại một số bộ phận của nó. Ví dụ, để bán hoặc đưa vào một đơn vị khác. Danh sách cũng vậy. Và điều này được thể hiện dưới dạng một viên kim cương trống gần đơn vị và một đường liên tục. Hãy mô tả nó như thế này:
class Object{
}
ArrayList o- Object
Bây giờ chúng tôi muốn chứng minh rằng, không giống như ArrayList, lớp này LinkedListchứa Nodecác thùng chứa tham chiếu đến dữ liệu được lưu trữ. Trong trường hợp này, Nodehọ là một phần của chính họ LinkedListvà không thể sống tách biệt. Nodekhông phải là nội dung được lưu trữ trực tiếp mà chỉ chứa một liên kết đến nó. Ví dụ: khi chúng tôi thêm vào LinkedListmột hàng, chúng tôi thêm một hàng mới Nodechứa liên kết đến hàng đó cũng như liên kết đến hàng trước và hàng tiếp theo Node. Kiểu giao tiếp này được gọi là thành phần . Để hiển thị một hỗn hợp (bao gồm các bộ phận), một viên kim cương màu được vẽ, với một đường liên tục dẫn đến nó. Bây giờ hãy viết điều này dưới dạng hiển thị văn bản của kết nối:
class Node{
}
LinkedList *-- Node
Và bây giờ chúng ta cần học cách thể hiện một loại mối quan hệ quan trọng khác - mối quan hệ phụ thuộc . Nó được sử dụng khi một lớp sử dụng lớp khác và lớp đó không chứa lớp đang được sử dụng và không phải là lớp con của nó. Ví dụ: LinkedListhọ ArrayListbiết cách tạo các tệp ListIterator. Hãy hiển thị điều này dưới dạng mũi tên có đường chấm chấm:
class ListIterator
ListIterator <... ArrayList : create
ListIterator <... LinkedList : create
Sau tất cả, nó sẽ trông như thế này:
UML: từ lý thuyết đến thực hành - 4
Bạn có thể đi sâu vào chi tiết nếu cần thiết. Tất cả các ký hiệu được chỉ định ở đây: " PlantUML - Sơ đồ lớp ". Ngoài ra, không có gì siêu nhiên khi vẽ một sơ đồ như vậy và khi thực hiện nhiệm vụ của mình, bạn có thể nhanh chóng vẽ nó bằng tay. Điều này sẽ phát triển kỹ năng suy nghĩ của bạn về kiến ​​trúc ứng dụng và giúp bạn sớm xác định các sai sót trong cấu trúc lớp, thay vì sau khi bạn dành cả ngày để triển khai mô hình sai. Tôi nghĩ đó là lý do chính đáng để thử? )
UML: từ lý thuyết đến thực hành - 5

Tự động hóa

Có nhiều cách khác nhau để tự động tạo sơ đồ PlantUML. Ví dụ: Idea có plugin SketchIT , nhưng nó không vẽ chúng một cách chính xác. Ví dụ: việc triển khai các giao diện được vẽ không chính xác (hiển thị dưới dạng kế thừa). Ngoài ra còn có các ví dụ trên Internet về cách đưa điều này vào vòng đời xây dựng dự án của bạn. Giả sử có một ví dụ về việc Maven sử dụng uml-java-docklet . Để hiển thị cách thực hiện điều này, chúng tôi sẽ sử dụng Maven Archetype để nhanh chóng tạo dự án Maven. Hãy thực hiện lệnh: mvn archetype:generate Khi được yêu cầu chọn bộ lọc ( Chọn một số hoặc áp dụng bộ lọc ), hãy để mặc định bằng cách nhấn Enter. Đây sẽ luôn là " maven-archetype-quickstart ". Chọn phiên bản mới nhất. Tiếp theo, chúng tôi trả lời các câu hỏi và hoàn thành việc tạo dự án:
UML: từ lý thuyết đến thực hành - 6
Vì Maven không phải là trọng tâm của bài viết này nên bạn có thể tìm thấy câu trả lời cho các câu hỏi về Maven của mình trong Trung tâm người dùng Maven . Trong dự án đã tạo, hãy mở tệp mô tả dự án, pom.xml, để chỉnh sửa . Hãy sao chép nội dung từ mô tả cài đặt uml-java-docklet vào đó . Không thể tìm thấy tạo phẩm được sử dụng trong mô tả trong kho lưu trữ của Trung tâm Maven. Nhưng nó hiệu quả với tôi với điều này: https://mvnrepository.com/artifact/com.chfourie/uml-java-doclet/1.0.0 . Nghĩa là, trong mô tả đó, bạn chỉ cần thay thế groupId từ “ info.leadlight ” bằng “ com.chfourie ” và đặt phiên bản thành “ 1.0.0 ”. Sau này, chúng ta có thể thực thi các lệnh này trong thư mục chứa tệp pom.xmlmvn clean install : và mvn javadoc:javadoc. Bây giờ, nếu chúng ta mở tài liệu đã tạo (explorer target\site\apidocs\index.html), chúng ta sẽ thấy các sơ đồ UML. Nhân tiện, việc triển khai đã được hiển thị chính xác ở đây)

Phần kết luận

Như bạn có thể thấy, UML cho phép bạn trực quan hóa cấu trúc ứng dụng của mình. Hơn nữa, UML không chỉ giới hạn ở điều này. Sử dụng UML, bạn có thể mô tả các quy trình khác nhau trong công ty của mình hoặc mô tả quy trình kinh doanh trong đó chức năng bạn đang viết hoạt động. UML hữu ích như thế nào đối với cá nhân bạn là tùy bạn quyết định, nhưng dành thời gian để đọc nó chi tiết hơn sẽ hữu ích trong mọi trường hợp. #Viacheslav
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION