Decoupling คืออะไรและสามารถใช้กับการพัฒนาด้านใดได้บ้าง [ปิด]


21

ฉันเพิ่งสังเกตเห็น decoupling เป็นหัวข้อในคำถามและต้องการทราบว่ามันคืออะไรและสามารถนำไปใช้ได้ที่ไหน

โดย "สามารถใช้งานได้ที่ไหน" ฉันหมายถึง:

มันเกี่ยวข้องเฉพาะกับภาษาที่คอมไพล์เช่น C และ Java หรือไม่

ฉันควรรู้เกี่ยวกับ / ศึกษามันในฐานะนักพัฒนาเว็บไซต์หรือไม่?


มันจะช่วยถ้าคุณทำวิจัยเล็กน้อยและถามคำถามตามส่วนที่ไม่ชัดเจนของคำจำกัดความ
JeffO

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

คุณมีปัญหาอะไรเป็นพิเศษ? ขณะที่มันยืนตอนนี้คำถามของคุณมากกว้างเกินไป ในรูปแบบปัจจุบัน tis คำตอบคือหลักข้อความทั้งหมดของโครงสร้างการออกแบบ: ความรู้พื้นฐานของความมีระเบียบวินัยของโปรแกรมคอมพิวเตอร์และการออกแบบระบบโดยเอ็ดเวิร์ด Yourdon และลาร์รี่คอนสแตนติ
Jörg W Mittag

ฉันคิดว่าคำตอบที่นี่ทำงานได้อย่างสมบูรณ์แบบในการอธิบายแนวคิด มันเหมือนกับถามว่า "คำจำกัดความของคำนี้เกี่ยวกับการเขียนโปรแกรม" คืออะไรแล้วกว้างเกินไป? @ GlenH7

1
@ jt0dd ฉันต้องยอมรับ เพียงเพราะคุณสามารถอธิบายบางสิ่งบางอย่างกับหนังสือได้ไม่ได้หมายความว่าไม่มีคุณค่าในคำตอบที่กระชับยิ่งขึ้น ด้วยวรรณกรรมการเขียนโปรแกรมผู้คนมักล้นคุณด้วยรายละเอียดก่อนที่จะให้ภาพรวมในระดับที่ดีขึ้น "OOP คืออะไร" จะกว้างเกินไป แต่นี่เป็นหัวข้อที่เฉพาะเจาะจงอย่างสมเหตุสมผล IMO
Erik Reppen

คำตอบ:


57

'Coupling' เป็นคำที่อธิบายถึงความสัมพันธ์ระหว่างสองเอนทิตี้ในระบบซอฟต์แวร์

เมื่อคลาสใช้คลาสอื่นหรือสื่อสารกับมันคลาสนั้นจะพูดว่า 'พึ่งพา' กับคลาสอื่นนั้นดังนั้นคลาสเหล่านี้จึงเป็น 'คู่' อย่างน้อยหนึ่งคนก็รู้เกี่ยวกับอีกคนหนึ่ง

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

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


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

เมื่อ ClassA ขึ้นอยู่กับ ClassB อย่างหนักโอกาสของ ClassA ที่จะได้รับผลกระทบเมื่อ ClassB นั้นเปลี่ยนไปสูง นี่คือการแต่งงานที่แข็งแรง

อย่างไรก็ตามหาก ClassA ขึ้นอยู่กับ ClassB เบากว่าโอกาสที่ ClassA จะได้รับผลกระทบในทางใดทางหนึ่งโดยการเปลี่ยนรหัสของ ClassB นั้นต่ำ นี่คือคลัปหลวมหรือความสัมพันธ์ 'แยกคู่'

การมีเพศสัมพันธ์ที่หลวมนั้นดีเพราะเราไม่ต้องการให้ส่วนประกอบของระบบของเราพึ่งพากันมาก เราต้องการรักษาระบบของเราแบบแยกส่วนที่เราสามารถเปลี่ยนส่วนหนึ่งได้อย่างปลอดภัยโดยไม่กระทบต่อส่วนอื่น ๆ

เมื่อทั้งสองส่วนเข้าด้วยกันอย่างหลวม ๆ พวกเขาจะเป็นอิสระจากกันและกันและมีโอกาสน้อยที่จะแตกหักเมื่อการเปลี่ยนแปลงอื่น ๆ

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

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

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

ตัวอย่างเช่นลองจินตนาการว่าในฐานะคนขับคุณจะต้องตั้งสมมติฐานว่าเครื่องยนต์ของรถคุณทำงานอย่างไร

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

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


เทคนิคสำคัญในการมีเพศสัมพันธ์แบบหลวมคือ Encapsulation แนวคิดคือคลาสจะซ่อนรายละเอียดภายในจากคลาสอื่นและเสนออินเทอร์เฟซที่กำหนดไว้อย่างเข้มงวดเพื่อให้คลาสอื่น ๆ สามารถสื่อสารกับคลาสได้

ดังนั้นสำหรับตัวอย่างเช่นถ้าคุณถูกกำหนดรถยนต์ชั้นมันอินเตอร์เฟซ (วิธีการสาธารณะ) อาจจะเป็นdrive(), stop(), steerLeft(), ,steerRight() getSpeed()นี่เป็นวิธีการที่วัตถุอื่นสามารถเรียกใช้บนวัตถุรถยนต์ได้

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

ช่วงเวลาที่คลาส A รู้มากเกินไปเกี่ยวกับคลาส B: เรามีความสัมพันธ์ที่แน่นแฟ้นมากขึ้นโดยคลาส A นั้นขึ้นอยู่กับคลาส B มากเกินไปและการเปลี่ยนแปลงในคลาส B น่าจะส่งผลกระทบต่อคลาส A ทำให้ระบบยากที่จะขยายและบำรุงรักษา

ความสัมพันธ์ระหว่างสองหน่วยงานที่พวกเขารู้เพียงเล็กน้อยเกี่ยวกับกันและกัน (เฉพาะสิ่งที่จำเป็น) - เป็นความสัมพันธ์แบบคู่หรือคับ


3

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

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

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

นี่อาจเป็นประเภทที่พบได้บ่อยที่สุดในป่า:

//Inside a class meant to display info for a particular Facebook user.
void DisplayFriends(FacebookUser user, FacebookClient client)
{
     Friend[] = (Friend[])client.GetConnection().ExecuteCommandForResult("getFriends:" + user.Name);
     ...
}

ที่นี่ DisplayFriends ดำเนินงานด้วยตนเองโดยไม่จำเป็นด้วยการเชื่อมต่อที่อยู่เบื้องหลังไคลเอนต์ Facebook เพื่อรับสิ่งที่ต้องการ DisplayFriendsคลาส 's เป็นคู่ทั้งสองและFacebookClient Connectionหาก FacebookClient เปลี่ยนประเภทการเชื่อมต่อที่ใช้อยู่ทันทีแอปจะไม่สามารถรับเพื่อน Facebook ได้อีก เราสามารถลบการเชื่อมต่อระหว่างชั้นเรียนของ DisplayFriends และการเชื่อมต่อโดยขอให้ FacebookClient ให้สิ่งที่เราต้องการสำหรับเรา

//Inside a class meant to display info for a particular Facebook user.
void DisplayFriends(FacebookUser user, FacebookClient client)
{
     Friend[] = client.GetFriends(user);
     ...
}

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

การแยกประเภทนี้สามารถทำได้อย่างง่ายดายโดยทำตามกฎของ Demeter สำหรับฟังก์ชั่นซึ่งกล่าวว่า (อ้างถึง Wikipedia):

กฎของ Demeter สำหรับฟังก์ชั่นกำหนดให้เมธอด m ของวัตถุ O อาจเรียกใช้เมธอดของวัตถุประเภทต่อไปนี้เท่านั้น:

  • โอตัวเอง
  • พารามิเตอร์ของ m
  • วัตถุใด ๆ ที่สร้าง / อินสแตนซ์ภายใน m
  • วัตถุองค์ประกอบโดยตรงของ O
  • ตัวแปรโกลบอลซึ่งสามารถเข้าถึงได้โดย O ในขอบเขต m

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

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

ในที่สุดเพื่อตอบบิตสุดท้ายของคุณ:

ฉันควรรู้เกี่ยวกับ / ศึกษามันในฐานะนักพัฒนาเว็บไซต์หรือไม่?

ใช่. ตัวอย่างเช่นหนึ่งในรูปแบบการออกแบบที่เป็นที่นิยมที่สุดสำหรับการพัฒนาเว็บ (MVC) คือทั้งหมดที่เกี่ยวกับการแยก


1

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

ฉันควรรู้เกี่ยวกับ / ศึกษามันในฐานะนักพัฒนาเว็บไซต์หรือไม่?

คำตอบคือเน้นย้ำใช่ ไม่สำคัญว่าคุณเป็นนักพัฒนาซอฟต์แวร์ประเภทใด คุณอาจเป็นนักพัฒนาเว็บหรือผู้พัฒนาระบบฝังตัว

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

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

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


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