มันจะโอเคที่จะมีกลิ่นรหัสหรือไม่ถ้ายอมรับวิธีแก้ปัญหาที่ง่ายกว่าสำหรับปัญหาอื่น? [ปิด]


31

กลุ่มเพื่อนและฉันทำงานในโครงการเมื่อไม่นานมานี้และเราต้องการคิดค้นวิธี OOP ที่ดีเพื่อแสดงสถานการณ์ที่เฉพาะเจาะจงกับผลิตภัณฑ์ของเรา โดยพื้นฐานแล้วเรากำลังทำงานกับเกมกระสุนนรกสไตล์ Touhou และเราต้องการสร้างระบบที่เราสามารถแสดงพฤติกรรมที่เป็นไปได้ของกระสุนได้อย่างง่ายดายที่เราสามารถฝันได้

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

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

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

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


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

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

8
ดีกว่าที่จะได้กลิ่นและรู้ว่าคุณมีกลิ่นเหม็นจากนั้นจะได้กลิ่นที่คนอื่นสังเกตเห็น :)
ซ้ำ

1
ดูเหมือนว่าคุณต้องการคลาสอะแดปเตอร์ที่ให้ส่วนต่อประสานที่ไม่ใช้รหัส OO ของคุณเพื่อให้คุณสามารถรักษาส่วนที่เหลือของรหัสของคุณให้สะอาด
nikie

1
ดูเหมือนว่าคุณจะสร้างระบบที่ยอดเยี่ยมและตัดสินใจที่จะระเบิดให้เป็นนรกตอนนี้มันไม่ทำงานตามที่คาดไว้ในฟีเจอร์เดียว นั่นคือสิ่งที่คุณต้องการจริง ๆ ? ภูมิใจในงานของคุณ!
เสา

คำตอบ:


74

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

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

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


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

2
คำแนะนำที่ดีเกี่ยวกับ Facade / กลยุทธ์ในการแบ่งรหัสเป็นส่วนย่อย ๆ แม้ว่าจะไม่ทราบรายละเอียดเพิ่มเติม แต่ก็ยากที่จะรู้ว่าจะแนะนำอะไร
949300

25

คำถามที่น่าสนใจ ฉันรู้สึกลำเอียงเล็กน้อยเนื่องจากประสบการณ์ก่อนหน้าของฉันซึ่งทำให้ฉันตอบด้วยหมายเลข

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

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

ฉันพบว่า5 Whys มีประโยชน์เป็นพิเศษ คำอธิบายของคุณที่นี่อ่านเหมือนเหตุผลแรก:

  • "เรามีคลาสเทพเจ้านี้แล้ว" ทำไม?
  • "เพราะมันทำให้อัลกอริทึมการสร้างโพรซีเดอร์ง่ายขึ้น"

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

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


9

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

ขั้นตอนแรกคือการวิเคราะห์ว่าเหตุใด AI ของคุณจึงมีปัญหามากมายเกี่ยวกับการจัดการกับความซับซ้อนของรูปแบบของคุณ

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

การแก้ปัญหานั้นจะไม่ได้เป็นการรวมกลยุทธ์ทั้งหมดเข้ากับคลาสกระสุน แต่เป็นการลดการแนะนำสำหรับ AI จากแกน AI ไปยังการใช้กลยุทธ์

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

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

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

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


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

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

8

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

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


2

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

ฉันคิดว่าเป็นคำถามใหม่ (อาจอยู่ที่นี่หรือที่ gamedev.stackexchange.com?) ซึ่งคุณสรุปปัญหาที่คุณพบกับสถาปัตยกรรมของคุณเมื่อใช้ร่วมกับ proc พล. อ. จะน่าสนใจจริงๆ แจ้งให้เราทราบที่นี่หากคุณมีคำถามใหม่!


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

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

0

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

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

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

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

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