উত্তর:
DAO
ডেটা অধ্যবসায়ের একটি বিমূর্ততা । বস্তুর সংগ্রহের
Repository
বিমূর্ততা ।
DAO
প্রায়শই টেবিল কেন্দ্রিক ডাটাবেসের নিকটে বিবেচনা করা হবে।
Repository
ডোমেনের কাছাকাছি বিবেচনা করা হবে, শুধুমাত্র সমষ্টিগত শিকড়গুলিতে ডিল করে।
Repository
DAO
এর ব্যবহার করে বাস্তবায়ন করা যেতে পারে তবে আপনি বিপরীতে এটি করবেন না।
এছাড়াও, একটি Repository
সাধারণত একটি সংকীর্ণ ইন্টারফেস। এটা শুধু বস্তুর একটি সংগ্রহ করা উচিত, একটি সঙ্গে Get(id)
, Find(ISpecification)
, Add(Entity)
।
এর মতো পদ্ধতিটি এটির Update
জন্য উপযুক্ত DAO
, তবে একটি নয় Repository
- একটি ব্যবহার Repository
করার সময় সত্তায় পরিবর্তনগুলি সাধারণত পৃথক ইউনিটঅফ ওয়ার্ক দ্বারা ট্র্যাক করা হত।
এটি বাস্তবায়নের নামক একটি বাস্তবায়ন দেখতে সাধারণ বলে মনে হয় Repository
যা সত্যই এর চেয়ে বেশি DAO
এবং তাই আমি মনে করি তাদের মধ্যে পার্থক্য সম্পর্কে কিছু বিভ্রান্তি রয়েছে।
ঠিক আছে, মনে করি আমি মন্তব্যগুলিতে যা রেখেছি তা আরও ভালভাবে ব্যাখ্যা করতে পারি :)। সুতরাং, মূলত, আপনি উভয়কে একই হিসাবে দেখতে পাবেন, যদিও ডিএও হ'ল সংগ্রহস্থলের চেয়ে আরও নমনীয় প্যাটার্ন। আপনি যদি উভয়ই ব্যবহার করতে চান তবে আপনি আপনার ডিএও-তে রিপোজিটরিটি ব্যবহার করবেন। আমি নীচে তাদের প্রতিটি ব্যাখ্যা করব:
এটি একটি নির্দিষ্ট ধরণের অবজেক্টের একটি ভাণ্ডার - এটি আপনাকে নির্দিষ্ট ধরণের অবজেক্টগুলির অনুসন্ধান করার পাশাপাশি সেগুলি সংরক্ষণ করার অনুমতি দেয়। সাধারণত এটি কেবল এক ধরণের অবজেক্টকে পরিচালনা করবে। যেমন AppleRepository
আপনাকে করতে দেয় AppleRepository.findAll(criteria)
বা করবে AppleRepository.save(juicyApple)
। মনে রাখবেন যে সংগ্রহশালা ডোমেন মডেল পদগুলি ব্যবহার করছে (ডিবি শর্তাদি নয় - কোথাও ডেটা কীভাবে বজায় থাকে সম্পর্কিত সম্পর্কিত কিছুই নয়)।
একটি সংগ্রহস্থল সম্ভবত সমস্ত তথ্য একই টেবিলে সংরক্ষণ করবে, যেখানে প্যাটার্নটির প্রয়োজন হয় না। যদিও এটি কেবল এক ধরণের ডেটা পরিচালনা করে তা এটিকে যৌক্তিকভাবে একটি প্রধান টেবিলের সাথে সংযুক্ত করে তোলে (যদি ডিবি অধ্যবসায় ব্যবহার করা হয়)।
ডিএও হ'ল একটি শ্রেণি যা আপনার জন্য ডেটা সনাক্ত করে (এটি বেশিরভাগ সন্ধানকারী তবে এটি সাধারণত ডেটা সংরক্ষণ করার জন্য ব্যবহৃত হয়)। প্যাটার্নটি আপনাকে একই ধরণের ডেটা সঞ্চয় করতে সীমাবদ্ধ করে না, সুতরাং আপনার সহজেই কোনও ডিএও থাকতে পারে যা সম্পর্কিত অবজেক্টগুলি সনাক্ত / সঞ্চয় করে।
যেমন আপনার কাছে সহজেই ইউজারডাও থাকতে পারে যা এর মতো পদ্ধতি প্রকাশ করে exp
Collection<Permission> findPermissionsForUser(String userId)
User findUser(String userId)
Collection<User> findUsersForPermission(Permission permission)
এগুলি সমস্ত ব্যবহারকারীর সাথে সম্পর্কিত (এবং সুরক্ষা) এবং একই ডিএওর অধীনে নির্দিষ্ট করা যেতে পারে। এটি সংগ্রহস্থলের ক্ষেত্রে নয়।
নোট করুন যে উভয় ধরণের প্রকৃতপক্ষে একই অর্থ (তারা ডেটা সংরক্ষণ করে এবং তারা এতে অ্যাক্সেসকে বিমূর্ত করে দেয় এবং তারা উভয়ই ডোমেন মডেলের নিকটে প্রকাশিত হয় এবং খুব সহজেই কোনও ডিবি রেফারেন্স থাকে) তবে তারা যেভাবে ব্যবহৃত হয় তা কিছুটা আলাদা হতে পারে, ডিএও হচ্ছে কিছুটা আরও নমনীয় / জেনেরিক, অন্যদিকে সংগ্রহস্থলটি কেবলমাত্র এক প্রকারের জন্য কিছুটা সুনির্দিষ্ট এবং সীমাবদ্ধ।
CarDescription
রয়েছে language_id
- তবে আমার এই জাতীয় কিছু করা উচিত তা পুনরুদ্ধার করতে: CarRepository.getAll(new Criteria(carOwner.id, language.id));
যা আমাকে একটি নির্দিষ্ট ভাষায় ভাষার সমস্ত গাড়ি দেবে - তা হ'ল সঠিক উপায় ?
CarRepository.findByLanguageId(language.id)
এবং আপনি কোড লিখতে হবে না, আপনি কেবল নামের সাথে একটি পদ্ধতির সাথে ইন্টারফেসটি সংজ্ঞায়িত করেন এবং স্প্রিং ডেটা আপনার জন্য ডিফল্ট বর্গ প্রয়োগ বাস্তবায়নের যত্ন নেয়। সুন্দর ঝরঝরে স্টাফ;)
findById
)। এবং আপনি ব্যবহারিকভাবে সম্পন্ন হয়েছে। তারপরে স্প্রিং ডেটা যা করে তা হ'ল এটি আপনার তৈরি করা সমস্ত ইন্টারফেসগুলি আবিষ্কার করে যা রেপোজিটরি ইন্টারফেসকে প্রসারিত করে এবং আপনার জন্য ক্লাস তৈরি করে। আপনি এই ক্লাসগুলি কখনই দেখতে পাবেন না এবং আপনি নতুন উদাহরণ তৈরি করতে সক্ষম হবেন না, তবে আপনার কেবল ইন্টারফেসটির স্বীকৃতি দিতে এবং স্প্রিংকে সেই সংগ্রহস্থলটির অবজেক্টটি সনাক্ত করতে দেওয়ার দরকার নেই।
ডিএও এবং সংগ্রহস্থল প্যাটার্ন হ'ল ডেটা অ্যাক্সেস লেয়ার (ডিএএল) প্রয়োগের উপায়। সুতরাং, প্রথমে ডাল দিয়ে শুরু করা যাক।
অবজেক্ট-ভিত্তিক অ্যাপ্লিকেশনগুলি যা একটি ডাটাবেস অ্যাক্সেস করে, ডাটাবেস অ্যাক্সেস পরিচালনা করতে অবশ্যই কিছু যুক্তি থাকতে হবে। কোডটি পরিষ্কার এবং মডিউলারে রাখার জন্য, এটি সুপারিশ করা হয় যে ডাটাবেস অ্যাক্সেস লজিককে পৃথক মডিউলে আলাদা করা উচিত। স্তরযুক্ত আর্কিটেকচারে এই মডিউলটি ডাল।
এখনও অবধি আমরা কোনও বিশেষ প্রয়োগের কথা বলিনি: কেবলমাত্র একটি সাধারণ নীতি যা পৃথক মডিউলে ডাটাবেস অ্যাক্সেস লজিক রাখে।
এখন, আমরা এই নীতিটি কীভাবে প্রয়োগ করতে পারি? ঠিক আছে, এটি বাস্তবায়নের একটি উপায়, বিশেষত হাইবারনেটের মতো ফ্রেমওয়ার্ক সহ, এটি ডিএও প্যাটার্ন।
ডিএও প্যাটার্নটি ডাল উত্পন্ন করার একটি উপায়, যেখানে সাধারণত প্রতিটি ডোমেন সত্তার নিজস্ব ডিএও থাকে। উদাহরণস্বরূপ, User
এবং UserDao
, Appointment
এবং AppointmentDao
ইত্যাদি হাইবারনেট সহ ডিএওর একটি উদাহরণ: http://gochev.blogspot.ca/2009/08/hibernate-generic-dao.html ।
তারপরে রিপোজিটরি প্যাটার্নটি কী? ডিএওর মতো, ডিপোজিটরি প্যাটার্নও ডাল অর্জনের একটি উপায় a সংগ্রহস্থল প্যাটার্নের মূল বিষয় হ'ল ক্লায়েন্ট / ব্যবহারকারীর দৃষ্টিকোণ থেকে এটি সংগ্রহ হিসাবে চেহারা বা আচরণ করা উচিত। সংগ্রহের মতো আচরণ করে যা বোঝানো হয় তা নয় যে এটির মতো ইনস্ট্যান্ট করা উচিত Collection collection = new SomeCollection()
। পরিবর্তে, এর অর্থ এটি যুক্ত করা, অপসারণ, অন্তর্ভুক্ত ইত্যাদির মতো ক্রিয়াকলাপগুলিকে সমর্থন করা উচিত Rep
অনুশীলনে, উদাহরণস্বরূপ হাইবারনেট ব্যবহারের ক্ষেত্রে, ডিএও-র মাধ্যমে সংগ্রহস্থল প্যাটার্নটি উপলব্ধি করা যায়। এটি ডালের উদাহরণ হ'ল ডিএও প্যাটার্ন এবং রিপোজিটরি প্যাটার্নের একই ক্ষেত্রে উভয়ই হতে পারে।
সংগ্রহস্থল প্যাটার্ন অগত্যা এমন কিছু নয় যা একটি ডিএও এর শীর্ষে তৈরি করে (যেমন কেউ কেউ বলতে পারে)। যদি ডিএওগুলি একটি ইন্টারফেসের সাথে ডিজাইন করা থাকে যা উপরের বর্ণিত ক্রিয়াকলাপগুলিকে সমর্থন করে তবে এটি সংগ্রহস্থল প্যাটার্নের একটি উদাহরণ। এটি নিয়ে ভাবুন, ডিএওরা যদি ইতিমধ্যে সংগ্রহের মতো ক্রিয়াকলাপ সরবরাহ করে থাকে তবে তার উপরে অতিরিক্ত স্তরের কী দরকার?
সত্যি বলতে কী, এটি প্রযুক্তিগত পার্থক্য নয়, অর্থগত পার্থক্যের মতো দেখাচ্ছে। ডেটা অ্যাক্সেস অবজেক্ট বাক্যাংশটি কোনও "ডাটাবেস" বোঝায় না। এবং, যদিও আপনি এটি ডেটাবেস কেন্দ্রিক হিসাবে নকশা করতে পারতেন, আমি মনে করি বেশিরভাগ লোকেরা তাই ডিজাইনের ত্রুটিটি করা বিবেচনা করবেন।
ডিএওর উদ্দেশ্য হ'ল ডেটা অ্যাক্সেস প্রক্রিয়াটির বাস্তবায়ন বিশদটি গোপন করা। সংগ্রহস্থলের প্যাটার্নটি কীভাবে আলাদা? আমি যতদূর বলতে পারি, তা হয় না। ডিএও-র কাছে একটি রিপোজিটরি বলা আলাদা কারণ কারণ আপনি কোনও বিষয়বস্তুর সংকলন নিয়ে / ফেরত পাঠাচ্ছেন তা সঠিক হতে পারে না; ডিএওরা অবজেক্টের সংগ্রহও ফিরিয়ে দিতে পারে।
সংগ্রহস্থল প্যাটার্ন সম্পর্কে আমি যা কিছু পড়েছি তা এই পার্থক্যের উপর নির্ভর করে: খারাপ ডিএও ডিজাইন বনাম ভাল ডিএও ডিজাইন (ওরফে সংগ্রহশালা নকশার ধরণ)।
সংগ্রহস্থলটি আরও বিমূর্ত ডোমেন ভিত্তিক শব্দ যা ডোমেন চালিত ডিজাইনের অংশ, এটি আপনার ডোমেন ডিজাইন এবং একটি সাধারণ ভাষার অংশ, ডিএও ডেটা অ্যাক্সেস প্রযুক্তির জন্য প্রযুক্তিগত বিমূর্ততা, সংগ্রহস্থল কেবলমাত্র বিদ্যমান ডেটা এবং কারখানা তৈরির জন্য পরিচালনার সাথে উদ্বেগজনক ডেটা।
এই লিঙ্কগুলি পরীক্ষা করুন:
http://warren.mayocchi.com/2006/07/27/repository-or-dao/ http://fabiomaulo.blogspot.com/2009/09/repository-or-dao-repository.html
মূল পার্থক্য হ'ল একটি সংগ্রহস্থল সামগ্রিকভাবে সামগ্রিক শিকড়গুলিতে অ্যাক্সেস পরিচালনা করে, যখন ডিএও সত্তাগুলির অ্যাক্সেস পরিচালনা করে। অতএব, এটি সাধারণ যে কোনও সংগ্রহস্থল সমষ্টিগত শিকড়গুলির প্রকৃত অধ্যবসাকে ডিএও-তে প্রেরণ করে। অতিরিক্ত হিসাবে, সামগ্রিক রুটটি অবশ্যই অন্যান্য সত্তাগুলির অ্যাক্সেস পরিচালনা করতে পারে, তারপরে অন্য ডিএওতে এই অ্যাক্সেসটি প্রেরণ করতে হতে পারে।
ডিএও ডেটাবেস / ডেটা ফাইল বা অন্য কোনও জেদী প্রক্রিয়াতে বিমূর্ততা সরবরাহ করে যাতে দৃ layer়তা স্তরটি তার প্রয়োগের বিশদটি না জেনে চালিত হতে পারে।
অন্যদিকে, সংগ্রহশালা ক্লাসে, একাধিক ডিএও ক্লাসগুলি "অ্যাপের দৃষ্টিকোণ" থেকে অপারেশন করার জন্য একটি একক সংগ্রহস্থল পদ্ধতির অভ্যন্তরে ব্যবহার করা যেতে পারে। সুতরাং, ডোমেন স্তরে একাধিক ডিএও ব্যবহার না করে এটি সম্পন্ন করার জন্য সংগ্রহস্থলটি ব্যবহার করুন। সংগ্রহশালা এমন একটি স্তর যা এতে কিছু অ্যাপ্লিকেশন যুক্তি থাকতে পারে যেমন: মেমোরি ক্যাশে ডেটা উপলব্ধ থাকলে তা ক্যাশে থেকে আনুন অন্যথায়, নেটওয়ার্ক থেকে ডেটা আনুন এবং পরের বারের পুনরুদ্ধারের জন্য এটিকে মেমোরি ক্যাশে সংরক্ষণ করুন।
সংগ্রহস্থলগুলি সু-নকশিত ডিএও ছাড়া আর কিছুই নয়।
ওআরএম টেবিল কেন্দ্রিক তবে ডিএও নয়।
ডিপিও নিজেই ওআরএম সংগ্রহস্থল / সত্তা বা যে কোনও ডএএল সরবরাহকারীর সাথে ঠিক একই কাজ করতে পারে সেহেতু ডিপোজিটরিতে বেশ কয়েকটি ডিএও ব্যবহার করার দরকার নেই, 1 টেবিল, 2 টেবিল, এন টেবিল, আধ টেবিল, একটি ওয়েব পরিষেবা, একটি টেবিল এবং একটি ওয়েব পরিষেবা ইত্যাদি পরিষেবাগুলি বেশ কয়েকটি ডিএও / সংগ্রহস্থল ব্যবহার করে।
আমার নিজের ডিএও, ধরা যাক কারডাও কেবল কার ডিটিওর সাথে লেনদেন করে, আমি বলতে চাইছি, কেবল কার ডিটিওকে ইনপুটটিতে নিয়ে যান এবং কেবলমাত্র গাড়ী ডিটিও বা আউটপুটে গাড়ি ডিটিও সংগ্রহ সংগ্রহ করুন।
রিপোজিটরির মতোই, ডিএও প্রকৃতপক্ষে একটি আইওসি, ব্যবসার যুক্তির জন্য, অবিচলিত ইন্টারফেসকে অধ্যবসায় কৌশল বা লিগ্যাসির দ্বারা ভয় দেখাতে না দেয়। ডিএও উভয়ই অধ্যবসায় কৌশলটি সংযুক্ত করে এবং ডোমেন-সম্পর্কিত অধ্যবসায় ইন্টারফেস সরবরাহ করে। রিপোজিটরি তাদের জন্য কেবল একটি অন্য শব্দ যারা বুঝতে পারেন নি যে একটি ভাল সংজ্ঞায়িত ডিএও প্রকৃত সত্যটি কী।
নিম্নলিখিত পরিস্থিতিতে ডিএও বা রেপোজিটরি প্যাটার্নটি সর্বাধিক প্রযোজ্য কিনা তা জানার চেষ্টা করুন: কল্পনা করুন আপনি বিভিন্ন ধরণের ডেটা উত্স যেমন আরডিবিএমএস, এলডিএপি, ওওডিবি, এক্সএমএল সংগ্রহস্থল এবং একটি ধ্রুবক ব্যবস্থার জন্য অভিন্ন ডেটা অ্যাক্সেস এপিআই সরবরাহ করতে চান তা কল্পনা করুন and ফ্ল্যাট ফাইল।
আগ্রহী হলে নীচের লিঙ্কগুলিকেও উল্লেখ করুন:
http://www.codeinsanity.com/2008/08/repository-pattern.html
http://blog.fedecarg.com/2009/03/15/domain-driven-design-the-repository/
http://devlicio.us/blogs/casey/archive/2009/02/20/ddd-the-repository-pattern.aspx
খুব সাধারণ বাক্যে: উল্লেখযোগ্য পার্থক্য হ'ল রিপোজিটরিগুলি সংগ্রহগুলি উপস্থাপন করে, যদিও ডিএওগুলি ডাটাবেসের নিকটে থাকে, প্রায়শই অনেক বেশি টেবিলকেন্দ্রিক হয়।
বসন্ত কাঠামোয়, সংগ্রহশালা নামে একটি টীকা রয়েছে এবং এই টীকাটির বর্ণনায়, সংগ্রহশালা সম্পর্কে দরকারী তথ্য রয়েছে, যা আমি মনে করি এটি এই আলোচনার জন্য দরকারী।
ইঙ্গিত করে যে কোনও টীকাগুলি শ্রেণি একটি "রিপোজিটরি", মূলত ডোমেন-ড্রাইভড ডিজাইন (ইভান্স, 2003) দ্বারা সংজ্ঞায়িত করা হয়েছে "স্টোরেজ, পুনরুদ্ধার, এবং অনুসন্ধানের আচরণ যা বস্তুর সংগ্রহকে অনুকরণ করে" এর ব্যবস্থা হিসাবে ""
"ডেটা অ্যাক্সেস অবজেক্ট" এর মতো traditionalতিহ্যবাহী জাভা EE নিদর্শনগুলি প্রয়োগকারী টিমগুলি ডিএও ক্লাসগুলিতেও এই স্টেরিওটাইপ প্রয়োগ করতে পারে, যদিও এটি করার আগে ডেটা অ্যাক্সেস অবজেক্ট এবং ডিডিডি-স্টাইলের সংগ্রহগুলির মধ্যে পার্থক্য বুঝতে যত্ন নেওয়া উচিত। এই টিকাটি একটি সাধারণ-উদ্দেশ্যগত স্টেরিওটাইপ এবং পৃথক দলগুলি তাদের শব্দার্থবিজ্ঞানগুলি সংকীর্ণ করতে এবং যথাযথ হিসাবে ব্যবহার করতে পারে।
পার্সিস্টিএক্সসেপশন ট্রান্সলেশনপোস্টপ্রোসেসরের সাথে একত্রে ব্যবহৃত হলে স্প্রিং ডেটা অ্যাক্সেসএক্সেপশন অনুবাদের জন্য এই জাতীয়ভাবে বর্ণিত একটি শ্রেণি উপযুক্ত। সরঞ্জামযুক্তকরণ, দিকগুলি ইত্যাদির লক্ষ্যে সামগ্রিক প্রয়োগ আর্কিটেকচারে তার ভূমিকা সম্পর্কে এনটেটেড শ্রেণিটিও স্পষ্ট করা হয়েছে
IRepository
ইন্টারফেসটি প্রয়োগ করবে । আপনি চাইবেন আপনার সংগ্রহস্থলটি প্রয়োগের ক্ষেত্রে ডিএও'র ব্যবহার করবে। মনে রাখবেন, একটি ডিএও প্রতি টেবিলের অবজেক্ট হবে, যেখানে কোনও সংগ্রহস্থলকে প্রায়শই সর্বদা একক সত্ত্বা তৈরি করতে একাধিক ডিএও ব্যবহার করতে হবে। যদি আপনি এটি দেখতে পান না যে, আপনার সংগ্রহস্থল এবং সত্ত্বাকে কেবল একটি টেবিল অ্যাক্সেস করতে হবে তবে আপনি সম্ভবত একটি রক্তাল্পতা ডোমেন তৈরি করছেন।