นี่เป็นคำถามที่ค่อนข้างคลุมเครือ แต่เป็นสิ่งที่ฉันไม่เคยรู้สึกว่าได้รับคำตอบอย่างน่าพอใจเมื่ออ่านเกี่ยวกับการออกแบบที่เหมาะสม
โดยทั่วไปเมื่อเรียนรู้เกี่ยวกับการเขียนโปรแกรมเชิงวัตถุ, นามธรรม, แยกตัวประกอบ ฯลฯ จอกศักดิ์สิทธิ์ของการออกแบบ - และเหตุผลที่พวกเขาอ้างเสมอว่าคุณใช้เทคนิคการพัฒนาที่เป็นปัญหา - คือมันจะทำให้โปรแกรมของคุณ "ง่ายต่อการเปลี่ยนแปลง" , "maintainable", "ยืดหยุ่น" หรือคำพ้องความหมายใด ๆ ที่ใช้เพื่อแสดงแนวคิดเกี่ยวกับการผลิตที่ทำให้เกิดเสียงดังกล่าว ด้วยการทำเครื่องหมายส่วนตัวของ ivars ให้แยกรหัสออกเป็นวิธีเล็ก ๆ ที่มีอยู่ในตัวเองทำให้อินเตอร์เฟสทั่วไปทำให้คุณสามารถปรับเปลี่ยนโปรแกรมของคุณได้อย่างง่ายดาย
สำหรับการเปลี่ยนแปลงที่ค่อนข้างเล็กสิ่งนี้ใช้ได้ดีสำหรับฉัน การเปลี่ยนแปลงโครงสร้างข้อมูลภายในที่ใช้โดยคลาสเพื่อเพิ่มประสิทธิภาพไม่เคยมีความยุ่งยากที่สำคัญและไม่มีการเปลี่ยนแปลงส่วนท้ายของส่วนต่อประสานผู้ใช้ที่เป็นอิสระจาก API เช่นการออกแบบระบบป้อนข้อความใหม่หรือปรับปรุงกราฟิกสำหรับองค์ประกอบการเล่นเกม .
การเปลี่ยนแปลงทั้งหมดเหล่านี้ดูเหมือนมีอยู่ในตัวเองโดยเนื้อแท้ ไม่มีสิ่งใดที่เกี่ยวข้องกับการเปลี่ยนแปลงพฤติกรรมหรือการออกแบบองค์ประกอบของโปรแกรมของคุณที่ได้รับการแก้ไขตราบใดที่รหัสภายนอกเกี่ยวข้อง ไม่ว่าคุณจะเขียนขั้นตอนหรือในสไตล์ OO ที่มีฟังก์ชั่นขนาดใหญ่หรือขนาดเล็กการเปลี่ยนแปลงเหล่านี้ง่ายต่อการเปลี่ยนแปลงแม้ว่าคุณจะมีการออกแบบที่ดีพอสมควรก็ตาม
อย่างไรก็ตามเมื่อใดก็ตามที่การเปลี่ยนแปลงมีขนาดใหญ่และมีขนฟูนั่นคือการเปลี่ยนแปลง API - ไม่มีรูปแบบ "อันมีค่า" ของฉันเลยที่จะช่วยเหลือ การเปลี่ยนแปลงครั้งใหญ่ยังคงใหญ่รหัสที่ได้รับผลกระทบยังคงได้รับผลกระทบและงานการวางไข่หลายชั่วโมงอยู่ข้างหน้าฉัน
ดังนั้นคำถามของฉันคือสิ่งนี้ การออกแบบที่เหมาะสมนั้นมีการเปลี่ยนแปลงขนาดใหญ่เพียงใดเพื่อให้สามารถอำนวยความสะดวกได้? มีเทคนิคการออกแบบเพิ่มเติมบางอย่างไม่เป็นที่รู้จักสำหรับฉันหรือฉันล้มเหลวในการใช้งานที่ทำให้การปรับเปลี่ยนที่ทำให้เกิดเสียงง่าย ๆ หรือเป็นสัญญานั้น (ซึ่งฉันได้ยินจากกระบวนทัศน์ที่แตกต่างกันมากมาย) เป็นแนวคิดที่ดี ตัดการเชื่อมต่ออย่างสมบูรณ์จากความจริงที่ไม่เปลี่ยนรูปแบบของการพัฒนาซอฟต์แวร์? มี "เครื่องมือเปลี่ยน" ฉันสามารถเพิ่มลงในแถบเครื่องมือของฉันได้หรือไม่
โดยเฉพาะปัญหาที่ฉันกำลังเผชิญซึ่งนำฉันไปยังฟอรัมคือ: ฉันกำลังทำงานเกี่ยวกับการใช้ภาษาการเขียนโปรแกรมตีความ (ดำเนินการใน D แต่ไม่เกี่ยวข้อง) และฉันตัดสินใจว่าข้อโต้แย้งของการปิดของฉันควรจะ ใช้คำหลักไม่ใช่ตำแหน่งตามที่เป็นอยู่ในปัจจุบัน สิ่งนี้ต้องการการแก้ไขโค้ดที่มีอยู่ทั้งหมดที่เรียกใช้ฟังก์ชั่นนิรนามซึ่งโชคดีที่ค่อนข้างเล็กเพราะฉันยังอยู่ในช่วงเริ่มต้นของการพัฒนาภาษาของฉัน (<2000 บรรทัด) แต่จะมีขนาดใหญ่มากหากฉันตัดสินใจในภายหลัง ในสถานการณ์เช่นนี้มีวิธีใดที่การคาดการณ์ล่วงหน้าที่เหมาะสมในการออกแบบฉันสามารถทำให้การดัดแปลงนี้ง่ายขึ้นหรือมีการเปลี่ยนแปลงบางอย่าง (ส่วนใหญ่) ในวงกว้าง? ฉันอยากรู้ว่านี่เป็นความล้มเหลวของทักษะการออกแบบของตัวเองหรือไม่ - ถ้าเป็นฉัน
เพื่อความชัดเจนฉันไม่เคยสงสัย OOP หรือรูปแบบอื่นใดที่ใช้บ่อย อย่างไรก็ตามสำหรับฉันแล้วคุณธรรมของพวกเขานั้นอยู่ในการเขียนแบบดั้งเดิมมากกว่าการคงไว้ซึ่งรหัสฐาน การสืบทอดช่วยให้คุณมีรูปแบบการทำซ้ำ ๆ ที่เป็นนามธรรมได้ดี polymorphism ช่วยให้คุณสามารถแยกรหัสด้วยฟังก์ชั่นที่มนุษย์เข้าใจได้ (คลาสใด) แทนที่จะใช้เอฟเฟกต์ที่เข้าใจด้วยเครื่อง (สาขาใดของswitch
คำสั่ง) เขียนในสไตล์ "จากล่างขึ้นบน" ที่น่าพอใจมาก อย่างไรก็ตามฉันสงสัยว่าพวกเขาอ้างถึงความยืดหยุ่น
foo metarg1: bar metarg2: baz
foo.metarg1_metarg2_(bar, baz)
อย่างไรก็ตามภาษาของฉันมีการเปลี่ยนแปลงที่ใหญ่กว่านั่นคือรายการตามพารามิเตอร์เป็นพารามิเตอร์ตามพจนานุกรมซึ่งมีผลต่อรันไทม์ แต่ไม่ใช่ตัวแยกวิเคราะห์ที่จริงแล้วเนื่องจากคุณสมบัติเฉพาะของภาษาของฉันฉันจะไม่เข้าไปตอนนี้ เนื่องจากไม่มีการแมปที่ชัดเจนระหว่างคำสั่งที่ไม่ได้จัดเรียงคำหลักและอาร์กิวเมนต์ตำแหน่งการใช้งานจึงเป็นปัญหาหลัก