'การมีเพศสัมพันธ์ต่ำและการรวมกลุ่มสูง' หมายถึงอะไร


151

low in coupling and high in cohesionฉันมีปัญหาในการทำความเข้าใจคำสั่ง ฉัน googled และอ่านมากเกี่ยวกับเรื่องนี้ แต่ก็ยังพบว่ามันยากที่จะเข้าใจ

สิ่งที่ฉันเข้าใจคือHigh cohesionวิธีการที่เราควรมีคลาสที่มีความเชี่ยวชาญในการทำหน้าที่เฉพาะ หวังว่าถูกต้องหรือไม่ เช่นเดียวกับระดับการตรวจสอบบัตรเครดิตซึ่งมีความเชี่ยวชาญในการตรวจสอบบัตรเครดิตเท่านั้น

และยังไม่เข้าใจว่า Coupling ต่ำหมายถึงอะไร


4
สำหรับคำอธิบายโดยละเอียดเพิ่มเติมคุณสามารถเลือกคำตอบจากโพสต์นี้การทำงานร่วมกัน & การเชื่อมต่อ
Infinity

คำตอบนี้จะดีกว่าและกระชับแล้วคำตอบที่ได้รับที่นี่
Lokesh

อันที่จริงนี่เป็นสิ่งที่ซ้ำกัน คำตอบโดยไม่มีที่สิ้นสุดเป็นสิ่งเดียวที่ไม่ซ้ำกันไม่ได้กล่าวถึงที่นี่
cellepo

คำตอบ:


232

สิ่งที่ฉันเชื่อคือ:

การทำงานร่วมกันหมายถึงระดับที่องค์ประกอบของโมดูล / คลาสอยู่ด้วยกันก็จะแนะนำว่ารหัสที่เกี่ยวข้องควรจะอยู่ใกล้กันดังนั้นเราควรมุ่งมั่นในการทำงานร่วมกันสูงและผูกรหัสที่เกี่ยวข้องทั้งหมดเข้าด้วยกันให้ใกล้ที่สุด มันเกี่ยวข้องกับองค์ประกอบภายในโมดูล / คลาส

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

ในการมองเห็นภาพรวมทั้งหมดจะเป็นประโยชน์:

ป้อนคำอธิบายรูปภาพที่นี่

ภาพหน้าจอถูกนำมาจากCoursera


20
อาจารย์ของเรากล่าวว่า "การทำงานร่วมกันสูงเกี่ยวกับการทำให้แน่ใจว่าโมดูลไม่ได้ทำสิ่งต่าง ๆ มันตั้งใจจะทำเพียงสิ่งเดียวเท่านั้น"
Lokesh

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

6
@Lokesh ฉันคิดว่าความคิดเห็นของคุณยุ่งเหยิง อาจารย์ของคุณกำลังสับสนการทำงานร่วมกันสูงกับ "หลักการความรับผิดชอบเดี่ยว" การติดต่อกันสูงหมายถึงการเก็บสิ่งที่คล้ายกันและเกี่ยวข้องกันไว้ด้วยกัน คุณสามารถทำงานร่วมกันสูงในวัตถุหรือบริการที่ประกอบด้วยฟังก์ชั่นมากมาย
Max Hodges

17
แผนภาพนั้นไม่มีความหมายอะไรเลย
เลียม

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

41

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

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

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

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

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

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


26

ในการออกแบบซอฟต์แวร์ที่ทำงานร่วมกันสูงหมายความว่าคลาสควรทำสิ่งหนึ่งและสิ่งหนึ่งที่ดีมาก การทำงานร่วมกันในระดับสูงที่เกี่ยวข้องอย่างใกล้ชิดกับหลักการความรับผิดชอบเดี่ยว

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

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


คุณพลาดการฉีดพึ่งพา มันมีความสัมพันธ์อย่างใกล้ชิดกับการมีเพศสัมพันธ์ต่ำเพื่อให้แน่ใจว่าชั้นมีการพึ่งพาน้อยที่สุด / ไม่มี
BugHunterUK

16

คำตอบที่สั้นและชัดเจน

  • การติดต่อกันสูง : องค์ประกอบภายในหนึ่งคลาส / โมดูลควรทำงานร่วมกันและทำสิ่งใดสิ่งหนึ่งโดยเฉพาะ
  • การมีเพศสัมพันธ์แบบหลวม : ระหว่างคลาส / โมดูลที่แตกต่างกันควรมีการพึ่งพาน้อยที่สุด

9

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

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

หวังว่าจะช่วย


5

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


1
นั่นไม่ใช่สิ่งเดียวกันกับ High Cohesion ใช่ไหม
user1315906

4

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


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

@ MaxHodges สิ่งนั้น (การติดต่อกันที่ต่ำและการมีเพศสัมพันธ์สูง) จะถูกคิดค่าเสื่อมราคาและควรลดให้เหลือน้อยที่สุดเท่าที่จะเป็นไปได้ ในบางกรณีดังที่คุณกล่าวถึง สิ่งนี้ไม่สามารถลบได้อย่างสมบูรณ์
M. Habib

2

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

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


2

การติดต่อกัน - ทุกสิ่งมีความสัมพันธ์กันอย่างใกล้ชิด
ข้อต่อ - วิธีเชื่อมต่อทุกอย่างเข้าด้วยกัน

ลองมาตัวอย่าง - เราต้องการออกแบบรถขับเอง

(1) เราต้องการให้มอเตอร์ทำงานได้อย่างถูกต้อง

(2) เราต้องการรถที่จะขับด้วยตัวเอง

คลาสและฟังก์ชั่นทั้งหมดใน (1) สตาร์ทมอเตอร์และทำให้มันทำงานได้ดีด้วยกัน แต่ไม่ได้ช่วยให้รถบังคับเลี้ยว ดังนั้นเราจึงวางคลาสเหล่านั้นไว้ด้านหลังตัวควบคุมเครื่องยนต์

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

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

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


1

การมีเพศสัมพันธ์ต่ำและการยึดเกาะสูงเป็นปรากฏการณ์ที่แนะนำ

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


1

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

การรวมกันสูงสามารถทำได้โดยการแยกรหัสแหล่งข้อมูลจากรหัสการผลิตข้อมูล (และในความเป็นจริงการแยกที่เก็บดิสก์จากการจัดเก็บฐานข้อมูล)

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


1

นี่คือคำตอบจากมุมนามธรรมเชิงทฤษฎีที่เป็นนามธรรม:

มาทำให้ปัญหาง่ายขึ้นโดยดูที่กราฟการพึ่งพา (กำกับ) ระหว่างวัตถุที่เป็นสภาวะ

คำตอบที่ง่ายมากสามารถแสดงให้เห็นได้โดยการพิจารณากรณี จำกัดสอง กรณีของกราฟการพึ่งพา:

กรณี จำกัด ที่ 1 : กราฟกลุ่มกราฟคลัสเตอร์

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

การพึ่งพากันระหว่างกลุ่มคือสูงสุด (เชื่อมต่ออย่างเต็มที่) และการพึ่งพาระหว่างกลุ่มน้อยที่สุด (ศูนย์)

นี่คือภาพนามธรรมของคำตอบในหนึ่งในกรณี จำกัด

กรณี จำกัด ที่ 2เป็นกราฟที่เชื่อมต่ออย่างสมบูรณ์ซึ่งทุกอย่างขึ้นอยู่กับทุกสิ่ง

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

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

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

การสลายตัวของระบบดังกล่าวลงในลำดับชั้นช่วยให้เอาชนะความซับซ้อนแบบเอ็กซ์โพเนนเชียล (กล่าวว่าแต่ละคลัสเตอร์มี 10 องค์ประกอบ) จากนั้นที่เลเยอร์ 6 มันมีวัตถุ 1 ล้านชิ้นอยู่แล้ว:

10 คลัสเตอร์สร้าง 1 supercluster 10 superclusters สร้าง 1 hypercluster และอื่น ๆ ... โดยไม่มีแนวคิดเรื่องการเชื่อมโยงที่แน่นหนาการมีเพศสัมพันธ์แบบหลวม ๆ เช่นสถาปัตยกรรมลำดับชั้นจะเป็นไปไม่ได้

ดังนั้นนี่อาจเป็นความสำคัญที่แท้จริงของเรื่องราวและไม่ใช่แค่การรวมกันที่มีค่าต่ำมากในสองชั้นเท่านั้น ความสำคัญที่แท้จริงจะชัดเจนเมื่อพิจารณา abstractions ระดับที่สูงขึ้นและการมีปฏิสัมพันธ์ของพวกเขา


0

ฉันคิดว่าคุณมีคำจำกัดความสีแดงจำนวนมาก แต่ในกรณีที่คุณยังมีข้อสงสัยหรือในกรณีที่คุณยังใหม่กับการเขียนโปรแกรมและต้องการที่จะลึกลงไปในนี้แล้วฉันจะแนะนำให้คุณดูวิดีโอนี้ https://youtu.be/HpJTGW9AwX0 เป็นเพียงการอ้างอิงเพื่อรับข้อมูลเพิ่มเติมเกี่ยวกับ polymorphism ... หวังว่าคุณจะเข้าใจสิ่งนี้ดีขึ้น


0

การมีเพศสัมพันธ์ต่ำ: - จะทำให้มันง่ายมาก หากคุณเปลี่ยนโมดูลจะมีผลกับโมดูลอื่นอย่างไร

ตัวอย่าง: - หาก Service API ของคุณถูกเปิดเผยเป็น JAR การเปลี่ยนแปลงใด ๆ กับลายเซ็นเมธอดจะทำให้การเรียก API (การเชื่อมต่อสูง / แน่น)

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

นอกหลักสูตรหากมีการเปลี่ยนแปลงในรูปแบบข้อความลูกค้าโทรจะต้องทำการเปลี่ยนแปลงบางอย่าง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.