คำถามนำเสนอภาวะที่กลืนไม่เข้าคายไม่ออกเท็จ การใช้หลักการ YAGNI อย่างเหมาะสมไม่ใช่สิ่งที่ไม่เกี่ยวข้อง มันเป็นแง่มุมหนึ่งของการออกแบบที่ดี หลักการ SOLID แต่ละข้อนั้นเป็นลักษณะของการออกแบบที่ดีเช่นกัน คุณไม่สามารถนำหลักการทุกข้อไปใช้ในวินัยใด ๆ ได้อย่างเต็มที่ ปัญหาในโลกแห่งความจริงทำให้เกิดแรงผลักดันอย่างมากกับโค้ดของคุณ หลักการออกแบบต้องคำนึงถึงสิ่งเหล่านั้นทั้งหมด แต่ไม่มีหลักการใดที่เหมาะสมกับทุกสถานการณ์
ทีนี้มาดูหลักการแต่ละข้อด้วยความเข้าใจว่าแม้ว่าบางครั้งพวกเขาอาจจะไปในทิศทางที่ต่างกัน แต่พวกเขาก็ไม่ขัดแย้งกัน
YAGNI รู้สึกว่าจะช่วยให้นักพัฒนาซอฟต์แวร์หลีกเลี่ยงการทำงานซ้ำบางประเภท: สิ่งที่มาจากการสร้างสิ่งที่ผิด สิ่งนี้ทำได้โดยการแนะนำให้เราหลีกเลี่ยงการตัดสินใจที่ผิดพลาดเร็วเกินไปบนพื้นฐานของสมมติฐานหรือการคาดการณ์เกี่ยวกับสิ่งที่เราคิดว่าจะเปลี่ยนแปลงหรือจำเป็นในอนาคต ประสบการณ์โดยรวมบอกเราว่าเมื่อเราทำเช่นนี้เรามักจะผิด ตัวอย่างเช่น YAGNI จะบอกคุณไม่ให้สร้างอินเทอร์เฟซเพื่อวัตถุประสงค์ในการนำกลับมาใช้ใหม่เว้นแต่คุณจะรู้ว่าตอนนี้คุณต้องการผู้ใช้งานหลายคน ในทำนองเดียวกัน YAGNI จะบอกว่าอย่าสร้าง "ScreenManager" เพื่อจัดการแบบฟอร์มเดียวในแอปพลิเคชันเว้นแต่คุณจะรู้ในตอนนี้ว่าคุณจะมีหน้าจอมากกว่าหนึ่งหน้า
ตรงกันข้ามกับสิ่งที่หลายคนคิดว่า SOLID ไม่ได้เกี่ยวกับการนำกลับมาใช้ใหม่, ความมีชีวิตชีวาหรือแม้กระทั่งนามธรรม โซลิดมีวัตถุประสงค์เพื่อช่วยให้คุณเขียนโค้ดที่เตรียมไว้สำหรับการเปลี่ยนแปลงโดยไม่ต้องพูดอะไรเกี่ยวกับสิ่งที่การเปลี่ยนแปลงนั้นอาจจะเป็น หลักการห้าข้อของ SOLID สร้างกลยุทธ์สำหรับการสร้างรหัสที่ยืดหยุ่นโดยไม่ต้องมีความกว้างมากเกินไปและเรียบง่ายโดยไม่ไร้เดียงสา การใช้รหัส SOLID ที่เหมาะสมจะสร้างคลาสที่เล็กมุ่งเน้นไปที่บทบาทและขอบเขตที่ชัดเจน ผลการปฏิบัติคือการเปลี่ยนแปลงข้อกำหนดที่จำเป็นใด ๆ จำเป็นต้องมีจำนวนชั้นเรียนขั้นต่ำ และในทำนองเดียวกันสำหรับการเปลี่ยนแปลงรหัสใด ๆ จะมีจำนวน "ripple" ที่ลดลงไปยังคลาสอื่น ๆ
ดูสถานการณ์ตัวอย่างที่คุณมีลองดูว่า YAGNI และ SOLID อาจจะพูดอะไร คุณกำลังพิจารณาอินเทอร์เฟซที่เก็บข้อมูลทั่วไปเนื่องจากข้อเท็จจริงที่ว่าที่เก็บข้อมูลทั้งหมดมีลักษณะเหมือนกันจากภายนอก แต่คุณค่าของอินเตอร์เฟซทั่วไปที่พบบ่อยคือความสามารถในการใช้งานของผู้ใช้งานโดยไม่จำเป็นต้องรู้ว่ามันคืออะไรโดยเฉพาะ หากไม่มีแอพของคุณในที่ที่จำเป็นและมีประโยชน์ YAGNI บอกว่าอย่าทำ
มี 5 หลักการที่จะดู S คือความรับผิดชอบเดียว สิ่งนี้ไม่ได้บอกอะไรเกี่ยวกับอินเทอร์เฟซ แต่มันอาจจะพูดอะไรบางอย่างเกี่ยวกับคลาสที่เป็นรูปธรรมของคุณ อาจเป็นที่ถกเถียงกันอยู่ว่าการจัดการการเข้าถึงข้อมูลนั้นอาจเป็นความรับผิดชอบที่ดีที่สุดของคลาสอย่างน้อยหนึ่งคลาสในขณะที่ความรับผิดชอบของที่เก็บข้อมูลคือการแปลจากบริบทโดยนัย (CustomerRepository เป็นที่เก็บข้อมูลโดยนัย API การเข้าถึงข้อมูลทั่วไปที่ระบุประเภทเอนทิตีของลูกค้า
O เปิด - ปิด นี่คือมรดกส่วนใหญ่ มันจะนำไปใช้ถ้าคุณพยายามที่จะได้รับที่เก็บของคุณจากฐานร่วมการใช้งานฟังก์ชั่นทั่วไปหรือถ้าคุณคาดว่าจะได้รับเพิ่มเติมจากที่เก็บที่แตกต่างกัน แต่คุณไม่ได้ดังนั้นจึงไม่
L คือการทดแทน Liskov สิ่งนี้ใช้ถ้าคุณตั้งใจจะใช้ที่เก็บข้อมูลผ่านส่วนต่อประสานที่เก็บข้อมูลทั่วไป มันวางข้อ จำกัด ในอินเทอร์เฟซและการใช้งานเพื่อให้แน่ใจว่าสอดคล้องและหลีกเลี่ยงการจัดการพิเศษสำหรับ impelementers ที่แตกต่างกัน เหตุผลนี้คือการจัดการพิเศษดังกล่าวทำลายวัตถุประสงค์ของอินเทอร์เฟซ อาจเป็นประโยชน์ในการพิจารณาหลักการนี้เพราะอาจเตือนคุณให้ห่างจากการใช้อินเทอร์เฟซที่เก็บข้อมูลทั่วไป สิ่งนี้สอดคล้องกับแนวทางของ YAGNI
ฉันแยกส่วนต่อประสาน สิ่งนี้อาจนำไปใช้ถ้าคุณเริ่มเพิ่มการดำเนินการแบบสอบถามที่แตกต่างกันไปยังที่เก็บของคุณ การแยกส่วนอินเทอร์เฟซนำไปใช้ซึ่งคุณสามารถแบ่งสมาชิกของคลาสออกเป็นสองชุดย่อยซึ่งผู้บริโภคบางรายจะใช้งานและผู้ใช้รายอื่นจะใช้งาน แต่จะไม่มีผู้บริโภครายใดใช้ทั้งสองชุดย่อย คำแนะนำคือการสร้างสองอินเตอร์เฟสแยกจากกัน ในกรณีของคุณไม่น่าเป็นไปได้ที่การดึงและบันทึกแต่ละอินสแตนซ์จะถูกใช้โดยรหัสเดียวกันที่จะทำการสืบค้นทั่วไปดังนั้นจึงอาจมีประโยชน์ในการแยกอินสแตนซ์เหล่านั้นออกเป็นสองอินเตอร์เฟส
D คือการพึ่งพาการฉีด ที่นี่เรากลับมาที่จุดเดียวกันกับ S หากคุณแยกปริมาณการใช้ data access API ของคุณเป็นวัตถุแยกต่างหากหลักการนี้บอกว่าแทนที่จะเพิ่งเพิ่งสร้างอินสแตนซ์ของวัตถุนั้นขึ้นมาใหม่คุณควรส่งผ่านเมื่อคุณสร้าง พื้นที่เก็บข้อมูล สิ่งนี้ทำให้ง่ายต่อการควบคุมอายุการใช้งานของคอมโพเนนต์การเข้าถึงข้อมูลเปิดความเป็นไปได้ของการแชร์การอ้างอิงระหว่างที่เก็บข้อมูลของคุณโดยไม่ต้องไปตามเส้นทางของการทำให้เป็นแบบซิงเกิล
เป็นสิ่งสำคัญที่จะต้องทราบว่าหลักการ SOLID ส่วนใหญ่ไม่จำเป็นต้องนำมาใช้ในขั้นตอนนี้โดยเฉพาะในการพัฒนาแอพของคุณ ตัวอย่างเช่นคุณควรแยกการเข้าถึงข้อมูลหรือไม่นั้นขึ้นอยู่กับความซับซ้อนและว่าคุณต้องการทดสอบตรรกะที่เก็บของคุณโดยไม่ต้องกดปุ่มฐานข้อมูลหรือไม่ ดูเหมือนว่ามันไม่น่าเป็นไปได้ (น่าเสียดายในความคิดของฉัน) ดังนั้นจึงอาจไม่จำเป็น
ดังนั้นหลังจากการพิจารณาทั้งหมดนั้นเราพบว่า YAGNI และ SOLID ให้คำแนะนำที่เป็นของแข็งและเกี่ยวข้องกับชิ้นส่วนที่พบได้ทันที: จริง ๆ แล้วมันอาจไม่จำเป็นต้องสร้างอินเทอร์เฟซที่เก็บข้อมูลทั่วไป
ความคิดที่รอบคอบนี้มีประโยชน์อย่างยิ่งในการเรียนรู้ มันใช้เวลานานในการเรียนรู้ แต่เมื่อเวลาผ่านไปคุณจะพัฒนาสัญชาตญาณและกลายเป็นเร็วมาก คุณจะรู้ว่าสิ่งที่ถูกต้องที่จะทำ แต่ไม่จำเป็นต้องคิดคำเหล่านี้ทั้งหมดเว้นแต่มีคนขอให้คุณอธิบายว่าทำไม