วิธีการสร้างรหัส OO ที่ดีขึ้นในแอปพลิเคชันที่ขับเคลื่อนด้วยฐานข้อมูลเชิงสัมพันธ์ซึ่งฐานข้อมูลนั้นได้รับการออกแบบไม่ดี


19

ฉันกำลังเขียนโปรแกรมเว็บ Java ที่ประกอบด้วยส่วนใหญ่ของหน้าคล้ายกันที่ทุกหน้ามีหลายตารางและตัวกรองที่ใช้กับตารางเหล่านั้น ข้อมูลในตารางเหล่านี้มาจากฐานข้อมูล SQL

ฉันใช้ myBatis เป็น ORM ซึ่งอาจไม่ใช่ตัวเลือกที่ดีที่สุดในกรณีของฉันเนื่องจากฐานข้อมูลได้รับการออกแบบไม่ดีและ mybatis เป็นเครื่องมือที่มุ่งเน้นฐานข้อมูลมากขึ้น

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

ได้รับข้อมูล (p1, ... , ปี่);

รับข้อมูลB (p1, ... , pi);

รับข้อมูลC (p1, ... , pi);

รับข้อมูลD (p1, ... , pi); ...

และในไม่ช้านี้จะระเบิดเมื่อเรามีตารางที่แตกต่างกันและมีคอลัมน์ต่างกัน

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

วิธีการแก้ปัญหาที่ถูกต้องจะห่อหุ้ม mappers ORM ด้วย extralayer ที่นำเสนออินเทอร์เฟซที่เป็นเนื้อเดียวกันมากขึ้นกับ db หรือมีวิธีที่ดีกว่าในการจัดการกับรหัสสปาเก็ตตี้ที่ฉันกำลังเขียนหรือไม่

แก้ไข: ข้อมูลเพิ่มเติมเกี่ยวกับฐานข้อมูล

ฐานข้อมูลเก็บข้อมูลการโทรศัพท์เป็นหลัก การออกแบบที่ไม่ดีประกอบด้วย:

ตารางที่มี ID ประดิษฐ์เป็นคีย์หลักที่ไม่เกี่ยวข้องกับความรู้เกี่ยวกับโดเมน

ไม่ซ้ำกันเรียกใช้ตรวจสอบหรือคีย์ต่างประเทศใด ๆ

เขตข้อมูลที่มีชื่อสามัญที่ตรงกับแนวคิดที่แตกต่างกันสำหรับระเบียนที่แตกต่างกัน

ระเบียนที่สามารถจัดประเภทได้โดยการข้ามกับตารางอื่นที่มีเงื่อนไขแตกต่างกัน

คอลัมน์ที่ควรเป็นตัวเลขหรือวันที่จัดเก็บเป็นสตริง

สรุปแล้วการออกแบบที่ยุ่งเหยิง / ขี้เกียจอยู่รอบตัว


7
การแก้ไขฐานข้อมูลเป็นตัวเลือกหรือไม่?
RMalke

1
โปรดอธิบายว่าฐานข้อมูลได้รับการออกแบบอย่างไร
Tulains Córdova

@ Renan Malke Stigliani แต่น่าเสียดายที่ไม่มีเพราะมีซอฟต์แวร์แบบดั้งเดิมที่ขึ้นอยู่กับมันอย่างไรก็ตามฉันได้ทำมิเรอร์บางส่วนของตารางที่มีการออกแบบที่แตกต่างกันเล็กน้อยและเติมพวกเขาซึ่งทำให้รหัสง่ายขึ้น อย่างไรก็ตามฉันไม่ได้ภูมิใจในสิ่งนี้และฉันไม่ควรทำซ้ำตารางโดยไม่เลือกปฏิบัติ
DPM

1
หนังสือเล่มนี้อาจช่วยให้คุณรู้ว่าคุณจะเริ่มแก้ไขปัญหาฐานข้อมูลได้อย่างไรและทำให้รหัสเดิมทำงานได้: amazon.com/…
HLGEM

4
ปัญหาส่วนใหญ่ที่คุณแสดงรายการ . . ไม่ได้ การใช้คีย์ตัวแทนแทนคีย์ธรรมชาติเป็นข้อแนะนำที่ค่อนข้างธรรมดาในปัจจุบัน ไม่ใช่ "การออกแบบที่ไม่ดี" เลย การขาดข้อ จำกัด และการใช้ประเภทคอลัมน์ที่ไม่เหมาะสมเป็นตัวอย่างที่ดีกว่า "การออกแบบที่ไม่ดี" ไปแล้ว แต่มันไม่ควรส่งผลกระทบต่อรหัสแอปพลิเคชันของคุณเลย (เว้นแต่คุณวางแผนที่จะละเมิดปัญหาเหล่านี้)
ruakh

คำตอบ:


53

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

คำถามจริงที่นี่คือที่คุณแค็ปซูลความซับซ้อนที่?

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

แล้วเราจะทำอย่างไรเมื่อเรามีข้อมูลที่ไม่มีแบบจำลองที่ดีสำหรับค่าเฉลี่ยของเรา

แปลภาษา. มันเป็นสิ่งเดียวที่คุณสามารถทำได้ การแปลนั้นเป็น 'ความซับซ้อน' ที่ฉันอ้างถึงข้างต้น ดังนั้นตอนนี้ที่เรายอมรับว่าเรากำลังจะแปลโมเดลเราต้องตัดสินใจด้วยปัจจัยสองสามประการ

เราจำเป็นต้องแปลทั้งสองทิศทางหรือไม่ ทั้งสองทิศทางจะได้รับการแปลเหมือนกันเช่นใน:

(Tbl A, Tbl B) -> Obj X (อ่าน)

Obj X -> (Tbl A, Tbl B) (เขียน)

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


คุณแปลที่ไหน

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

อีกครั้งตอนนี้ ปัญหาของคุณคือ: คุณวางความซับซ้อนนี้ไว้ที่ไหน? คุณมีทางเลือก

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

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

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

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

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


ตอนนี้เริ่มพูดบ้ากันแล้ว

Objectไม่ได้เป็นเพียงสิ้นทั้งหมดเป็นนามธรรมทั้งหมดที่มีอยู่ มีความลึกซึ้งของ abstractions พัฒนามานานหลายปีที่วิทยาศาสตร์คอมพิวเตอร์ได้รับการศึกษาและแม้กระทั่งก่อนหน้านั้นจากการศึกษาคณิตศาสตร์ หากเรากำลังจะเริ่มสร้างความสร้างสรรค์ลองเริ่มพูดถึงสิ่งที่เป็นนามธรรมที่รู้จักซึ่งมีการศึกษา

มีโมเดลนักแสดงนี่เป็นวิธีการที่น่าสนใจเพราะมันบอกว่าสิ่งที่คุณทำคือการส่งข้อความไปยังโค้ดอื่นซึ่งมอบหมายงานทั้งหมดให้กับโค้ดอื่นนั้นได้อย่างมีประสิทธิภาพซึ่งมีประสิทธิภาพมากในการห่อหุ้มความซับซ้อนออกไปจากโค้ดทั้งหมดของคุณ สิ่งนี้สามารถทำงานได้ในขณะที่คุณส่งข้อความถึงนักแสดงที่พูดว่า "ฉันต้องการ Obj X ที่ส่งไปยัง Y" และคุณมีที่รองรับการตอบกลับที่ตำแหน่ง Y ซึ่งจะประมวลผล Obj X คุณสามารถส่งข้อความที่สั่ง "ฉันต้องการ Obj X และการคำนวณ Y, Z ทำได้แล้ว" จากนั้นคุณไม่จำเป็นต้องรอ การแปลจะเกิดขึ้นที่อีกด้านหนึ่งของข้อความผ่านและคุณสามารถดำเนินการต่อได้หากคุณไม่ต้องการอ่านผลลัพธ์ นี่อาจเป็นการดูถูกดูแคลนนักแสดงนางแบบเพื่อจุดประสงค์ของคุณ แต่ทั้งหมดขึ้นอยู่กับ;

ขอบเขตการห่อหุ้มก็คือขอบเขตกระบวนการ สิ่งเหล่านี้สามารถใช้เพื่อแยกความซับซ้อนอย่างมีประสิทธิภาพ คุณสามารถสร้างรหัสการแปลเป็นบริการเว็บที่การสื่อสารเป็น HTTP แบบง่ายโดยใช้ SOAP, REST หรือถ้าคุณต้องการโปรโตคอลของคุณเองจริงๆ (ไม่แนะนำ) STOMP ไม่ใช่โปรโตคอลใหม่ที่ไม่ดีเลย หรือใช้บริการ daemon ปกติกับไพพ์หน่วยความจำที่เผยแพร่ในระบบสำหรับการสื่อสารอย่างรวดเร็วอีกครั้งโดยใช้โปรโตคอลที่คุณเลือก นี่มีประโยชน์ที่ดีพอสมควร:

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

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


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

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

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

โอเคใช่ที่พูดถึงคนบ้าจริง ๆ แต่ใครจะรู้ คุณอาจเป็นคนบ้าคลั่ง (อย่างจริงจังอย่าทำพระด้วยคะแนนบ้าคลั่งต่ำกว่า 88% มีความเสี่ยงต่อการบาดเจ็บทางร่างกาย)


4
ว้าวเป็นคำตอบที่ครอบคลุมมากเป็นพิเศษ ฉันลงคะแนนมากกว่าหนึ่งครั้งถ้ามีเพียง SE เท่านั้นที่จะให้ฉัน
Marjan Venema

11
หนังเวอร์ชั่นออกมาเมื่อไหร่?
yannis

3
@JimmyHoffa ไชโยเซอร์ !!! ฉันจะบุ๊คมาร์คคำตอบนี้ไว้และแสดงลูกสาวของฉันเมื่อเธอโตขึ้น
Tombatron

4

คำแนะนำของฉัน:

สร้างมุมมองฐานข้อมูลที่:

  1. ให้ชื่อที่มีความหมายกับคอลัมน์
  2. ทำ "ข้ามกับตารางอื่นที่มีเงื่อนไขแตกต่างกัน" เพื่อให้คุณสามารถซ่อนความซับซ้อนนั้นไว้ได้
  3. แปลงตัวเลขหรือวันที่เก็บไว้เป็นสตริงเป็นตัวเลขและวันที่ตามลำดับ
  4. สร้างความเป็นเอกลักษณ์เมื่อไม่มีใครตามเกณฑ์บางอย่าง

ความคิดคือการสร้างซุ้มที่เลียนแบบการออกแบบที่ดีกว่าด้านบนของที่ไม่ดี

จากนั้นทำให้ ORM เกี่ยวข้องกับส่วนหน้านั้นแทนที่จะเป็นตารางจริง

สิ่งนี้ไม่ได้ทำให้การแทรกง่ายขึ้น


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

3

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

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

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

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


1

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

พูดคุยเกี่ยวกับปัญหาพื้นที่เช่นโดเมนของคุณฉันพยายามที่จะระบุรากรวม สิ่งเหล่านี้เป็นขอบเขตความมั่นคงของโดเมนของคุณ เขตแดนที่ต้องมีความมั่นคงอยู่ตลอดเวลา มวลรวมสื่อสารผ่านกิจกรรมโดเมน หากคุณมีระบบที่ใหญ่พอคุณอาจจะเริ่มแบ่งมันบนระบบย่อย (เรียกว่า SOA, Microservice, ระบบที่มีในตัวเอง ฯลฯ )

ฉันจะลองใช้ CQRS ด้วย - มันสามารถทำให้ทั้งด้านการเขียนและการอ่านของคุณง่ายขึ้นมาก อย่าลืมอ่านบทความของ Udi Dahan เกี่ยวกับหัวข้อนี้

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