Sự khác biệt giữa liên kết và phụ thuộc?


91

Trong sơ đồ lớp UML, sự khác biệt giữa mối quan hệ kết hợp và mối quan hệ phụ thuộc là gì?

Theo những gì tôi biết, một hiệp hội là một mối quan hệ mạnh mẽ hơn một mối quan hệ phụ thuộc, nhưng tôi không chắc nó mạnh hơn như thế nào.

Bất kỳ ví dụ nào cũng được chào đón nhiều hơn :)

Câu trả lời:


50

Sự khác biệt giữa phụ thuộc và liên kết là gì? :

Nói chung, bạn sử dụng một liên kết để đại diện cho một cái gì đó giống như một trường trong một lớp. Liên kết luôn ở đó, trong đó bạn luôn có thể đặt hàng cho khách hàng của họ. Nó thực sự không cần phải là một trường, nếu bạn đang mô hình hóa từ một góc độ giao diện hơn, nó chỉ có thể chỉ ra sự hiện diện của một phương thức sẽ trả lại khách hàng của đơn đặt hàng.

Trích dẫn từ ấn bản thứ 3 của UML Distilled (hiện vừa mới ra mắt) "tồn tại sự phụ thuộc giữa hai phần tử nếu những thay đổi đối với định nghĩa của một phần tử (nhà cung cấp) có thể gây ra thay đổi cho phần tử kia (khách hàng)". Đây là một mối quan hệ rất mơ hồ và chung chung, đó là lý do tại sao UML có một loạt các khuôn mẫu cho các dạng phụ thuộc khác nhau. Theo thuật ngữ mã, những thứ như đặt tên một kiểu tham số và tạo một đối tượng trong một biến tạm thời bao hàm một sự phụ thuộc.

...


6
Tại sao phải trả lời, khi Martin làm điều đó tốt hơn rất nhiều cho bạn ?! +1
Randolpho

5
Đối với tôi nó vẫn chưa rõ ràng, nhưng một điều tôi đã hiểu là các phụ thuộc có phần 'yếu' hơn các liên kết. Có vẻ như các liên kết là một tập hợp con của các phụ thuộc, mặc dù theo quan điểm của tôi ít nhất, phụ thuộc là một từ mạnh hơn liên kết. Đó cũng có thể là nguồn gốc của sự nhầm lẫn.
Felipe

Bài báo đó nói lên điều đó. Trong thực tế, nó phù hợp với suy nghĩ của tôi. Vì vậy, rút ​​ra một số điểm từ nó ở đây: (1) Bạn không muốn hiển thị mọi phụ thuộc trên một biểu đồ UML - có quá nhiều. Bạn cần phải rất chọn lọc và chỉ hiển thị những nội dung quan trọng đối với bất cứ điều gì bạn đang giao tiếp. (2) Nếu có sự liên kết giữa hai lớp thì cũng có sự phụ thuộc. Sự liên kết ngụ ý nó, cũng như sự tổng quát hóa. Vì vậy, rõ ràng để suy ra sự phụ thuộc là mối quan hệ hơi superset của mối quan hệ UML khác
Mahesha999

1
Lời giải thích của bạn quá xa so với các ví dụ trong thế giới thực, vì vậy nó không mang lại hiểu biết rõ ràng cho ngay cả các kỹ sư phần mềm.
softninja

@ softninja: ý bạn là bạn không hiểu. Mọi người khác dường như thấy nó có thể chấp nhận được. Ồ và cảm ơn vì đã ủng hộ.
Mitch Wheat,

73

Một liên kết hầu như luôn ngụ ý rằng một đối tượng này có đối tượng kia là một trường / thuộc tính / thuộc tính (thuật ngữ khác nhau).

Một phụ thuộc thường (nhưng không phải luôn luôn) ngụ ý rằng một đối tượng chấp nhận một đối tượng khác làm tham số phương thức, khởi tạo hoặc sử dụng một đối tượng khác. Một sự phụ thuộc được ngụ ý rất nhiều bởi một liên kết .


Đây là cách gần nhất với cách tôi thường quyết định vấn đề. Nếu lớp khác đóng góp một cách đáng kể vào trạng thái hoặc hành vi của lớp tôi thì đó là một liên kết. Vì vậy, các lớp chiến lược sẽ là các hiệp hội ngay cả khi chúng không có trạng thái bên trong của riêng mình. Nếu lớp khác chỉ cung cấp một dịch vụ cho lớp của tôi thì nó là một phần phụ thuộc.
Terrible Tadpole,

49

Theo điều kiện OOP:

Liên kết -> Một đối tượng có-một C (như một biến thành viên)

Phụ thuộc -> A tham chiếu B (dưới dạng tham số phương thức hoặc kiểu trả về)

public class A {
    private C c;
    public void myMethod(B b) {
        b.callMethod();
    }
}

Ngoài ra còn có một câu trả lời chi tiết hơn .


1
@Naruto_Uzumaki Tổng hợp là một mối quan hệ toàn bộ. Danh sách phát & Bài hát chẳng hạn. Vui lòng kiểm tra câu trả lời khác của tôi cho một sự khác biệt lớn hơn giữa Hiệp hội, phụ thuộc và Aggregation stackoverflow.com/a/34069760/1998422
Ahmad Abdelghany

Từ cuốn sách UML Distilled của Martin Fowler : "Với các lớp, sự phụ thuộc tồn tại vì nhiều lý do: Một lớp gửi thông điệp đến lớp khác; một lớp có một lớp khác như một phần dữ liệu của nó; một lớp đề cập đến lớp khác như một tham số cho một phép toán"
Ahmad Abdelghany

24

Sự phụ thuộc giống như khi bạn định nghĩa một phương thức lấy Chuỗi (trong Java, C #, vì chuỗi là một đối tượng trong chúng) làm tham số, thì lớp của bạn phụ thuộc vào lớp String.

Liên kết giống như khi bạn khai báo một chuỗi như một thuộc tính trong lớp của bạn. thì mã của bạn được liên kết với lớp chuỗi.

String name = null //: is a association.

"Liên kết giống như khi bạn khai báo một chuỗi như một thuộc tính trong lớp của bạn. Thì mã của bạn được liên kết với lớp chuỗi." Nếu đúng như vậy, thì sự khác biệt giữa liên kết và thành phần là gì?
Dean P

16

Sự phụ thuộc - Sự thay đổi trong một lớp ảnh hưởng đến sự thay đổi trong lớp phụ thuộc của nó. Ví dụ- Hình tròn phụ thuộc vào Hình dạng (một giao diện). Nếu bạn thay đổi Hình dạng, nó cũng ảnh hưởng đến Hình tròn. Vì vậy, Circle có sự phụ thuộc vào Shape.

Liên kết - nghĩa là có một mối quan hệ nhất định giữa 2 đối tượng

(một-một, một-nhiều, nhiều-nhiều)

Hiệp hội có 2 loại-

  1. Thành phần
  2. Tổng hợp

    1) Thành phần - Liên kết mạnh hơn hoặc mối quan hệ giữa 2 đối tượng. Bạn đang tạo một đối tượng của một lớp B bên trong một lớp A khác

 public class A {
       B b;
       public void setB(){
         this.b= new B();
        }
     }

Nếu chúng ta xóa lớp A, B sẽ không tồn tại (đối tượng B chỉ được tạo bên trong A).

Một ví dụ khác - Cơ thể & Gan. Sự sống không thể tồn tại bên ngoài Cơ thể.

2) Tính tổng hợp - kiểu liên kết yếu hơn giữa 2 đối tượng.

public class A {       
             B b;
             public void setB(B b_ref){
                 this.b= b_ref;   
                /* object B is passed as an argument of a method */
              }
   }

Ngay cả khi bạn xóa lớp A, B sẽ tồn tại bên ngoài (B được tạo bên ngoài và chuyển cho Lớp A)

Một ví dụ khác về điều này- Man & Car. Man has a Car nhưng Man & Car tồn tại độc lập.


Sự phụ thuộc là phạm vi cục bộ, trong đó Hiệp hội là phạm vi lớp.
dimpiax

10

Tại đây: "Liên kết so với Phụ thuộc so với Tổng hợp so với Thành phần" , bạn có một kho tàng tuyệt vời với sơ đồ lớp uml và đoạn mã. Tác giả cho chúng ta một danh sách các mối quan hệ: Liên kết, Phụ thuộc, Tổng hợp, Thành phần ở một nơi.


1
Tôi thích định nghĩa này. Hiệp hội là: Tôi (lớp tham chiếu đến lớp khác) chỉ giữ một tham chiếu đến một đối tượng, tôi không sử dụng nó và các thành viên của lớp đó không thú vị với tôi. Sự phụ thuộc là: Tôi sử dụng một số thành viên, vì vậy nếu lớp được tham chiếu thay đổi, nó có thể ảnh hưởng đến tôi. Nếu tôi hiểu đúng hơn thì thật dễ hiểu!
robsch

1
Câu hỏi đầu tiên xuất hiện trong đầu khi tôi đọc bình luận của bạn: trong trường hợp liên kết - tại sao người ta lại giữ một tham chiếu đến một đối tượng và không sử dụng nó? Có phải ý của bạn là tham chiếu chỉ là một trường, chỉ được trả về nếu khách hàng muốn biết về tham chiếu?
H.Rabiee

3

Sự phụ thuộc là rất chung chung và việc giảm độ phức tạp là giảm bớt sự phụ thuộc càng nhiều càng tốt.

Một liên kết là một phụ thuộc mạnh (tĩnh). Tổng hợp và Thành phần thậm chí còn mạnh hơn.


-1

Liên kết là khi một đối tượng chỉ có một liên kết đến một đối tượng khác và không sử dụng các phương thức đối tượng quan hệ. Ví dụ như ruby

class User
  has_one :profile
end

user = User.first
profile = user.profile
profile.sign_out

Nó có nghĩa là bạn có thể lấy một đối tượng hồ sơ từ người dùng nhưng người dùng không sử dụng các phương thức của hồ sơ bên trong mình (không phụ thuộc vào giao diện của Hồ sơ).

Sự phụ thuộc có nghĩa là Người dùng có liên kết đến một đối tượng khác và gọi các phương thức của đối tượng đó bên trong chính mình

class User
  has_one :profile

  def personal_info
    profile.info
  end
end

Ở đây, nếu phương thức thông tin của Hồ sơ sẽ được thay đổi hoặc đổi tên thì lớp Người dùng phụ thuộc của chúng tôi cũng cần được thay đổi.


Bạn có thể vui lòng cho biết bạn lấy thông tin này từ đâu? Tôi không nghĩ rằng có một quy tắc trong thông số kỹ thuật UML nói rằng một bên của liên kết không sử dụng các phương thức của bên kia. Nói chung, mối liên kết là một mối quan hệ mạnh mẽ hơn mối quan hệ phụ thuộc.
Geert Bellekens

@GeertBellekens Như tôi hiểu Sự phụ thuộc cần cho thấy rằng những thay đổi trong lớp nhà cung cấp sẽ yêu cầu những thay đổi trong lớp khách hàng. Trong lập trình, điều này chỉ xảy ra khi bạn đang sử dụng giao diện của nhà cung cấp (hoặc Cho tôi biết lý do khác). Từ quan điểm của bạn, không có sự khác biệt trong các mũi tên này. Họ không chỉ đến việc triển khai mã và chỉ là khái niệm.
stopanko

Tôi e rằng đó là hiểu biết cá nhân của bạn, nhưng không phải cách nó được mô tả trong thông số kỹ thuật của UML. Từ UML 2.5 § 7.8.4.1: Sự phụ thuộc là một Mối quan hệ biểu thị rằng một Phần tử mô hình đơn lẻ hoặc một tập hợp các Phần tử mô hình yêu cầu các Phần tử mô hình khác cho đặc tả hoặc triển khai của chúng. Điều này có nghĩa là ngữ nghĩa hoàn chỉnh của (các) clientElement phụ thuộc về mặt ngữ nghĩa hoặc cấu trúc vào định nghĩa của (các) Phần tử nhà cung cấp.
Geert Bellekens
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.