แอปพลิเคชันบริการเรียกฟังก์ชันฐานข้อมูลชั้น สถาปัตยกรรมไม่ดี?


11

สถานการณ์:

  • สแต็ค: Java, Spring, Hibernate
  • รุ่น: แอปพลิเคชันไคลเอนต์ - เซิร์ฟเวอร์
  • รูปแบบ: Model-View-Controller (MVC)

คลาส Service Layer มีพฤติกรรมสามอย่าง:

  1. บริการบางอย่างมีกฎเกณฑ์ทางธุรกิจภายในวิธีการและมอบสิทธิ์ให้กับแอปพลิเคชัน ชอบ:

    EntityManager.save (นิติบุคคล);

  2. บริการบางอย่างเรียกฟังก์ชันฐานข้อมูล (ผ่านพารามิเตอร์) ไลค์:

    CallableStatement cls = con.prepareCall ("{เรียก databaseFunction (args)}");

  3. บริการบางอย่างมีวิธีการที่มีทั้งพฤติกรรม

คำถามของฉัน:

  1. มีปัญหาในการรับสายบริการโดยตรงหรือไม่ - ฟังก์ชั่นฐานข้อมูล? นี่ถือว่าเป็นการกระทำที่ไม่ดีหรือไม่? แบบจำลองสถาปัตยกรรมจะใช้กับโครงการเช่นนี้ได้อย่างไร
  2. มีปัญหาใดบ้างหรือไม่ที่มีการผสมผสานพฤติกรรมในบริการเดียวกัน เช่นการทำธุรกรรมและความสอดคล้อง?
  3. ในกรณีของการบำรุงรักษาการห่อหุ้มนี้ทำให้ผู้พัฒนาไม่ชัดเจนว่าเขาควรเปลี่ยนฟังก์ชั่นในฐานข้อมูลหรือไม่? จะหลีกเลี่ยงสิ่งนี้ได้อย่างไร
  4. สถานการณ์นี้เกิดขึ้นในแอปพลิเคชันอื่น ๆ ทั่วโลกหรือเป็นเพียงข้อผิดพลาดทางสถาปัตยกรรมหรือไม่?

คำถามนี้คล้ายกัน แต่ไม่เหมือนกัน .. softwareengineering.stackexchange.com/questions/180012/
Jon Raynor

คำตอบ:


7

มีปัญหาในการรับสายบริการโดยตรงหรือไม่ - ฟังก์ชั่นฐานข้อมูล? นี่ถือว่าเป็นการกระทำที่ไม่ดีหรือไม่?

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

แบบจำลองสถาปัตยกรรมจะใช้กับโครงการเช่นนี้ได้อย่างไร

ดูความคิดเห็นด้านล่าง

มีปัญหาใดบ้างหรือไม่ที่มีการผสมผสานพฤติกรรมในบริการเดียวกัน เช่นการทำธุรกรรมและความสอดคล้อง?

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

ในกรณีของการบำรุงรักษาการห่อหุ้มนี้ทำให้ผู้พัฒนาไม่ชัดเจนว่าเขาควรเปลี่ยนฟังก์ชั่นในฐานข้อมูลหรือไม่?

แน่นอนมันทำ

จะหลีกเลี่ยงสิ่งนี้ได้อย่างไร

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

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

ฉันคิดว่าในโลกของเราทุกอย่างเกิดขึ้น;)


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

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

1
+1 สำหรับบรรทัดนั้นฉันคิดว่าในโลกของเราทุกอย่างเกิดขึ้น;)
linuxunil

@linuxunil SRP ควรได้รับการเคารพในทุกระดับของสถาปัตยกรรม ในกรณีของฉันฉันหมายถึง SRP ที่ระดับบริการไม่ใช่ระดับวิธี @ JimmyJames Yep ORMs ส่วนใหญ่ทำงานได้ไม่ดีกับขั้นตอนการจัดเก็บ แต่บางครั้งจำเป็นต้องมีกระบวนการจัดเก็บ
Vladislav Rastrusny

3

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

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

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

ข้อดีของการใช้รูปแบบการออกแบบและ ORM คือความสามารถในการอ่านรหัสของคุณในการห่อหุ้มความรับผิดชอบดังนั้นหากการเข้าถึงฐานข้อมูลของคุณเปลี่ยนเลเยอร์ธุรกิจของคุณไม่ควรเปลี่ยนแปลงมากนัก


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

นี่เป็นหนึ่งในหลักการที่มั่นคงใช่ไหม
J. Pichardo

3
ไม่ได้ "S" ใน SOLID คือS- ingle Responsibility Principal (SRP) แต่การแยกข้อกังวลที่คุณแนะนำคือเหตุผลที่ถูกต้องสำหรับการแยกตรรกะบริการจากตรรกะการเข้าถึงข้อมูล คำตอบอื่น ๆ โดย Vladislav กล่าวถึงหลักการความรับผิดชอบเดี่ยว ตรงไปตรงมา SRP และการแยกความกังวลเข้าด้วยกันได้ดีเช่นไวน์และชีส
เกร็ก Burghardt
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.