সংগ্রহস্থল প্যাটার্ন বনাম ডএল


93

তারা একই জিনিস? সবেমাত্র রব কনারির স্টোরফ্রন্ট টিউটোরিয়ালটি দেখার জন্য শেষ হয়েছে এবং তারা মনে হয় এটি একই রকম টেকনিক্স। মানে আমি যখন ডাল অবজেক্টটি প্রয়োগ করি তখন আমার কাছে getStuff, যোগ / মুছুন ইত্যাদি পদ্ধতি রয়েছে এবং আমি সর্বদা ইন্টারফেসটি প্রথমে লিখি যাতে আমি পরে ডিবি পরিবর্তন করতে পারি।

আমি কি জিনিস গুলিয়ে ফেলছি?

উত্তর:


88

আপনি অবশ্যই সেই জিনিস নন যিনি বিষয়গুলিকে বিভ্রান্ত করেন। :-)

আমি মনে করি যে প্রশ্নের উত্তর আপনি কতটা পিউরিস্ট হতে চান তার উপর নির্ভর করে।

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

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

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

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

public interface IRepository : IDisposable
{
    T[] GetAll<T>();
    T[] GetAll<T>(Expression<Func<T, bool>> filter);
    T GetSingle<T>(Expression<Func<T, bool>> filter);
    T GetSingle<T>(Expression<Func<T, bool>> filter, List<Expression<Func<T, object>>> subSelectors);
    void Delete<T>(T entity);
    void Add<T>(T entity);
    int SaveChanges();
    DbTransaction BeginTransaction();
}

এটি কি ডাল বা একটি ভান্ডার? এই ক্ষেত্রে আমি এটি উভয় অনুমান।

কিম


4
এখানে পার্টিতে দেরি হয়ে গেছে, তবে কেন টি [], তালিকা <টি> (বা অনুরূপ) নয়?
মাইক কিংসকোট

27
সম্ভবত আইনিউমেবল <টি> সেরা হবে।
ভেনেমো

9
বা আইকোয়্যারেবল <T>
কেনওয়ারার

4
আমি মনে করি আইকিউয়েরেবল <T> সেরা পছন্দ হবে, কারণ এটি আপনাকে পদ্ধতিগুলি শৃঙ্খলাবদ্ধ করতে এবং ডেটাবেসকে সমস্ত কাজ করার অনুমতি দেওয়ার জন্য স্থগিতাদেশ দেয়।
0lukasz0

4
@ উর্ধ্বগামী আমি মনে করি আইকিউয়েরেবল <T> ফিরিয়ে দেওয়া বিমূর্ততা ফাঁস করে। আপনার ভান্ডার থেকে ডোমেন অবজেক্টগুলি ফিরিয়ে দেওয়া উচিত।
ম্যাথু

42

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

একটি সংগ্রহস্থলটি ডাল হতে পারে তবে এটি ডালের সামনেও বসে ব্যবসায়ের অবজেক্ট স্তর এবং ডেটা স্তরের মধ্যে একটি সেতু হিসাবে কাজ করতে পারে। যা বাস্তবায়ন ব্যবহৃত হয় তা প্রকল্পের থেকে শুরু করে পরিবর্তিত হতে চলেছে।


23

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


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

এনজি, ধন্যবাদ! আমি এটি সেভাবে দেখতে শুরু করেছি, তবে এটি এটি পরিষ্কার করে দেয়। আমি সব ডিডিডি সাহিত্য পড়া শুরু করতে হবে!
ডেভিড

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

12

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

  • বিভিন্ন পরামিতি সহ নির্দিষ্টকরণের সংজ্ঞাগুলি পুনরায় ব্যবহার করুন ,
  • নিপূণভাবে বিদ্যমান স্পেসিফিকেশন দৃষ্টান্ত 'পরামিতি (যেমন বিশেষজ্ঞ করা),
  • তাদের একত্রিত করুন,
  • কোনও ডাটাবেস অ্যাক্সেস না করেই তাদের উপর ব্যবসায়িক যুক্তি সম্পাদন করুন,
  • এবং অবশ্যই ইউনিট-পরীক্ষা তাদের বাস্তব সংগ্রহস্থল বাস্তবায়ন থেকে পৃথক করে।

আমি এমনকি এতদূর গিয়েও বলতে পারি যে যদি রেপোজিটরি প্যাটার্নটি স্পেসিফিকেশন প্যাটার্নের সাথে একসাথে ব্যবহার না করা হয় তবে এটি সত্যই "সংগ্রহস্থল" নয়, তবে একটি ডাল। সিউডো-কোডের একটি অনুমোদিত উদাহরণ:

specification100 = new AccountHasMoreOrdersThan(100)
specification200 = new AccountHasMoreOrdersThan(200)

assert that specification200.isSpecialCaseOf(specification100)

specificationAge = new AccountIsOlderThan('2000-01-01')

combinedSpec = new CompositeSpecification(
    SpecificationOperator.And, specification200, specificationAge)

for each account in Repository<Account>.GetAllSatisfying(combinedSpec)
    assert that account.Created < '2000-01-01'
    assert that account.Orders.Count > 200

বিস্তারিত জানতে ফাউলারের স্পেসিফিকেশন প্রবন্ধটি দেখুন (এটি আমি উপরের ভিত্তিতে ভিত্তি করেছিলাম)।

একটি ডালের মতো বিশেষ পদ্ধতি রয়েছে have

IoCManager.InstanceFor<IAccountDAO>()
    .GetAccountsWithAtLeastOrdersAndCreatedBefore(200, '2000-01-01')

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

.NET সালে LINQ প্রশ্নের করতে একটি উপায় উল্লেখ বাস্তবায়ন, কিন্তু স্পেসিফিকেসন (এক্সপ্রেশন) মিশ্রন হিসাবে একটি গৃহজাত সমাধান সঙ্গে যেমন মসৃণ নাও হতে পারে। এর জন্য কিছু ধারণা এই এসও প্রশ্নে বর্ণিত হয়েছে ।


2

আমার ব্যক্তিগত মতামতটি হ'ল এটি ম্যাপিংয়ের ক্ষেত্রেই রয়েছে, দেখুন: http://www.martinfowler.com/eaaGGG.re/repository.html । সুতরাং সংগ্রহস্থল থেকে আউটপুট / ইনপুট হ'ল ডোমেন অবজেক্টস, যা ডালের উপর কিছু হতে পারে। আমার জন্য এটি একটি গুরুত্বপূর্ণ সংযোজন / সীমাবদ্ধতা, যেহেতু আপনি কোনও ডাটাবেস / পরিষেবা / যা আলাদা লেআউটের সাথে যা-ই হোক না কেনের জন্য একটি সংগ্রহস্থল প্রয়োগ করতে পারেন এবং ম্যাপিংয়ের ক্ষেত্রে মনোনিবেশ করার জন্য আপনার স্পষ্ট জায়গা রয়েছে have আপনি যদি এই সীমাবদ্ধতাটি ব্যবহার না করে এবং অন্য কোথাও ম্যাপিং না রাখেন, তবে ডেটা উপস্থাপনের বিভিন্ন উপায়ে কোডটি যে জায়গায় পরিবর্তন করা উচিত নয় সেগুলিতে প্রভাব ফেলতে পারে।


1

এটি সমস্ত ব্যাখ্যা এবং প্রসঙ্গে। এগুলি খুব মিল বা প্রকৃতপক্ষে খুব আলাদা হতে পারে তবে সমাধান যতক্ষণ কাজ করে না ততক্ষণ একটি নাম কী!


1

বাহ্যিক বিশ্বে (যেমন ক্লায়েন্ট কোড) ভান্ডারগুলি DAL এর সমান, ব্যতীত:

(1) এটি সন্নিবেশ / আপডেট / মুছতে পদ্ধতিগুলি প্যারামিটার হিসাবে ডেটা ধারক বস্তু হিসাবে সীমাবদ্ধ।

(২) রিড অপারেশনের জন্য এটি ডাল (উদাহরণস্বরূপ গেটবাইপিকে) বা অ্যাডভান্সড স্পেসিফিকেশনের মতো সাধারণ স্পেসিফিকেশন নিতে পারে।

অভ্যন্তরীণভাবে এটি আসল সিআরইউডি অপারেশন সম্পাদনের জন্য ডেটা ম্যাপার স্তর (উদাহরণস্বরূপ সত্তা ফ্রেমওয়ার্ক প্রসঙ্গ ইত্যাদি) সাথে কাজ করে।

সংগ্রহস্থল প্যাটার্নটির অর্থ কী নয়: -

এছাড়াও, আমি প্রায়শই সন্নিবেশ / আপডেট / মুছে ফেলা পদ্ধতিগুলি সন্নিবেশ / আপডেট / মুছে ফেলা পদ্ধতিগুলি যা ডাটাবেসে সন্নিবেশ করানো / আপডেট / মুছে ফেলার পদ্ধতিগুলি সম্পাদন করে সেগুলি সঞ্চার / আপডেট / মুছুন পদ্ধতিগুলির পাশাপাশি সংগ্রহস্থল প্যাটার্ন নমুনা বাস্তবায়ন হিসাবে পৃথক সংরক্ষণ পদ্ধতি থাকতে বিভ্রান্ত হতে দেখেছি। আমাদের কাছে কোনও সঞ্চয়ী পদ্ধতিতে অবশ্যই সেভ পদ্ধতি থাকতে পারে তবে মেমোরি সিইউডি (তৈরি করুন, আপডেট করুন, মুছুন) এবং অধ্যবসায় পদ্ধতিগুলি (যা ডাটাবেসে প্রকৃত লিখন / পরিবর্তন অপারেশন সম্পাদন করে) পৃথকীকরণের জন্য रिपॉিজিটরির দায়িত্ব নয়, তবে ইউনিট অফ ওয়ার্ক প্যাটার্নের দায়িত্ব।

আশাকরি এটা সাহায্য করবে!


1

সংগ্রহস্থল হ'ল একটি প্যাটার্ন, কোডটি আমরা যেমন পারি তার পুনঃব্যবহার করার জন্য মানক পদ্ধতিতে এটি প্রয়োগ করার একটি উপায়।


1

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


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

0

আমি যা বুঝি সেগুলি থেকে তারা মূলত একই জিনিসটি বোঝাতে পারে - তবে নামকরণ প্রসঙ্গের ভিত্তিতে পরিবর্তিত হয়।

উদাহরণস্বরূপ, আপনার কাছে ডাল / দাও ক্লাস থাকতে পারে যা একটি আইআরপোসিটরি ইন্টারফেস প্রয়োগ করে।

ডাল / দাও একটি ডেটা স্তর শব্দ; আপনার অ্যাপ্লিকেশনটির উচ্চ স্তরগুলি ভাণ্ডারগুলির ক্ষেত্রে বিবেচনা করে।


0

সুতরাং বেশিরভাগ (সাধারণ) ক্ষেত্রে ডিএও হ'ল সংগ্রহস্থলটির প্রয়োগ?

যতদূর আমি বুঝতে পেরেছি, দেখে মনে হচ্ছে ডিএও ডিবি অ্যাক্সেসের সাথে সুনির্দিষ্টভাবে কাজ করে (সিআরইউডি - যদিও কোনও নির্বাচন করে না!)) রিপোজিটরি আপনাকে পুরো ডেটা অ্যাক্সেসকে বিমূর্ত করার অনুমতি দেয়, সম্ভবত একাধিক ডিএওর (সম্ভবত বিভিন্ন ডেটা উত্স) ফ্যাকাস হতে পারে।

আমি কি সঠিক পথে আছি?


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

0

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

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