มีคำศัพท์สำหรับ OOP ที่ซับซ้อนเกินไปหรือไม่


18

หรือสองปีที่ผ่านมาผมเห็นบทความที่ดีใน OOP (Java) ซึ่งแสดงให้เห็นความก้าวหน้าของคนตัดไม้คอนกรีตที่เรียบง่ายของสองหรือสามบรรทัดของรหัสและทฤษฎีกระบวนการคิดที่มากเกินไปโดยนักพัฒนาที่ไม่มีประสบการณ์ที่พื้นกล่าวว่าโอ้ฉันควร เพิ่มในกรณีที่เราต้องการ! ในตอนท้ายของบทความคนตัดไม้ธรรมดานี้เป็นระเบียบขยะขนาดใหญ่ที่นักพัฒนาดั้งเดิมแทบจะไม่เข้าใจตัวเอง ...

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

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


25
ใช่เรียกว่า OOP
gardenhead

คำตอบ:


28

คำที่พบบ่อยที่สุดผมได้ยินมาเพื่ออธิบายการออกแบบดังกล่าวเป็นoverengineering อย่างไรก็ตามความหมายดั้งเดิมของคำนั้นไม่เกี่ยวข้องกับการพัฒนาซอฟต์แวร์และนอกเหนือจากการพัฒนาซอฟต์แวร์อาจไม่ได้เลวร้ายนัก

ในระดับทั่วไปยิ่งขึ้น Joel Spolsky ให้นักออกแบบที่มีความซับซ้อนทางด้านการออกแบบชื่อ " นักบินอวกาศสถาปัตยกรรม "

อย่างไรก็ตามโดยเฉพาะอย่างยิ่งสำหรับการสัมภาษณ์ฉันคิดว่ามันสำคัญกว่าที่จะรู้ว่าสิ่งที่ตรงข้ามเรียกว่าวางสิ่งต่าง ๆ ลงในการออกแบบที่จำเป็นจริง ๆ และลืมเกี่ยวกับวิธีการ "ในกรณี" ที่ไม่แข็งแรง - นี่เรียกว่าหลักการYAGNI


ขอบคุณ ฉันเป็นผู้สนับสนุนใหญ่ของ YAGNI ไม่แน่ใจว่ามีสิ่งที่ตรงกันข้าม
jleach

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

7
@ เบนฉันจะเน้นว่ามันไม่ได้หมายความว่าจะไม่สนใจสิ่งต่าง ๆ / การเปลี่ยนแปลงที่คุณรู้แน่นอนว่าจะเกิดขึ้นในคุณสมบัติใกล้ ... รู้ว่าซอฟต์แวร์จะขยายหลังจากสามารถแนะนำคุณในการเขียนรหัสที่จะมากขึ้น ปรับเปลี่ยนได้ง่ายตามแนวแกนการเปลี่ยนแปลงเหล่านั้น
Bakuriu

ฉันใช้คำว่า "วิศวกรรมที่ไม่ดี" เมื่อเทียบกับ "วิศวกรรมที่เกิน" ฉันได้ทำงานกับคนที่รักการเพิ่มคุณสมบัติทุกประเภทและส่วนขยาย "ในกรณี" ที่ไม่มีกรณีการใช้งานที่ชัดเจน หากคุณไม่เข้าใจปัญหาที่คุณกำลังพยายามแก้ไขนั่นเป็นเพียงวิศวกรรมที่ไม่ดี
Josh Johnson

4

ใช่การ overengineering เป็นคำที่ง่ายที่สุดในการอธิบายเรื่องนี้ ฉันได้เห็นการออกแบบที่ซับซ้อนเกินความจำเป็นเกินกว่าที่ฉันจำได้ในช่วงหลายปีที่ผ่านมา เมื่อหลายปีก่อนเมื่อเข้าเรียนหลักสูตร Microsoft GWBasic ผู้สอนใช้วิธี KISS ซ้ำ ๆ กัน (Keep it Simple Stupid) นี่คือความจริงทุกวันนี้เหมือนเดิม

ดังนั้นฉันจึงจำ KISS และออกแบบด้วยหลักการ SOLIDเสมอ แต่ด้วยการที่กล่าวว่ามันยังคงเป็นไปได้ที่จะ overengineer การออกแบบด้วยหลักการ SOLID พิจารณาอย่างเต็มที่ คุณต้องสร้างสมดุลระหว่างสามัญสำนึกวิธีการปฏิบัติที่มีความปรารถนาที่จะบริสุทธิ์และเป็นไปตามแนวทาง OOP ที่เป็นที่ยอมรับโดยทั่วไป ถ้าให้เวลามากพอและถ้าคุณรักที่จะสร้างวิธีแก้ปัญหาที่ซับซ้อนคุณสามารถลงเอยด้วยการออกแบบเครื่องยนต์สำหรับสเก็ตบอร์ดเพราะคุณคิดว่าในที่สุดมันจะกลายเป็นรถยนต์ โชคดีที่ฉันได้รับการลงโทษทางวินัยมากพอที่จะไม่ทำสิ่งนี้ในช่วงหลายปีที่ผ่านมา แต่ฉันได้เห็นมันหลายครั้ง

ดังนั้นเพื่อสรุปเพื่อป้องกันการ overcomplication ของรหัส:

1) KISS (ทำให้โง่ง่าย ๆ )

2) ปฏิบัติตามหลักการที่เป็นของแข็งโดยคำนึงถึงการปฏิบัติจริง

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

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

5) รหัสราวกับว่าคุณเป็นคนที่จะรักษามัน


-3

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

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


4
ฉันขอโทษ แต่ฉันก็แค่สงสัยว่าจริงๆมีคำสำหรับมัน ฉันไม่ได้มองหาคำแนะนำเกี่ยวกับวิธีการสัมภาษณ์ (หรือให้คำถามของฉันถูกรับรู้ไม่ว่าด้วยวิธีใดในการสัมภาษณ์) ขอบคุณสำหรับความกังวลของคุณ ...
jleach

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