เราจะรู้ได้อย่างไรว่าองค์ประกอบที่สนับสนุนการวางนัยทั่วไปเป็นตัวเลือกที่ถูกต้องเสมอ


9

ไม่ว่าวัตถุจะมีอยู่จริงหรือไม่ก็ตามเราสามารถเลือกที่จะสร้างแบบจำลองด้วยวิธีที่แตกต่างกัน เราสามารถใช้การวางนัยทั่วไปหรือการจัดองค์ประกอบตามอำเภอใจในหลายกรณี อย่างไรก็ตามหลักการ GoF ของ "การจัดองค์ประกอบที่โปรดปรานเหนือการวางนัยทั่วไป [sic]" แนะนำให้เราใช้การจัดวาง ดังนั้นเมื่อเราสร้างแบบจำลองตัวอย่างหนึ่งบรรทัดจากนั้นเราสร้างคลาสที่มีสมาชิกสองคน PointA และ PointB ของประเภท Point (องค์ประกอบ) แทนการขยายจุด (ลักษณะทั่วไป) นี่เป็นเพียงตัวอย่างที่เรียบง่ายของวิธีที่เราสามารถเลือกการจัดองค์ประกอบหรือการสืบทอดให้กับโมเดลโดยพลการแม้ว่าวัตถุนั้นจะมีความซับซ้อนมากขึ้น

เราจะรู้ได้อย่างไรว่านี่เป็นตัวเลือกที่ถูกต้อง? อย่างน้อยก็สำคัญเพราะอาจมีการปรับโครงสร้างอีกหลายครั้งหากทำผิด


9
ตัวอย่างของคุณใช้งานไม่ได้เพราะคุณไม่สามารถพูดได้ว่าเส้นเป็นจุดหนึ่งและดังนั้นจึงล้มเหลวในหลักการการทดแทน Liskovและการสืบทอดไม่เหมาะสม
Dean Harding

@Dean: ตามที่คุณอาจทราบตัวอย่างไม่ได้เป็นศูนย์กลาง สำหรับเร็กคอร์ดบรรทัดสามารถแสดงเป็นสมการที่กำหนดผ่านจุดสองจุด
CarneyCode


1
@Songo: ดูเหมือนว่าคุณพลาดประเด็นไปแล้ว
CarneyCode

ไม่ได้ขยายความเชี่ยวชาญแทนที่จะเป็นลักษณะทั่วไปใช่ไหม
Tulains Córdova

คำตอบ:


17

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

เราจะรู้สิ่งนี้ได้อย่างไร จากประสบการณ์และประสบการณ์ของผู้อื่น

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

แต่หลักฐานพอสมควรของฉันไม่ควรเพียงพอ เพียงมองไปรอบ ๆ อินเทอร์เน็ตและผู้คนจำนวนมากมีประสบการณ์แบบเดียวกัน


ฉันชอบมัน ขึ้นโหวต
CarneyCode

+1 สำหรับ "ฉันไม่เคยเห็นสถานการณ์ที่ต้องใช้โครงสร้างการจัดองค์ประกอบใหม่เพื่อรับมรดก"
Kazark

7

หากคุณต้องการกฎของหัวแม่มือที่แข็งแกร่งกว่า "องค์ประกอบที่โปรดปรานเหนือมรดก" ฉันอาจแนะนำสิ่งนี้:

จากสองวิธีในการสร้างอ็อบเจกต์ - Inheritance and Composition - คุณควรใช้การสืบทอดเฉพาะเมื่อคุณต้องการให้อ็อพเจ็กของคุณเป็น polymorphic (สามารถใช้แทนกันได้) สำหรับคลาสพื้นฐานที่คุณเชี่ยวชาญ

อย่างไรก็ตามเช่นเดียวกับกฎง่ายๆเมื่อคุณเข้าใจกฎ - แล้วคุณมีอิสระที่จะทำลายกฎ :)


0

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

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


มันเป็นธรรมชาติมากกว่านี้ไหม เส้นไม่เกินสองจุดเกินกว่าจะขยายเป็นจุดเดียว?
CarneyCode

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

0

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

"องค์ประกอบอาจใช้การวางนัยทั่วไปเช่นกัน" ข้อความนี้สมเหตุสมผลสำหรับเราหรือไม่? ถ้าไม่เช่นนั้นเรายังไม่พร้อมที่จะเข้าใจกฎ 'โปรดปราน'

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

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

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


-4

วันนี้ฉันเขียนประมาณ 300 LoC และฉันไม่สามารถจำหลักการใด ๆ ที่ฉันสามารถละเมิดและไม่ได้ละเมิด การ Refactoring จะช่วยจิตวิญญาณของฉันฉันหวังว่า

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

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