ฉันค่อนข้างใหม่กับหลักการออกแบบSOLID ฉันเข้าใจถึงสาเหตุและผลประโยชน์ของพวกเขา แต่ยังไม่สามารถนำไปใช้กับโครงการขนาดเล็กที่ฉันต้องการสร้างโครงสร้างใหม่ให้เป็นการฝึกปฏิบัติเพื่อใช้หลักการ SOLID ฉันรู้ว่าไม่จำเป็นต้องเปลี่ยนแอปพลิเคชันที่ทำงานได้อย่างสมบูรณ์แบบ แต่ฉันต้องการปรับโครงสร้างใหม่เพื่อให้ได้รับประสบการณ์การออกแบบสำหรับโครงการในอนาคต
แอปพลิเคชั่นมีงานดังต่อไปนี้ (จริง ๆ แล้วมากกว่านั้น แต่ให้ง่าย): มันต้องอ่านไฟล์ XML ซึ่งมีฐานข้อมูลตาราง / คอลัมน์ / ดูคำนิยาม ฯลฯ และสร้างไฟล์ SQL ที่สามารถใช้เพื่อสร้าง สกีมาฐานข้อมูล ORACLE
(หมายเหตุ: โปรดอย่าอภิปรายว่าทำไมฉันถึงต้องการหรือทำไมฉันถึงไม่ใช้ XSLT และอื่น ๆ มีเหตุผลหลายประการ แต่มันไม่ใช่หัวข้อ)
เป็นการเริ่มต้นฉันเลือกดูเฉพาะตารางและข้อ จำกัด หากคุณไม่สนใจคอลัมน์คุณสามารถระบุวิธีต่อไปนี้:
ข้อ จำกัด เป็นส่วนหนึ่งของตาราง (หรือมากกว่าอย่างแม่นยำส่วนหนึ่งของคำสั่ง CREATE TABLE) และข้อ จำกัด อาจอ้างอิงตารางอื่น
ก่อนอื่นฉันจะอธิบายว่าแอปพลิเคชันมีลักษณะอย่างไรในตอนนี้ (ไม่ได้ใช้ SOLID):
ในขณะนี้แอปพลิเคชันมีคลาส "ตาราง" ซึ่งมีรายการตัวชี้ถึงข้อ จำกัด ที่เป็นเจ้าของโดยตารางและรายการตัวชี้ไปยังข้อ จำกัด ที่อ้างอิงถึงตารางนี้ เมื่อใดก็ตามที่การเชื่อมต่อเริ่มต้นขึ้นการเชื่อมต่อย้อนหลังก็จะถูกสร้างเช่นกัน ตารางมีเมธอด createStatement () ซึ่งจะเรียกใช้ฟังก์ชัน createStatement () ของแต่ละข้อ จำกัด วิธีการดังกล่าวจะใช้การเชื่อมต่อไปยังตารางเจ้าของและตารางอ้างอิงเพื่อดึงข้อมูลชื่อของพวกเขา
เห็นได้ชัดว่านี่ไม่ได้ใช้กับโซลิดเลย ตัวอย่างเช่นมีการขึ้นต่อกันแบบวงกลมซึ่งทำให้โค้ดในแง่ของ "เพิ่ม" / "ลบ" วิธีการที่จำเป็นและวัตถุขนาดใหญ่ destructors
ดังนั้นมีคำถามสองสามข้อ:
- ฉันควรแก้ไขการอ้างอิงแบบวงกลมโดยใช้การฉีดพึ่งพาหรือไม่ ถ้าเป็นเช่นนั้นฉันคิดว่าข้อ จำกัด ควรได้รับตารางเจ้าของ (และเลือกที่อ้างอิง) ในตัวสร้าง แต่ฉันจะเรียกใช้ข้อ จำกัด สำหรับตารางเดียวได้อย่างไร?
- หากคลาส Table เก็บสถานะของตัวเอง (เช่นชื่อตารางความคิดเห็นของตาราง ฯลฯ ) และลิงก์ไปยังข้อ จำกัด "ความรับผิดชอบ" หนึ่งหรือสองอย่างนี้เป็นความคิดของหลักการความรับผิดชอบเดี่ยวหรือไม่?
- ในกรณีที่ 2 ถูกต้องฉันควรสร้างคลาสใหม่ในชั้นธุรกิจแบบลอจิคัลซึ่งจัดการลิงก์หรือไม่ ถ้าเป็นเช่นนั้น 1. จะไม่มีความเกี่ยวข้องอีกต่อไป
- วิธีการ "createStatement" ควรเป็นส่วนหนึ่งของคลาส Table / Constraint หรือฉันควรจะย้ายมันออกมาด้วยเช่นกัน? ถ้าเป็นเช่นนั้นจะไปที่ไหน? หนึ่งคลาสผู้จัดการต่อหนึ่งคลาสหน่วยเก็บข้อมูล (เช่นตาราง, ข้อ จำกัด , ... )? หรือค่อนข้างสร้างคลาสผู้จัดการต่อลิงค์ (คล้ายกับ 3)?
เมื่อใดก็ตามที่ฉันพยายามตอบคำถามเหล่านี้ฉันพบว่าตัวเองทำงานอยู่ในแวดวงที่ไหนสักแห่ง
เห็นได้ชัดว่าปัญหามีความซับซ้อนมากขึ้นถ้าคุณรวมคอลัมน์ดัชนีและอื่น ๆ แต่ถ้าพวกคุณช่วยฉันด้วยสิ่งที่ตาราง / ข้อ จำกัด ง่ายๆฉันอาจจะทำงานที่เหลือด้วยตัวเอง