এমবিসি মডেলটি ডিবি থেকে আলগাভাবে জুড়ে রাখা?


9

আমি আমার কোডটিকে টেস্টেবল রাখতে চাই এবং আমার বর্তমান এমভিসি কাঠামোর জন্য নির্ভরতা-ইনজেকশন কৌশলটি অনুসরণ করার সিদ্ধান্ত নিয়েছি, যা অবশ্যই স্বচ্ছভাবে যুগল কোড, টেস্টিবিলিটি এবং সামঞ্জস্যতা নিশ্চিত করার একটি দুর্দান্ত উপায় হিসাবে প্রমাণিত হয়েছে।

তবে ডিজাইনের ধরণগুলিতে একজন মাস্টার থেকে দূরে থাকা হিসাবে, আমার মডেলগুলিকে যতটা সম্ভব ডাটাবেস সংযোগকারী ক্লাস থেকে স্বচ্ছলভাবে মিলিয়ে রাখার একটি ভাল উপায় খুঁজে বের করার আমার পক্ষে শক্ত সময়।

কীভাবে এটি করা যায়?
যেহেতু আমি এই প্রশ্নের পাশাপাশি কোনও শারীরিক কোড সরবরাহ করিনি, আমি সত্যিই এমন কিছু যুক্তি / কোড উদাহরণ বা তথ্যকে প্রশংসা করব যা উপরের বর্ণিত সমস্যাটি বোঝার জন্য আমাকে নির্দেশ করতে পারে।


এই প্রশ্নটি সফ্টওয়্যার ইঞ্জিনিয়ারিং সম্পর্কিত , কারণ এটি এই বিষয়টির কাঠামোগত বিষয়ে চিন্তাভাবনা এবং চিন্তাভাবনা সম্পর্কে আরও বেশি, কোডের সাথে এটি প্রয়োগ করার চেয়ে বেশি।
লাসে ভি কার্লসেন

উত্তর:


6

একটি উপায় হ'ল আপনি নিজের ডেটাবেস ডিজাইন করার আগে আপনার মডেলগুলি ডিজাইন করুন। আপনার মডেলগুলি ডিজাইন করার সময়, সমস্যা ডোমেনের মধ্যে ব্যবসায়িক যুক্তি এবং অর্থগুলি ক্যাপচারের দিকে মনোনিবেশ করা হয়। এটি এমনভাবে ধরা পড়তে হবে যা কেবল সত্ত্বা এবং ডেটা ক্ষেত্রের চেয়ে আরও বেশি ব্যবসায়ের সাথে ব্যবসায়ের সার্থক করে তোলে। কিছু ডেটা উপাদানগুলি অন্যের কাছ থেকে ব্যাখ্যা করা হয়, কিছু অন্যের উপর নির্ভরশীল ইত্যাদি Additionally অতিরিক্তভাবে আপনি এই মডেলটিতে আপনার প্রয়োজনীয় কোনও মৌলিক যুক্তি যুক্ত করতে চাইবেন যেমন কোনও নির্দিষ্ট উপাদান একটি নির্দিষ্ট মানকে সেট করা হলে কোনও বস্তু অভ্যন্তরীণভাবে কীভাবে প্রতিক্রিয়া দেখায়।

এটি সম্পূর্ণরূপে সম্ভবতঃ আপনি এমন ডেটা শেষ করবেন যা 90 +% অভিন্ন যা আপনি কীভাবে ডেটা টিকিয়ে রাখেন সমান। সেটা ঠিক আছে. এটি মিলিত না হয়ে সম্পূর্ণ অভিন্ন হতে পারে।

আরও নোট করুন যে সত্যের অধ্যবসায়ের অজ্ঞতার কুয়াশায় ডোমেনটির মডেলিং করা সফ্টওয়্যার ডিজাইনের জন্য কিছুটা পবিত্র গ্রেইল। আপনি যদি এটি করতে পারেন, দুর্দান্ত। তবে যদি সমস্যা ডোমেনটি একেবারে তাৎপর্যপূর্ণ হয় এবং এতে কোনও জটিলতা থাকে তবে আপনি আঁকেননি তা নিশ্চিত করার জন্য ডেটা অধ্যবসায় পরীক্ষা করার জন্য সময়ে সময়ে ডোমেন মডেলিং থেকে পিছিয়ে পড়া এখনও ভাল ধারণা still নিজেকে একটি কোণায়।

বিভিন্ন উপাদানগুলির প্রকৃত ভূমিকা কেবল মনে রাখবেন এবং আপনি যখন সেগুলি ডিজাইন করেন তখন সেই ভূমিকাগুলি পৃথক করে রাখুন। প্রদত্ত কোনও ডিজাইনের সিদ্ধান্তের জন্য, নিজেকে জিজ্ঞাসা করুন যে এই ভূমিকাগুলির কোনওটি লঙ্ঘিত হয়েছে:

  1. ডাটাবেস - ডেটা সংরক্ষণ করুন, ডেটার অখণ্ডতা বজায় করুন, বিশ্রামে ডেটা বজায় রাখুন।
  2. মডেলগুলি - ব্যবসায়ের যুক্তি ধারণ করে, সমস্যা ডোমেনকে মডেল করুন, গতিতে ডেটা বজায় রাখুন, ব্যবসায়-স্তরের ইভেন্টগুলিতে প্রতিক্রিয়া দিন ইত্যাদি
  3. দর্শন - ব্যবহারকারীদের কাছে উপাত্ত উপস্থাপন করুন, ব্যবহারকারী-পক্ষের যুক্তি সম্পাদন করুন (মডেলগুলিতে সত্যিকারের বৈধকরণের আগে বুনিয়াদি বৈধতা ইত্যাদি)।
  4. কন্ট্রোলার - ব্যবহারকারীর ইভেন্টগুলিতে প্রতিক্রিয়া জানান, মডেলগুলিতে নিয়ন্ত্রণ পাস, রুটের অনুরোধ এবং প্রত্যাবর্তনের প্রতিক্রিয়া।

হাই ডেভিড. আপনার ব্যাপক জবাবের জন্য ধন্যবাদ! উচ্চ স্তরের আলগা কাপলিংগুলি বজায় রাখার সময় আপনি কীভাবে মডেলগুলি একটি ডাটাবেস সংযোজকের সাথে সংযুক্ত করবেন?
শিল্প

1
@ ইন্ডাস্ট্রিয়াল: অধ্যবসায় মডেলগুলিকে সংযুক্ত করার বিভিন্ন উপায় রয়েছে তবে এখন পর্যন্ত আমি একমাত্র পদ্ধতি খুঁজে পেয়েছি যা সত্যই উদ্বেগকে পৃথক করার জন্য আমার ইচ্ছাটিকে সন্তুষ্ট করে তা হ'ল ডাল দ্বারা বাহ্যিকভাবে প্রয়োগ করা ডোমেনে রিপোজিটরি ইন্টারফেসগুলি। সংগ্রহস্থল পদ্ধতি ডোমেন মডেলগুলি গ্রহণ এবং ফিরিয়ে দেয় এবং অভ্যন্তরীণভাবে সেগুলি এবং যে কোনও উত্পন্ন ডাটাবেস সত্তার মধ্যে রূপান্তর করে। (সত্যি বলতে কি, আমি পিএইচপি তে খুব বেশি কিছু করি নি।) সুতরাং আপনি আপনার সমস্ত ডিবি সিআরইউডি ইত্যাদি স্বয়ংক্রিয়ভাবে তৈরি করতে ডাল কাঠামো ব্যবহার করতে পারেন এবং তারপরে আপনার স্টোর এবং আপনার মডেলগুলির মধ্যে একটি ইন্টারফেস হিসাবে আপনার সংগ্রহস্থলগুলি লিখতে পারেন।
ডেভিড

@ ইন্ডাস্ট্রিয়াল: উদাহরণস্বরূপ, আপনি যদি একটি ওআরএম ব্যবহার করেন, তবে সেই ওআরএম আপনার ডাল দ্বারা প্রেরণ করা হবে (যা ডোমেন মডেলগুলি থেকে বিচ্ছিন্ন) এবং সেই অনুসারে আপনার মডেলগুলিকে ডেটা অ্যাক্সেসে রূপান্তরিত করে। অথবা আপনি যদি ম্যানুয়াল এসকিউএল দিয়ে সরাসরি ডাটাবেস অ্যাক্সেস করেন তবে আপনি এটি আপনার ডালের সংগ্রহস্থল পদ্ধতিতে করতে এবং এসকিউএল কোয়েরিগুলির ফলাফলগুলিকে ফেরত দেওয়ার আগে ডোমেন মডেলগুলিতে অনুবাদ করবেন।
ডেভিড

@ ইন্ডাস্ট্রিয়াল: এও মনে রাখবেন যে সংগ্রহস্থলগুলির পদ্ধতিগুলি কেবল সিআরইউডি হওয়া উচিত নয়। প্রচুর বুদ্ধি সেই কোডটিতে বেক করা যায়। আরও জটিল জটিলগুলির মধ্যে অনেকগুলি অভ্যন্তরীণ কোড থাকতে পারে যা ডাটাবেস থেকে ডেটা পরিবর্তন করে। অথবা, যদি জটিলগুলি ডাটাবেসে অনেকগুলি ট্রিপগুলিতে জড়িত থাকে তবে কার্য সম্পাদনের জন্য আপনি যুক্তিকে একটি সঞ্চিত পদ্ধতিতে রাখতে পারেন এবং ডাল পদ্ধতিটি কেবল সেই পদ্ধতির মধ্য দিয়ে যায় এবং ফলাফলগুলিকে মডেলগুলিতে অনুবাদ করে।
ডেভিড

হাই ডেভিড! এই উত্তরের জন্য আপনাকে আবার ধন্যবাদ জানাতে চেয়েছিলাম। অবশ্যই স্ট্যাকএক্সচেঞ্জে আমি সেরাটি পেয়েছি!
শিল্প

2

আপনি দুটি জিনিস রাখতে চান।

  1. আপনার মডেলগুলি (ডিবিএল-এর অ্যাক্সেসর এবং অ্যাপ্লিকেশনটির বেশিরভাগ যুক্তি দিয়ে)।
  2. আপনার "ডোমেন মডেলগুলি" ওরফে ডেটা সত্তা, এটি আপনার সিস্টেমের সত্ত্বাকে যেমন ব্যবহারকারী, পোস্ট, পণ্য ইত্যাদি প্রতিনিধিত্ব করে

    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();
    }

সেখানে এটি আপনার রয়েছে, এটি কীভাবে আপনি ডোমেন মডেল তৈরি করেন (সত্তা) এবং এমবিসি মডেলগুলি ডিবি সংযোগ এবং ডেটা ম্যানিপুলেশন করে।

আপনি যদি ভাবছেন যে পিপিআই কী, "পিপিআই ফ্রেমওয়ার্ক" এর জন্য গুগল।

আপনার সন্ধানের সাথে সৌভাগ্য কামনা করছি।

শুভেচ্ছা, পল ড্রাগনস।


1

মনে রাখবেন, এমভিসি ছোট-ছোট ডালপথে উত্থিত হয়েছিল, যার সমস্ত বিষয়গুলির জন্য স্বয়ংক্রিয়ভাবে অধ্যবসায় রয়েছে। সুতরাং এমভিসি প্যাটার্ন মডেল / জেদী পৃথকীকরণের জন্য কোনও সমাধান নির্ধারণ করে না।

আমার পছন্দটি হ'ল একটি "রিপোজিটরি" অবজেক্ট সরবরাহ করা যা কীভাবে জানে যে কীভাবে মডেল অবজেক্টগুলি ডেটাবেস থেকে তৈরি করতে এবং মডেল অবজেক্টগুলিকে ডাটাবেসে সংরক্ষণ করতে পারে। তারপরে মডেল দৃistence়তা সম্পর্কে কিছুই জানেন না। কিছু ব্যবহারকারীর ক্রিয়াকলাপটি যদিও সেভকে ট্রিগার করতে হবে, তাই সম্ভবত এটি নিয়ন্ত্রকটি সংগ্রহস্থল সম্পর্কে জানতে পারে। নিয়ন্ত্রককে সংগ্রহস্থল থেকে সংগ্রহ করতে না দেওয়ার জন্য আমি সাধারণত কিছুটা নির্ভরশীল ইনজেকশন ব্যবহার করি।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.