ความแตกต่างระหว่างการเชื่อมโยงและการพึ่งพา?


92

ในแผนภาพคลาส UML ความสัมพันธ์แบบเชื่อมโยงกับความสัมพันธ์แบบพึ่งพาต่างกันอย่างไร

จากสิ่งที่ฉันรู้ความสัมพันธ์เป็นความสัมพันธ์ที่แน่นแฟ้นมากกว่าการพึ่งพาอาศัยกัน แต่ฉันไม่แน่ใจว่ามันแข็งแกร่งแค่ไหน

ตัวอย่างใด ๆ ก็ยินดีต้อนรับ :)

คำตอบ:


50

ความแตกต่างระหว่างการพึ่งพาและการเชื่อมโยงคืออะไร? :

โดยทั่วไปคุณใช้การเชื่อมโยงเพื่อแสดงบางสิ่งเช่นเขตข้อมูลในชั้นเรียน ลิงก์จะอยู่ที่นั่นเสมอซึ่งคุณสามารถถามคำสั่งซื้อสำหรับลูกค้าได้ตลอดเวลา จริง ๆ แล้วไม่จำเป็นต้องเป็นฟิลด์หากคุณกำลังสร้างโมเดลจากมุมมองของอินเทอร์เฟซที่มากขึ้นก็สามารถบ่งบอกถึงการมีอยู่ของวิธีการที่จะส่งคืนลูกค้าของคำสั่งซื้อ

หากต้องการอ้างอิงจาก UML Distilled รุ่นที่ 3 (ตอนนี้เพิ่งออก) "การอ้างอิงมีอยู่ระหว่างสององค์ประกอบหากการเปลี่ยนแปลงคำจำกัดความขององค์ประกอบหนึ่ง (ซัพพลายเออร์) อาจทำให้เกิดการเปลี่ยนแปลงกับอีกองค์ประกอบหนึ่ง (ไคลเอนต์)" นี่เป็นความสัมพันธ์ทั่วไปที่คลุมเครือและคลุมเครือซึ่งเป็นสาเหตุที่ UML มีแบบแผนสำหรับการพึ่งพาในรูปแบบต่างๆ ในแง่โค้ดสิ่งต่างๆเช่นการตั้งชื่อประเภทพารามิเตอร์และการสร้างอ็อบเจกต์ในตัวแปรชั่วคราวบ่งบอกถึงการพึ่งพา

...


7
ทำไมต้องตอบเมื่อมาร์ตินทำได้ดีกว่านี้มากสำหรับคุณ! +1
Randolpho

5
มันยังไม่ชัดเจนสำหรับฉัน แต่สิ่งหนึ่งที่ฉันเข้าใจคือการพึ่งพานั้นค่อนข้าง 'อ่อนแอกว่าการเชื่อมโยง ดูเหมือนว่าการเชื่อมโยงเป็นส่วนย่อยของการอ้างอิงแม้ว่าในมุมมองของฉันอย่างน้อยการพึ่งพาก็เป็นคำที่แข็งแกร่งกว่าการเชื่อมโยง นั่นอาจเป็นที่มาของความสับสน
Felipe

บทความนั้นกล่าวได้ดี ในความเป็นจริงมันสอดคล้องกับความคิดของฉัน ดังนั้นการดึงบางประเด็นจากตรงนี้: (1)คุณไม่ต้องการแสดงการพึ่งพาทุกครั้งในแผนภาพ UML - มีมากเกินไป คุณต้องเลือกให้มากและแสดงเฉพาะคนที่สำคัญต่อสิ่งที่คุณกำลังสื่อสาร (2)หากมีการเชื่อมโยงระหว่างสองคลาสก็มีการพึ่งพาเช่นกัน การเชื่อมโยงเป็นนัยเช่นเดียวกับลักษณะทั่วไป เห็นได้ชัดว่าการพึ่งพาคือความสัมพันธ์ที่เหนือกว่าของความสัมพันธ์ UML อื่น ๆ
Mahesha999

2
คำอธิบายของคุณห่างไกลจากตัวอย่างในโลกแห่งความเป็นจริงมากเกินไปดังนั้นจึงไม่ได้ให้ความเข้าใจที่ชัดเจนแก่วิศวกรซอฟต์แวร์
softninja

@ softninja: คุณหมายความว่าคุณไม่เข้าใจ ทุกคนดูเหมือนจะยอมรับได้ โอ้และขอบคุณสำหรับการโหวต
Mitch Wheat

77

การเชื่อมโยงมักจะบอกเป็นนัยว่าวัตถุหนึ่งมีวัตถุอื่นเป็นฟิลด์ / คุณสมบัติ / แอตทริบิวต์ (คำศัพท์แตกต่างกัน)

พึ่งพาโดยทั่วไป ( แต่ไม่เสมอไป) หมายความว่าวัตถุยอมรับวัตถุอื่นเป็นพารามิเตอร์วิธี instantiates หรือใช้วัตถุอื่น พึ่งพาเป็นนัยอย่างมากโดยสมาคม


นี่ใกล้เคียงที่สุดกับวิธีที่ฉันใช้ตัดสินปัญหาโดยทั่วไป ถ้าชั้นเรียนอื่นมีส่วนร่วมในทางที่สำคัญต่อสถานะหรือพฤติกรรมของชั้นเรียนของฉันก็จะเป็นการเชื่อมโยง ดังนั้นคลาสกลยุทธ์จะเชื่อมโยงกันแม้ว่าจะไม่มีสถานะภายในของตนเองก็ตาม ถ้าคลาสอื่นแค่ให้บริการกับชั้นเรียนของฉันมันก็เป็นการพึ่งพา
ลูกอ๊อดแย่มาก

50

ในเงื่อนไข OOP:

การเชื่อมโยง -> A has-a C object (เป็นตัวแปรสมาชิก)

การพึ่งพา -> การอ้างอิง B (เป็นพารามิเตอร์วิธีการหรือประเภทการส่งคืน)

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

นอกจากนี้ยังมีคำตอบที่ละเอียดกว่า


1
@Naruto_Uzumaki Aggregation เป็นความสัมพันธ์ทั้งส่วน เพลย์ลิสต์และเพลงเช่น โปรดตรวจสอบคำตอบอื่นของฉันสำหรับความแตกต่างที่กว้างขึ้นระหว่าง Association, Dependency และ Aggregation stackoverflow.com/a/34069760/1998422
Ahmad Abdelghany

จากหนังสือUML DistilledโดยMartin Fowler : "สำหรับคลาสการอ้างอิงมีอยู่ด้วยเหตุผลหลายประการคลาสหนึ่งส่งข้อความไปยังอีกคลาสหนึ่งคลาสหนึ่งมีคลาสอื่นเป็นส่วนหนึ่งของข้อมูลคลาสหนึ่งกล่าวถึงอีกคลาสหนึ่งเป็นพารามิเตอร์ในการดำเนินการ"
Ahmad Abdelghany

24

Dependency เหมือนกับเมื่อคุณกำหนดเมธอดที่ใช้ String (ใน Java, C # เนื่องจาก string เป็นอ็อบเจ็กต์) เป็นพารามิเตอร์ดังนั้นคลาสของคุณจะขึ้นอยู่กับคลาส String

การเชื่อมโยงก็เหมือนกับเมื่อคุณประกาศสตริงเป็นแอตทริบิวต์ในชั้นเรียนของคุณ จากนั้นรหัสของคุณจะเชื่อมโยงกับคลาสสตริง

String name = null //: is a association.

"การเชื่อมโยงก็เหมือนกับเมื่อคุณประกาศสตริงเป็นแอตทริบิวต์ในคลาสของคุณจากนั้นรหัสของคุณจะเชื่อมโยงกับคลาสสตริง" ถ้าเป็นเช่นนั้นความสัมพันธ์และองค์ประกอบต่างกันอย่างไร?
Dean P

16

การพึ่งพา - การเปลี่ยนแปลงในคลาสมีผลต่อการเปลี่ยนแปลงในคลาสที่ขึ้นกับ ตัวอย่าง - วงกลมขึ้นอยู่กับรูปร่าง (อินเทอร์เฟซ) หากคุณเปลี่ยนรูปร่างจะมีผลกับวงกลมด้วย ดังนั้น Circle จึงมีการพึ่งพารูปร่าง

การเชื่อมโยง - หมายถึงมีความสัมพันธ์บางอย่างระหว่าง 2 วัตถุ

(หนึ่งหนึ่งหลายหลายหลาย)

สมาคมมี 2 ประเภท -

  1. องค์ประกอบ
  2. การรวม

    1) องค์ประกอบ - การเชื่อมโยงหรือความสัมพันธ์ระหว่างวัตถุ 2 ชิ้นที่แข็งแกร่งขึ้น คุณกำลังสร้างออบเจ็กต์ของคลาส Bภายในคลาส Aอื่น

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

ถ้าเราลบคลาส A จะไม่มี B (อ็อบเจ็กต์ B ถูกสร้างขึ้นภายใน A เท่านั้น)

อีกตัวอย่างหนึ่ง - ร่างกายและตับตับไม่สามารถอยู่นอกร่างกายได้

2) การรวม - ประเภทของการเชื่อมโยงที่อ่อนแอกว่าระหว่าง 2 วัตถุ

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 */
              }
   }

แม้ว่าคุณจะลบคลาส A แต่ B ก็จะอยู่ภายนอก (B ถูกสร้างขึ้นภายนอกและส่งต่อไปยังคลาส A)

อีกตัวอย่างของสิ่งนี้ - Man & Car มนุษย์มีรถยนต์ แต่มนุษย์และรถยนต์ดำรงอยู่อย่างอิสระ


การพึ่งพาเป็นขอบเขตเฉพาะที่โดยการเชื่อมโยงเป็นขอบเขตของคลาส
dimpiax

10

ที่นี่: "Association vs. Dependency vs. Aggregation vs. Composition"คุณมี vade mecum ที่ยอดเยี่ยมพร้อมด้วยไดอะแกรมคลาส uml และข้อมูลโค้ด ผู้เขียนให้รายการความสัมพันธ์แก่เรา: การเชื่อมโยงการพึ่งพาการรวมตัวการเรียบเรียงในที่เดียว


1
ฉันชอบคำจำกัดความนี้ การเชื่อมโยงคือ: ฉัน (คลาสที่อ้างอิงคลาสอื่น) เพียงแค่มีการอ้างอิงถึงอ็อบเจ็กต์ฉันไม่ได้ใช้มันและสมาชิกของคลาสนั้นไม่น่าสนใจสำหรับฉัน การพึ่งพาคือ: ฉันใช้สมาชิกบางคนดังนั้นหากคลาสที่อ้างอิงมีการเปลี่ยนแปลงอาจส่งผลกระทบต่อฉัน ถ้าเข้าใจถูกกว่านั้นเข้าใจง่าย!
robsch

1
คำถามแรกที่เกิดขึ้นเมื่อฉันอ่านความคิดเห็นของคุณ: ในกรณีของการเชื่อมโยง - ทำไมถึงมีการอ้างอิงถึงวัตถุและไม่ใช้มัน? คุณหมายความว่าการอ้างอิงเป็นเพียงฟิลด์เท่านั้นที่จะถูกส่งกลับหากลูกค้าต้องการทราบข้อมูลอ้างอิงหรือไม่?
H. Rabiee

3

การพึ่งพาเป็นเรื่องทั่วไปมากและการลดความซับซ้อนนั้นเกี่ยวกับการลดการพึ่งพาให้ได้มากที่สุด

การเชื่อมโยงคือการพึ่งพาที่แข็งแกร่ง (คงที่) การรวมและการจัดองค์ประกอบจะยิ่งแข็งแกร่งขึ้น


-1

การเชื่อมโยงคือเมื่อวัตถุหนึ่งมีลิงก์ไปยังอีกวัตถุหนึ่งและไม่ใช้วิธีการของวัตถุเชิงสัมพันธ์ สำหรับทับทิมเช่น

class User
  has_one :profile
end

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

หมายความว่าคุณสามารถรับวัตถุโปรไฟล์จากผู้ใช้ แต่ผู้ใช้ไม่ได้ใช้วิธีการของโปรไฟล์ภายในตัวเอง (ไม่มีการพึ่งพาอินเทอร์เฟซของโปรไฟล์)

การพึ่งพาหมายความว่าผู้ใช้มีการเชื่อมโยงไปยังวัตถุอื่นและเรียกใช้วิธีการของวัตถุนั้นภายในตัวเอง

class User
  has_one :profile

  def personal_info
    profile.info
  end
end

ที่นี่หากวิธีการข้อมูลของ Profile จะถูกเปลี่ยนหรือเปลี่ยนชื่อคลาส Dependent User ของเราก็จำเป็นต้องเปลี่ยนด้วย


คุณช่วยระบุได้ไหมว่าคุณได้ข้อมูลนี้มาจากไหน? ฉันไม่คิดว่ามีกฎในข้อกำหนด UML ที่บอกว่าด้านหนึ่งของการเชื่อมโยงไม่ได้ใช้วิธีการของอีกด้านหนึ่ง โดยทั่วไปแล้วการเชื่อมโยงเป็นความสัมพันธ์ที่แน่นแฟ้นมากกว่าการพึ่งพา
Geert Bellekens

@GeertBellekens ตามที่ฉันเข้าใจ Dependency จำเป็นต้องแสดงให้เห็นว่าการเปลี่ยนแปลงในคลาสซัพพลายเออร์จะต้องมีการเปลี่ยนแปลงในคลาสไคลเอนต์ ในการเขียนโปรแกรมจะเกิดขึ้นเมื่อคุณใช้อินเทอร์เฟซของซัพพลายเออร์เท่านั้น (หรือแสดงเหตุผลอื่นให้ฉันดู) จากมุมมองของคุณไม่มีความแตกต่างในลูกศรนี้ พวกเขาไม่ได้ชี้ไปที่การใช้งานโค้ดและเป็นเพียงแนวความคิด
stopanko

ฉันกลัวว่านั่นเป็นความเข้าใจส่วนตัวของคุณ แต่ไม่ได้อธิบายไว้ในข้อกำหนด UML จาก UML 2.5 § 7.8.4.1: A Dependency คือความสัมพันธ์ที่บ่งบอกว่าองค์ประกอบของโมเดลเดียวหรือชุดขององค์ประกอบของโมเดลต้องการองค์ประกอบของโมเดลอื่น ๆ สำหรับข้อกำหนดหรือการนำไปใช้งาน ซึ่งหมายความว่าความหมายที่สมบูรณ์ของ ClientElement นั้นขึ้นอยู่กับความหมายขององค์ประกอบของซัพพลายเออร์
Geert Bellekens
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.