การมีเพศสัมพันธ์ต่ำและการเกาะติดกันสูงไม่ได้ขึ้นอยู่กับกันและกันใช่หรือไม่?

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

ใครสามารถอธิบายเรื่องนี้ได้บ้าง? บางทีอาจมีตัวอย่าง? ขอบคุณ!


person qwerty qwerty    schedule 21.04.2015    source แหล่งที่มา


คำตอบ (7)


โดยย่อ:

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

วิธีหนึ่งในการดูการทำงานร่วมกันในแง่ของ OO คือถ้าวิธีการในคลาสใช้คุณลักษณะส่วนตัวใด ๆ

ขณะนี้การอภิปรายใหญ่ไปกว่านี้ แต่ High Cohesion (หรือประเภทที่ดีที่สุดของการทำงานร่วมกัน - การทำงานร่วมกันเชิงหน้าที่) คือเมื่อส่วนของโมดูลถูกจัดกลุ่มเนื่องจากทั้งหมดมีส่วนช่วยในงานเดียวที่กำหนดไว้อย่างดีของโมดูล

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

การมีเพศสัมพันธ์แบบหลวมเป็นวิธีการเชื่อมต่อส่วนประกอบในระบบหรือเครือข่ายเพื่อให้ส่วนประกอบเหล่านั้นต้องพึ่งพาซึ่งกันและกันในขอบเขตที่น้อยที่สุดที่เป็นไปได้ในทางปฏิบัติ...

ในระยะยาว:

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

person TheBoyan    schedule 23.04.2015

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

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

  1. เบสบอล ไม้คิวพูล
  2. ลูกลาครอส ไม้เทนนิส
  3. ลูกบิลเลียด ไม้คริกเก็ต
  4. ลูกเทนนิส ไม้เบสบอล
  5. ลูกโครเก้, ไม้ลาครอส
  6. ลูกคริกเก็ต, ไม้โครเก้

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

การจัดวางวัตถุให้ชัดเจนเป็นถุงของ

  1. เบสบอล, ไม้เบสบอล
  2. ลูกเทนนิส, ไม้เทนนิส
  3. ลูกคริกเก็ต, ไม้คริกเก็ต
  4. ลูกโครเก้, ไม้โครเก้
  5. ลูกบอลลาครอส ไม้ลาครอส
  6. ลูกบิลเลียด ไม้คิวพูล

มีการประกบกันที่ต่ำกว่า (การประกบกันเป็นศูนย์) เนื่องจากไม่มีสิ่งใดในถุงที่เกี่ยวข้องกับสิ่งของในถุงอื่นๆ มีความเหนียวแน่นสูงเนื่องจากสิ่งของภายในถุงมีความสัมพันธ์กัน

person I-Lin Kuo    schedule 21.04.2015

การมีเพศสัมพันธ์และการทำงานร่วมกันเป็นแนวคิดที่ใกล้เคียงกัน แต่ไม่เหมือนกัน การออกแบบของคุณควรมี:

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

  2. การทำงานร่วมกันสูง: หมายความว่าชั้นเรียนของคุณไม่ควรรวมงานที่ไม่เกี่ยวข้องไว้มากมาย เมื่อคุณเพิ่มการทำงานร่วมกัน ความเข้าใจโค้ดจะง่ายขึ้นเนื่องจากชั้นเรียนกำลังทำงานบางอย่างที่สอดคล้องกัน นอกจากนี้ยังเพิ่มการนำกลับมาใช้ใหม่ได้อีกด้วย รูปแบบการออกแบบบางอย่าง เช่น Visitor มีเป้าหมายนี้

ในการดำเนินการต่อ ฉันให้ตัวอย่าง 3 คลาสที่อาจสมเหตุสมผลมากกว่า:

#include <Document>
#include <Printer>
#include <SpellCheker>
class HighCoupling{
    // This class need other class to be usable
    Document *doc;
    Printer *activePrinter;
    CretaeDocument() { /*...*/ }
    SaveDocument() { /*...*/ }
    PrintDocument() { /*...*/ }    
    CheckSpell() { /*...*/ }    
};

#include <Document>
class LowCouplingHighCohesion {
    // This class don't need other classes
    // This class is a specialist on some task
    CretaeDocument() { /*...*/ }
    SaveDocument(Format *) { /*...*/ }
    LoadDocument() { /*...*/ }
};

#include <Document>
class LowCouplingLowCohesion {
    // This class don't need other classes
    // This class do many unrelated things
    CretaeDocument() { /*...*/ }
    SaveDocument() { /*...*/ }
    OpenDocument() { /*...*/ }
    Undo() { /*...*/ }
    ChangeDocumentBackground()  { /*...*/ }
    SearchInDocument() { /*...*/ }
};
person Emadpres    schedule 21.04.2015

การเชื่อมต่อและการทำงานร่วมกันเป็น มาตรการที่แตกต่างกันสองประการ ของโมดูลซอฟต์แวร์

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

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

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


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

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

person BJ Myers    schedule 21.04.2015

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

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

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

person Community    schedule 21.04.2015
comment
การทำงานร่วมกันไม่ได้เกี่ยวกับการทำงานร่วมกันหลายคลาส แต่เป็นการวัดความคล้ายคลึงกันของวิธีการภายในคลาสเดียว - person BJ Myers; 21.04.2015
comment
ใช่ คุณพูดถูก ฉันมักจะผสมสิ่งเหล่านี้เข้าด้วยกัน ขอบคุณสำหรับความคิดเห็น ฉันจะพยายามแก้ไขในอีกสักครู่ - person ; 21.04.2015

ความแตกต่างอยู่ที่ความหมาย

  1. การเชื่อมโยง หมายถึงสิ่งที่มีความหมายเชิงลบ ดังนั้นตามกฎของ SOLID คุณต้องพยายามสร้างแอปพลิเคชันของคุณในรูปแบบดังกล่าว ว่ามัน เชื่อมต่อกันอย่างหลวมๆ ตัวอย่างเช่น รูปแบบ Gof (เช่น Abstract Factory) และ คอนเทนเนอร์ DI (เช่น MS Unity หรือ NInject ในโลก .NET) สามารถช่วยให้คุณบรรลุเป้าหมายนี้ได้ โค้ด Loosely Coupled หมายความว่าหากคุณต้องการแทรกคลาสใหม่ลงในแอปพลิเคชันของคุณ (หรือพูดในลักษณะนี้ - หากคุณต้องการเปลี่ยนคลาสหนึ่งเป็นอีกคลาสหนึ่ง) คุณก็สามารถทำได้อย่างง่ายดายโดยไม่ต้องใช้ความพยายามมากนัก

  2. ความสามัคคี หมายถึงสิ่งที่มีความหมายเชิงบวก ดังนั้น ดังที่คุณคงเดาได้ คุณต้องพยายามสร้างแอปพลิเคชันของคุณในลักษณะที่จะใช้งาน การทำงานร่วมกันสูง มันหมายความว่าอะไร? มันหมายถึงการโต้ตอบระหว่าง โมดูล ที่แตกต่างกันของแอปพลิเคชันของคุณ ตัวอย่างเช่น สมมติว่าแอปของคุณมีสองโมดูล:

    • Export module - exports some data into an xml file
    • โมดูลนำเข้า - นำเข้าข้อมูลบางส่วนจากไฟล์ xml

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

person Witcher    schedule 21.04.2015
comment
การทำงานร่วมกันไม่ได้เกี่ยวกับวิธีการที่โมดูลทั้งสองมีปฏิสัมพันธ์กัน แต่เป็นเรื่องเกี่ยวกับการจัดกลุ่มพฤติกรรมเชิงตรรกะให้เป็นโมดูลเดียว - person BJ Myers; 21.04.2015

พวกมันจะเหมือนกันแบบผกผัน Low Coupling = High Cohesion

person Ronald    schedule 21.04.2015
comment
ทำไมคุณพูดอย่างนี้? ตาม GRASP ทั้งสองนี้สามารถมีคุณสมบัติสำหรับการออกแบบ OO แยกกัน - person Emadpres; 21.04.2015
comment
สิ่งนี้ไม่ถูกต้อง การมีเพศสัมพันธ์และการทำงานร่วมกันเป็น การวัดที่แตกต่างกัน ด้วยความสัมพันธ์ทางชีวภาพ - การทำงานร่วมกันสูงทำให้ง่ายต่อการใช้งานการมีเพศสัมพันธ์แบบหลวม ๆ - person BJ Myers; 21.04.2015