এটি আপনার প্রশ্নের অধীনে আমার প্রাথমিক মন্তব্যের আরও সুসংহত প্রতিলিপি। ওপি দ্বারা সম্বোধিত প্রশ্নের উত্তরগুলি এই উত্তরটির নীচে পাওয়া যাবে। এছাড়াও দয়া করে একই জায়গায় অবস্থিত গুরুত্বপূর্ণ নোটটি পরীক্ষা করে দেখুন ।
সিপো, আপনি বর্তমানে যা বর্ণনা করছেন তা হ'ল ডিজাইনের ধরণ যা অ্যাক্টিভ রেকর্ড । সবকিছুর মতোই, এমনকি এটি প্রোগ্রামারদের মধ্যেও এর জায়গাটি খুঁজে পেয়েছে তবে এক সাধারণ কারণে, স্কেলাবিলিটির জন্য সংগ্রহস্থল এবং ডেটা ম্যাপার প্যাটার্নগুলির পক্ষে ফেলে দেওয়া হয়েছে ।
সংক্ষেপে, একটি সক্রিয় রেকর্ড হ'ল একটি অবজেক্ট, যা:
- আপনার ডোমেনের কোনও অবজেক্টকে উপস্থাপন করে (ব্যবসায়ের বিধিগুলি অন্তর্ভুক্ত করে, কীভাবে কোনও বস্তুর উপর নির্দিষ্ট ক্রিয়াকলাপ পরিচালনা করতে হয় তা জানে, যেমন আপনি যদি কোনও ব্যবহারকারীর নাম পরিবর্তন করতে পারেন বা করতে পারেন না),
- কীভাবে সত্তাটি পুনরুদ্ধার, আপডেট, সংরক্ষণ এবং মুছতে হয় তা জানে।
আপনি আপনার বর্তমান ডিজাইনটি নিয়ে বেশ কয়েকটি সমস্যা সমাধান করেছেন এবং আপনার নকশার মূল সমস্যাটি শেষ, 6th ষ্ঠ, পয়েন্টে বর্ণিত হয়েছে (শেষ কিন্তু কমপক্ষে নয়, আমার ধারণা)। যখন আপনার একটি ক্লাস থাকে যার জন্য আপনি কনস্ট্রাক্টর ডিজাইন করছেন এবং আপনি জানেন না যে কন্সট্রাক্টরের কী করা উচিত, ক্লাসটি সম্ভবত কিছু ভুল করছে। আপনার ক্ষেত্রে এটি ঘটেছে।
তবে সত্তার প্রতিনিধিত্ব এবং সিআরইউডি যুক্তিযুক্তিকে দুটি (বা আরও) শ্রেণিতে বিভক্ত করে নকশাটি ঠিক করা আসলে বেশ সহজ।
আপনার ডিজাইনটি এখন দেখতে দেখতে এটি:
Employee
- এতে কর্মচারী কাঠামো (তার বৈশিষ্ট্যগুলি) এবং কীভাবে সত্তাটি পরিবর্তন করতে হবে সম্পর্কিত পদ্ধতিগুলি (যদি আপনি পরিবর্তনীয় পদ্ধতিতে যাওয়ার সিদ্ধান্ত নেন) সম্পর্কিত তথ্য রয়েছে Employee
, সত্তার জন্য সিআরইউডি যুক্তি রয়েছে , Employee
বস্তুর একটি তালিকা ফিরে আসতে পারে, Employee
আপনি যখন চান তখন কোনও বস্তু গ্রহণ করে একজন কর্মী আপডেট করুন, Employee
একটি পদ্ধতির মাধ্যমে একটি একক ফিরে আসতে পারেনgetSingleById(id : string) : Employee
বাহ, ক্লাসটি বিশাল মনে হচ্ছে।
এটি প্রস্তাবিত সমাধান হবে:
Employee
- এতে কর্মচারী কাঠামো (তার বৈশিষ্ট্যগুলি) এবং সত্তাকে কীভাবে পরিবর্তন করতে হয় সে সম্পর্কে তথ্য রয়েছে (যদি আপনি পরিবর্তনীয় পথে যাওয়ার সিদ্ধান্ত নেন)
EmployeeRepository
- Employee
সত্তার জন্য সিআরইউডি যুক্তিযুক্ত রয়েছে , Employee
অবজেক্টের একটি তালিকা ফিরিয়ে দিতে পারে, Employee
যখন আপনি কোনও কর্মচারী আপডেট করতে চান তখন কোনও বস্তু গ্রহণ করে, Employee
কোনও পদ্ধতির মাধ্যমে কোনও একক ফেরত দিতে পারেনgetSingleById(id : string) : Employee
উদ্বেগ বিচ্ছিন্ন হওয়ার কথা শুনেছেন ? না, আপনি এখন করবেন। এটি একক দায়িত্বের নীতিমালার কম কঠোর সংস্করণ, যা বলে যে কোনও শ্রেণীর আসলেই কেবল একটি দায়িত্ব থাকা উচিত, বা চাচা বব যেমন বলেছেন:
একটি মডিউল পরিবর্তনের এক এবং একমাত্র কারণ থাকতে হবে।
এটি পুরোপুরি স্পষ্ট যে আমি যদি আপনার প্রাথমিক শ্রেণিকে পরিষ্কারভাবে দুটিতে ভাগ করতে সক্ষম হয়েছি যা এখনও ভাল বৃত্তাকার ইন্টারফেস রয়েছে তবে প্রাথমিক শ্রেণি সম্ভবত খুব বেশি করছিল এবং তা ছিল।
সংগ্রহস্থল প্যাটার্নটি সম্পর্কে কী দুর্দান্ত, এটি কেবল ডাটাবেসের মধ্যে মাঝারি স্তর সরবরাহ করার জন্য বিমূর্ততা হিসাবে কাজ করে না (যা কিছু ফাইল, নোএসকিউএল, এসকিউএল, অবজেক্ট-ওরিয়েন্টেড হতে পারে), তবে এটি কংক্রিট হওয়ারও প্রয়োজন নেই not বর্গ। অনেক ওও ভাষায়, আপনি ইন্টারফেসটিকে একটি আসল interface
(বা আপনি যদি সি ++ তে থাকেন তবে খাঁটি ভার্চুয়াল পদ্ধতি সহ একটি শ্রেণি) হিসাবে সংজ্ঞা দিতে পারেন এবং তারপরে একাধিক বাস্তবায়ন থাকতে পারে।
এটি কোনও সংগ্রহস্থল প্রকৃত বাস্তবায়ন কিনা আপনি interface
কীওয়ার্ডের সাথে কোনও কাঠামোর উপর নির্ভর করে কেবল ইন্টারফেসের উপর নির্ভর করছেন কিনা তা পুরোপুরি সিদ্ধান্তটি সরিয়ে দেয় । এবং সংগ্রহস্থলটি হ'ল এটি, ডেটা লেয়ার বিমূর্তনের জন্য অভিনব শব্দ, যথা আপনার ডোমেনে ডেটা ম্যাপিং এবং তদ্বিপরীত।
এটিকে (কমপক্ষে) দুটি শ্রেণিতে বিভক্ত করার আরেকটি দুর্দান্ত বিষয় হ'ল এখন Employee
ক্লাসটি স্পষ্টভাবে তার নিজস্ব ডেটা পরিচালনা করতে পারে এবং এটি খুব ভালভাবে করতে পারে, কারণ এটি অন্যান্য কঠিন জিনিসের যত্ন নেওয়ার প্রয়োজন হয় না।
প্রশ্ন 6: সুতরাং নতুন তৈরি করা Employee
ক্লাসে কনস্ট্রাক্টরকে কী করা উচিত ? এটা সহজ. এটি আর্গুমেন্ট গ্রহণ করা উচিত, সেগুলি বৈধ কিনা তা পরীক্ষা করা উচিত (যেমন কোনও বয়স সম্ভবত নেতিবাচক হওয়া উচিত নয় বা নাম খালি হওয়া উচিত নয়), ডেটা অবৈধ হওয়ার সময় একটি ত্রুটি উত্থাপন করুন এবং যদি বৈধতাটি পাস করা হয়েছে তবে ব্যক্তিগত ভেরিয়েবলগুলিকে যুক্তিগুলি বরাদ্দ করুন সত্তার। এটি এখন ডাটাবেসের সাথে যোগাযোগ করতে পারে না, কারণ এটি কীভাবে এটি করা যায় তার কোনও ধারণা নেই।
প্রশ্ন 4: মোটেই উত্তর দেওয়া যায় না, সাধারণত হয় না, কারণ উত্তরটি আপনার প্রয়োজনের উপর নির্ভর করে depends
প্রশ্ন 5: এখন যেহেতু আপনি দুটি স্ফীত বর্গ পৃথক, আপনি সরাসরি একাধিক আপডেটের পদ্ধতি থাকতে পারে Employee
বর্গ, মত changeUsername
, markAsDeceased
, ডাটা নিপূণভাবে করবে Employee
বর্গ শুধুমাত্র RAM- র মধ্যে এবং তারপর আপনি যেমন একটি পদ্ধতি প্রবর্তন পারে registerDirty
থেকে সংগ্রহস্থল শ্রেণিতে কাজের প্যাটার্নের ইউনিট , যার মাধ্যমে আপনি সংগ্রহস্থলটিকে জানাতে পারবেন যে এই বস্তুটির বৈশিষ্ট্যগুলি পরিবর্তিত হয়েছে এবং commit
পদ্ধতিটি কল করার পরে আপনাকে আপডেট করতে হবে ।
স্পষ্টতই, কোনও আপডেটের জন্য কোনও অবজেক্টের একটি আইডি থাকা দরকার এবং এটি ইতিমধ্যে সংরক্ষণ করা উচিত এবং মানদণ্ড পূরণ না হলে এটি সনাক্ত করতে এবং ত্রুটি বাড়াতে সংগ্রহস্থলের প্রতিক্রিয়াশীলতা।
প্রশ্ন 3: আপনি যদি ইউনিট অফ ওয়ার্কের প্যাটার্নটি নিয়ে যাওয়ার সিদ্ধান্ত নেন create
তবে এখন পদ্ধতিটি হবে registerNew
। আপনি যদি না করেন তবে আমি সম্ভবত এটির save
পরিবর্তে কল করব । একটি সংগ্রহস্থলের লক্ষ্য হ'ল ডোমেন এবং ডেটা স্তরগুলির মধ্যে বিমূর্ততা সরবরাহ করা, যার কারণে আমি আপনাকে সুপারিশ করব যে এই পদ্ধতিটি (এটি হোক registerNew
বা save
) Employee
বস্তুটি গ্রহণ করে এবং এটি রেপোজিটরি ইন্টারফেস প্রয়োগকারী শ্রেণীর উপর নির্ভর করে, যা গুণাবলী তারা সত্তা থেকে সরিয়ে নেওয়ার সিদ্ধান্ত নেয়। একটি সম্পূর্ণ অবজেক্ট পাস করা ভাল তাই আপনার অনেকগুলি alচ্ছিক পরামিতি থাকতে হবে না।
প্রশ্ন 2: উভয় পদ্ধতিই এখন ভান্ডার ইন্টারফেসের অংশ হয়ে যাবে এবং তারা একক দায়িত্বের নীতি লঙ্ঘন করে না। সংগ্রহস্থলের দায়িত্ব হ'ল Employee
বস্তুগুলির জন্য CRUD ক্রিয়াকলাপ সরবরাহ করা , এটি যা করে তা (পড়ুন এবং মুছুন ছাড়াও, CRUD ক্রিয়েট এবং আপডেট উভয় অনুবাদ করে) tes স্পষ্টতই, আপনি আরও EmployeeUpdateRepository
অনেক কিছু চালিয়ে রেজিস্ট্রিটি আরও বিভক্ত করতে পারেন , তবে এটি খুব কমই প্রয়োজন হয় এবং একক বাস্তবায়নে সাধারণত সমস্ত সিআরইউডি অপারেশন থাকতে পারে।
প্রশ্ন 1: আপনি একটি সাধারণ Employee
ক্লাস দিয়ে শেষ করেছেন যা এখন (অন্যান্য বৈশিষ্ট্যের মধ্যে) আইডি থাকবে। আইডিটি পূরণ null
হয়েছে কিনা তা খালি (বা ) অবজেক্টটি ইতিমধ্যে সংরক্ষণ করা হয়েছে কিনা তার উপর নির্ভর করে। তবুও, একটি আইডি হ'ল সত্তার মালিকানাধীন একটি বৈশিষ্ট্য এবং সত্তার দায়িত্ব Employee
তার বৈশিষ্ট্যগুলির যত্ন নেওয়া, সুতরাং এটির আইডি যত্ন নেওয়া।
কোনও সত্তা আইডি না রাখে বা না থাকুক না কেন সাধারণত আপনি এটিতে কিছুটা অধ্যবসায়-যুক্তি করার চেষ্টা করেন তা বিবেচনা না করে। 5 নম্বরের উত্তরে উল্লিখিত হিসাবে, এটি ইতিমধ্যে সংরক্ষণের দায়িত্ব যা আপনি ইতিমধ্যে সংরক্ষণ করা কোনও সত্তা সংরক্ষণ করার চেষ্টা করছেন না বা কোনও আইডি ছাড়াই কোনও সত্তাকে আপডেট করার চেষ্টা করছেন না তা সনাক্ত করা is
গুরুত্বপূর্ণ তথ্য
দয়া করে সচেতন থাকুন যে উদ্বেগের বিভাজনটি দুর্দান্ত তবে বাস্তবে একটি কার্যকরী ভাণ্ডার স্তর নকশা করা বেশ ক্লান্তিকর কাজ এবং আমার অভিজ্ঞতায় সক্রিয় রেকর্ড পদ্ধতির চেয়ে সঠিক হওয়া কিছুটা বেশি কঠিন। তবে আপনি একটি নকশা শেষ করতে পারেন যা অনেক বেশি নমনীয় এবং স্কেলযোগ্য, যা ভাল জিনিস হতে পারে।
Employee
বিমূর্ততা প্রদানের জন্য একটি অবজেক্ট গ্রহণ করা উচিত , প্রশ্নসমূহ ৪ এবং ৫. সাধারণত অপ্রয়োজনীয় হয়, আপনার প্রয়োজনের উপর নির্ভর করে এবং যদি আপনি কাঠামো এবং সিআরইউডি অপারেশনগুলিকে দুটি শ্রেণিতে বিভক্ত করেন, তবে এটি বেশ স্পষ্টভাবে জানা যায় যে, নির্মাণকারীরEmployee
ডেটা আনতে পারে না ডিবি থেকে আর, যাতে উত্তর 6.