2013-05-13 28 views
11

Tôi phải thiết kế ngược một số lớp từ một ứng dụng Java thành một sơ đồ lớp UML 2. Cho đến nay rất tốt, tôi đã tìm thấy cách thể hiện các mẫu lớp cho cả lớp như được đề xuất bởi Jon Skeet tại đây: What is the correct way to represent template classes with UML?. Với thông tin này, tôi đã ngược thiết kế một lớp học như thế này:Làm cách nào để trình bày tham số chung trong phương pháp UML?

public class Foo<T> { 
    //class fields and methods... 
} 

Bây giờ tôi có một tiến thoái lưỡng nan cố gắng để thiết kế đối chiếu một lớp học mà chỉ là một phương pháp có chứa một tham số chung:

public class OtherFoo { 
    public <T extends Comparable<T>> boolean bar(T x, T y) { 
     //fancy code goes here... 
    } 
} 

Bạn có biết làm thế nào để đạt được bất kể công cụ UML 2 nào? Tôi chỉ muốn hiểu khái niệm.

+0

+1, Câu hỏi hay !!!!! – NINCOMPOOP

Trả lời

9

Tôi không biết cách thực hiện điều này trong công cụ lựa chọn của bạn, nhưng ở cấp mô hình, nó hoạt động chính xác như đối với các lớp học. Bạn tạo một thao tác mẫu với chữ ký của bạn.

Chương 17.4.14 của UML2 superstructure định này cho ký hiệu:

Các thông số mẫu và mẫu tham số ràng buộc của một mẫu hoạt động là hai danh sách ở giữa tên của hoạt động và các thông số của hoạt động .
* < tầm nhìn> < name> '<' < mẫu tham số-list> '>' '< <' < ràng buộc thể hiện-list> '>>' '(' < parameter> [ '' < tham số >] ** ')' [ ':' < bất động sản-string>]

trong trường hợp của bạn, trước tiên hãy xem các trường hợp đơn giản của

public <T> boolean bar(T x, T y) 

này sẽ tương ứng với

+ thanh < T> (x: T, y: T): Boolean

dụ ban đầu của bạn có vẻ phức tạp hơn một chút vì các tham số mẫu bị hạn chế khác class, Comparable, đến lượt nó cũng là một khuôn mẫu có tham số (tôi sẽ gọi nó là T1) được liên kết với tham số của hoạt động lần lượt. Điều này cho phép chúng tôi

+ thanh < T> tương đương < T1-> T >> (x: T, y: T): Boolean


Lưu ý: (Một chút rambling sâu phía trước) Các mẫu được chỉ định bởi UML (và ở một mức độ nào đó C++) là một con thú rất khác với Generics trong Java. Họ có vẻ ít nhiều giống nhau, nhưng đôi khi có những sự khác biệt tinh tế trong ngữ nghĩa của họ khiến họ khó có thể kết hợp cả hai.Điều quan trọng nhất trong UML là:

Mẫu không thể được sử dụng theo cách tương tự như phần tử không phải mẫu cùng loại. Phần tử mẫu có thể chỉ được sử dụng để tạo các phần tử bị ràng buộc (ví dụ: một lớp mẫu không thể được sử dụng làm loại phần tử đã nhập) hoặc như một phần của đặc tả của mẫu khác (ví dụ: một lớp mẫu có thể chuyên lớp mẫu khác).

Điều này có nghĩa là trong UML, OtherFoo cũng cần phải là mẫu - tức là có chữ ký mẫu (có 0 tham số). Để sau đó sử dụng mẫu hoạt động chính xác bên ngoài phạm vi mẫu - tức là gọi nó trong một hoạt động hoặc tương tự - trước tiên bạn phải liên kết nó với một hoạt động cụ thể, được sử dụng thay thế. Trong trường hợp ví dụ của bạn, điều này có nghĩa là:

  1. Ràng buộc mẫu OtherFoo khác vào lớp bị ràng buộc (ẩn danh).
  2. Mẫu hoạt động thanh liên kết đến một thao tác trong lớp bị ràng buộc.
+1

Tôi thấy thông tin này rất hữu ích, rõ ràng là tinh thể, cảm ơn. Nó sẽ là tuyệt vời cho độc giả trong tương lai nếu bạn có thể thêm một hình ảnh của hai ví dụ mới nhất như JonSkeet đã làm trong câu trả lời của mình (kiểm tra các liên kết trên câu hỏi của tôi). –

+0

biểu thức đó "* + thanh So sánh T >> (x: T, y: T): Boolean *" có vẻ lạ đối với tôi. Là dấu hiệu lớn hơn đầu tiên sau khi T thực sự chính xác? Không nên là một "* -> *"? – IARI

+0

Không, "->" biểu thị ràng buộc tham số mẫu, trong khi ">" biểu thị ràng buộc kiểu trên tham số mẫu. Vì vậy, trong trường hợp này, nó không có nghĩa là "bind T to Comparable", nhưng "giới hạn T thành các kiểu con của Comparable". Xem phần UML Superstructure "Mẫu phân loại"/"Ký hiệu" (phần 9.3.4 cho UML 2.5) để biết chi tiết. – Carsten

Các vấn đề liên quan