ฉันควรกังวลถ้าฉันแก้ปัญหามากมายด้วยวิธีเดียวกันหรือไม่?


13

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

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

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


หากคุณยังคงทำซ้ำตัวเองทำไมไม่สร้างองค์ประกอบที่ใช้ซ้ำได้?
Kugel

ไม่จำเป็นว่าจะเป็นวิธีที่ดีในการแก้พวกเขา :)
haylem

4
หากคุณทำซ้ำตัวเองตลอดเวลาแล้วเขียนห้องสมุด
งาน

@Bryan Harrington ต้องเผชิญกับปัญหาเดียวกันแน่นอนฉันต้องบอกว่าฉันทำงานในโดเมนที่แตกต่างกันเช่นจากตรรกะทางธุรกิจ (ที่ทำงาน) จนถึงการเขียนโปรแกรมเคอร์เนล (ที่บ้าน) และจากการทำงานใน C # (ที่ทำงาน) ถึง C ++ (ที่บ้าน) ช่วยฉันมาก ฉันยังมีนิสัยในการอ่านซอร์สโค้ดที่นี่ คือ ลิงค์บางส่วน :) นอกจากนี้คุณสามารถอ่านGOF
Chani

คำตอบ:


26

ไม่เป็นไร.

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

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


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

12

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


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

@Satanicpuppy ... บางครั้งเราไม่มีไขควงและมีปัญหาที่ต้องแก้ไขในตอนนี้ ในกรณีนี้ค้อนเป็นเครื่องมือที่ดีที่สุดในเวลาที่กำหนด
CaffGeek

@Chad - การเปรียบเทียบที่แม่นยำรบกวน
normanthesquid

5

ในงานประจำวันของเราเรามักจะได้รับปัญหาที่คล้ายกัน

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

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

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

บางทีเลือกการเปลี่ยนแปลงที่ไม่เร่งด่วน / ไม่สำคัญและใช้การเปลี่ยนแปลงเหล่านั้นเพื่อเร่งความเร็วด้วยโซลูชันทางเลือก


4

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

เมื่อไรดี? ทำการวิเคราะห์ประสิทธิภาพของรหัสของคุณ - หากคุณเห็นว่าคุณอยู่ใน O (log n) หรือ O (n) หรือ O (n log n) และเนื่องจากปัญหาดังกล่าวสามารถแมปกับโครงสร้างข้อมูลที่รู้จักได้โดยทั่วไป

เมื่อไรที่ไม่ดี? ความซับซ้อนของเวลาหรือพื้นที่ของคุณคือ O (n ^ 2) หรือแย่กว่านั้นหรือปัญหาตามคำนิยามคือ NP ที่สมบูรณ์ ในสถานการณ์เหล่านี้คุณต้องใช้ฮิวริสติกพอสมควรใช้ความรู้จากโดเมนอื่นเป็นต้น

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


3

ไม่จำเป็นถ้ามันเป็นวิธีที่ดีในการแก้ปัญหา :)

โดยปกติเมื่อทำงานกับ "วิธีแก้ปัญหา" ฉันจะทำสิ่งเหล่านี้ตามลำดับ:

  • ความเรียบง่าย ,
  • สามารถนำมาใช้ ,
  • และสุดท้ายเท่านั้น ประสิทธิภาพ

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

แม้ว่าจะแปลกเมื่อเขียนโค้ดใน C ฉันสนใจมากเกี่ยวกับประสิทธิภาพมากกว่าเมื่อเขียนโค้ดใน Java ... พลังของนิสัย :))


2

ตราบใดที่ปัญหาได้รับการแก้ไขอย่างมีประสิทธิภาพก็ไม่จำเป็นต้องกังวล


2

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


2

ถ้ามันใช้ได้ก็โอเค

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


2

หากคุณแก้ปัญหาได้ดี และมันก็ไม่สำคัญว่าจะทำอะไรจนกว่าจะไม่มีปัญหาเพิ่มขึ้น


0

"Art Developer" มีคำตอบที่ถูกต้องหากเป้าหมายของคุณคือผลิตผลิตภัณฑ์ และถ้า "โรงงาน" ของคุณผลิตผลิตภัณฑ์ที่ตอบสนองแล้วก็เท่ห์

แต่...

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

นี่คือการสำรองข้อมูลจริงผ่านการวิจัยทางระบบประสาท ดังนั้นคุณไป

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