การรักษาโมเดล MVC ไว้อย่างหลวม ๆ จากฐานข้อมูลหรือไม่


9

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

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

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


คำถามนี้อยู่ในวิศวกรรมซอฟต์แวร์เนื่องจากเป็นเรื่องเกี่ยวกับโครงสร้างและความคิดเกี่ยวกับหัวข้อนี้มากกว่าที่จะเกี่ยวกับการนำไปใช้ในโค้ด
Lasse V. Karlsen

คำตอบ:


6

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

เป็นไปได้อย่างสิ้นเชิงว่าคุณจะได้พบกับบางสิ่งที่ 90 +% เหมือนกับที่คุณได้รับการยืนยันข้อมูล ไม่เป็นไร. มันสามารถเหมือนกันอย่างสมบูรณ์โดยไม่ต้องเป็นคู่

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

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

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

สวัสดีเดวิด ขอบคุณสำหรับการตอบกลับที่กว้างขวางของคุณ! ในขณะที่ยังคงรักษาข้อต่อหลวมในระดับสูงคุณจะเชื่อมต่อโมเดลกับตัวเชื่อมต่อฐานข้อมูลได้อย่างไร
อุตสาหกรรม

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

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

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

สวัสดีเดวิด! แค่อยากจะขอบคุณอีกครั้งสำหรับคำตอบนี้ แน่นอนหนึ่งในดีที่สุดที่ฉันได้รับใน StackExchange!
อุตสาหกรรม

2

คุณต้องการมีสองสิ่ง

  1. รุ่นของคุณ (อุปกรณ์เข้าถึง DBAL และใช้ตรรกะส่วนใหญ่ของแอป)
  2. "แบบจำลองโดเมน" ของคุณหรือที่รู้จักกันใน Data Entities สิ่งเหล่านี้แสดงถึงเอนทิตีของระบบของคุณเช่นผู้ใช้โพสต์ผลิตภัณฑ์ ฯลฯ

    class PPI_Model_User {
    
        protected $_conn = null;
    
        function __construct(array $options = array()) {
            if(isset($options['dsnData'])) {
                $this->_conn = new PPI_DataSource_PDO($options['dsnData']);
            }
        }
    
        function getAll() {
            $rows = $this->_connect->query("SELECT .....")->fetchAll();
            $users = array();
            foreach($rows as $row) {
                $users[] = new PPI_Entity_User($row);
            }
            return $users;
        }
    
    }
    

รหัสการใช้งาน

    $model = new PPI_Model_User(array('dsnData' => $dsnData));
    $users = $model->getAll();
    foreach($users as $user) {
        echo $user->getFirstName();
    }

ที่นั่นคุณมีแล้วนั่นคือวิธีที่คุณสร้างโมเดลโดเมน (เอนทิตี) และมีโมเดล MVC ที่ทำการเชื่อมต่อฐานข้อมูลและการจัดการข้อมูล

หากคุณสงสัยว่า PPI คืออะไรให้ google สำหรับ "PPI Framework"

ขอให้โชคดีกับการค้นหาของคุณ

ขอแสดงความนับถือ Paul Dragoonis


1

โปรดจำไว้ว่า MVC เกิดขึ้นใน smalltalk ซึ่งมีการคงอยู่โดยอัตโนมัติสำหรับวัตถุทั้งหมด ดังนั้นรูปแบบ MVC จึงไม่ได้กำหนดวิธีการแก้ปัญหาสำหรับการแยกแบบจำลอง / การคงอยู่

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

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