সংগ্রহস্থল প্যাটার্নটি কখন ব্যবহার করবেন


20

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

আমার এ সম্পর্কে কয়েকটি প্রশ্ন রয়েছে:

  1. আপনি যদি ওআরএম পরিবর্তন করতে চান তবে আপনি কী করবেন? আপনার অ্যাপ্লিকেশনটিতে আপনার ORM নির্দিষ্ট কোডটি থাকবে যদি আপনি এটি কোনও ভাণ্ডারটিতে না রাখেন।

  2. কোনও ওআরএম ব্যবহার না করার সময় কি ভান্ডারগুলির প্যাটার্নটি এখনও বৈধ এবং আপনি নিজেই ডেটা অ্যাক্সেস এবং পপুলেট করার জন্য ADO.NET ব্যবহার করছেন?

  3. আপনি যদি কোনও ওআরএম ব্যবহার করেন তবে সংগ্রহস্থল প্যাটার্নটি নয় তবে আপনি সাধারণত ব্যবহৃত কোয়েরি কোথায় রাখবেন? প্রতিটি ক্যোয়ারিকে শ্রেণি হিসাবে উপস্থাপন করা এবং উদাহরণ তৈরির জন্য কোনও ধরণের কোয়েরি ফ্যাক্টরি যুক্ত করা কি বুদ্ধিমানের কাজ হবে?


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

এটির মূল্যের জন্য, সংগ্রহশালা / ওআরএম আলোচনার বিষয়ে আমার গ্রহণ এখানে রয়েছে: stackoverflow.com/questions/13180501/…
এরিক কিং

আপনি কোথায় পড়লেন যে এটি একটি খারাপ অভ্যাস?
ডেভ হিলিয়ার

উত্তর:


3

1) সত্য, তবে আপনি কতবার ঘন ঘন একটি ওআরএম স্যুইচ আউট করেন?
২) আমি তাই বলব, কারণ একটি ওআরএম প্রসঙ্গটি একটি ভাণ্ডারের ধরণ এবং অনুসন্ধান তৈরি, ডেটা পুনরুদ্ধার, ম্যাপিং ইত্যাদি জড়িত অনেক কাজ লুকিয়ে রাখে যদি আপনি কোনও ওআরএম ব্যবহার না করেন তবে সেই যুক্তিকে এখনও কোথাও থাকতে হবে। আমি জানি না যদিও শব্দটির কঠোরতম অর্থে এটি সংগ্রহস্থল প্যাটার্ন হিসাবে যোগ্য হবে কিনা ...
৩) এনপ্যাপুলেটিং ক্যোয়ারী এমন জিনিস যা আমি প্রায়শই দেখি, তবে এটি সাধারণত পরীক্ষার / স্টাবিংয়ের উদ্দেশ্যে আরও বেশি। এগুলি ব্যতীত, কোনও অ্যাপ্লিকেশনের বিভিন্ন অংশ জুড়ে কোনও ক্যোয়ারী পুনঃব্যবহার করার সময় আমি সতর্কতা অবলম্বন করব, কারণ তারপরে আপনি এমন কোনও বিষয়ের উপর নির্ভরশীলতা তৈরি করার ঝুঁকির সাহায্যে এন-টাইম পরিবর্তন হতে পারে (এন আপনি যেখানে কোয়েরিটি ব্যবহার করছেন এমন জায়গার সংখ্যা)।


1
1) আপনি ভুল প্রশ্ন জিজ্ঞাসা করছেন। এটি প্রায়শই একবার হওয়া উচিত নয়। উপলব্ধ ওআরএম বিকল্পগুলির সংখ্যা দেওয়া, আপনি ইতিমধ্যে ব্যবহার করছেন তার চেয়ে ভাল একটি হতে পারে। এখন প্রশ্নটি হয়ে ওঠে: আপনি যখন করেন তখন কি হয়? সংগ্রহশালা আপনাকে একটি দুর্দান্ত বিমূর্ততা দেয়। আমি সেখানে এসেছি এবং আমি আশা করি যে আমি প্রথম স্থানটিতে এমন বিমূর্ততা তৈরি করেছি।
ডিভনুল

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

ওআরএম পরিবর্তন কেবলমাত্র সংগ্রহস্থলের কারণ নয়। আপনার অ্যাপ্লিকেশনটিতে আপনাকে যদি [বিতরণ] ক্যাশে প্রবর্তন করতে হয় - সমস্ত পরিবর্তনগুলি সংগ্রহস্থলে করা হবে এবং ডেটা অ্যাক্সেস স্তর পরিবর্তনের কারণে আপনার বিএল পরিবর্তন হবে না।
ভ্যালারি

বিতরণ করা ক্যাশেটি বেশিরভাগ ক্ষেত্রে ওআরএমের মধ্যে নির্মিত হবে না?
ব্যবহারকারী 1450877

আমি মনে করি এটি ORM এর উপর নির্ভর করে। আপনি এনএইচবারনেট বা ইএফের চেয়ে হালকা ওআরএমের সাথে যাওয়ার সিদ্ধান্ত নিতে পারেন।
ভ্যালারি

2

1) আপনি ওআরএমগুলি স্যুইচআউট করতে চাইলে আপনি কী করবেন, আপনার অ্যাপ্লিকেশনটিতে নির্দিষ্ট ওআরএম কোড থাকবে যদি আপনি এটি কোনও ভান্ডারে রাখেন না।

আমি এখনও এমন অবস্থানে পৌঁছেছি না যেখানে সংস্থা হঠাৎ করে ডেটা অ্যাক্সেস প্রযুক্তি পরিবর্তন করার সিদ্ধান্ত নিয়েছিল। যদি এটি ঘটে তবে কিছু কাজ করা দরকার। আমি ইন্টারফেসের মাধ্যমে ডেটা অ্যাক্সেস অপারেশনগুলিতে প্রবণতা করি। এটি সমাধানের এক উপায় হল সংগ্রহস্থল।

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

Company.Product.Dataএবং Company.Product.Data.EntityFrameworkসমাবেশগুলি। প্রথম সমাবেশটি ইন্টারফেসের জন্য বিশুদ্ধরূপে ব্যবহৃত হবে, যখন অন্যটি সত্তা ফ্রেমওয়ার্কের ডেটা অ্যাক্সেস লজিকের একটি দৃ implementation় বাস্তবায়ন হবে।

২) কোনও ওআরএম ব্যবহার না করার সময় কি ভান্ডারগুলির প্যাটার্নটি এখনও কার্যকর আছে এবং আপনি ডেটা অ্যাক্সেস এবং অবজেক্টের ডেটা নিজেই পপুলেটিংয়ের জন্য ADO.net ব্যবহার করছেন?

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

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

এখান থেকেই প্রশ্ন এবং আদেশগুলি কার্যকর হয়।

3) আপনি যদি কোনও ওআরএম ব্যবহার করেন তবে সংগ্রহস্থল প্যাটার্নটি নয় যেখানে আপনি সাধারণত ব্যবহৃত প্রশ্নগুলি রাখেন। প্রতিটি ক্যোয়ারিকে শ্রেণি হিসাবে উপস্থাপন করা এবং উদাহরণ তৈরি করার জন্য কোনও ধরণের কোয়েরি ফ্যাক্টরি যুক্ত করা কি বুদ্ধিমানের কাজ হবে?

আমি মনে করি সংগ্রহস্থলের পরিবর্তে ক্যোয়ারী এবং কমান্ড ব্যবহার করা খুব ভাল ধারণা। আমি নিম্নলিখিতটি করি:

  • একটি প্রশ্নের জন্য ইন্টারফেস সংজ্ঞায়িত করুন। এটি আপনাকে ইউনিট পরীক্ষায় সহায়তা করবে। যেমনpublic interface IGetProductsByCategoryQuery { ... }

  • একটি প্রশ্নের জন্য কংক্রিট বাস্তবায়ন সংজ্ঞায়িত করুন। আপনি আপনার পছন্দের আইওসি কাঠামোর মাধ্যমে এগুলি ইনজেক্ট করতে সক্ষম হবেন। যেমনpublic class GetProductsByCategoryQuery : IGetProductsByCategoryQuery

এখন কয়েক ডজন দায়িত্ব নিয়ে রিপোজিটারি দূষিত করার পরিবর্তে আমি আমার প্রশ্নগুলি কেবলমাত্র নামের জায়গাগুলিতে ভাগ করে নিই। উদাহরণস্বরূপ, উপরের ক্যোয়ারির জন্য একটি ইন্টারফেস থাকতে পারে: Company.SolutionName.Products.Queriesএবং প্রয়োগটি লাইভ থাকতে পারেCompany.SolutionName.Products.Queries.Implementation

যখন ডেটা আপডেট করার বা অপসারণের বিষয়টি আসে, আমি একইভাবে কমান্ড প্যাটার্নটি ব্যবহার করি।

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


আমি জেনেরিক ফাংশন পরিবর্তে কমান্ড থাকার ধারণা পছন্দ করি। ডেটা অ্যাক্সেসের প্রসঙ্গে সেগুলি কীভাবে বাস্তবায়ন করা যায় সে সম্পর্কে আমি আরও কোথায় পড়তে পারি?
ankush981

1

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

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

আপনার প্রশ্নের উত্তর দিতে:

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

আপনাকে অন্য একটি উদাহরণ দেওয়ার জন্য, উম্ব্রাকোতে থাকা ছেলেরা ডিআই কন্টেইনারটি সরিয়ে ফেলেছে, কেবলমাত্র যদি তারা অন্য কোনও কিছুতে স্যুইচ করতে চায় might


0

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

What do you do if you want to switch out ORMs? 
You would have ORM specific code in your application if you do not contain it in a repository.

আপনার স্যুইচ করা দরকার কেন?
আপনার প্রয়োজনীয় বৈশিষ্ট্যগুলির বেশিরভাগটি ব্যবহার করা উচিত। এটা সম্ভব যে ওআরএমএক্সের একটি নতুন রিলিজ নতুন বৈশিষ্ট্য নিয়ে আসে এবং এটি বর্তমানের তুলনায় আরও ভাল হতে পারে, তবে ...
আপনি যদি এই গোপনীয়তাটি আড়াল করতে বেছে নেন তবে আপনি কেবলমাত্র সমস্ত প্রার্থীর সাধারণ বৈশিষ্ট্যই ব্যবহার করতে পারেন।
যেমন আপনি Dictionary<string, Entity>নিজের সত্তাগুলিতে সম্পত্তি ব্যবহার করতে পারবেন না কারণ ormY এগুলি পরিচালনা করতে পারে না।

ধরে নেওয়া যাক LINQ ব্যবহার করা হয়, ORM সুইচ সংখ্যাগরিষ্ঠ শুধু গ্রন্থাগার রেফারেন্স সুইচিং এবং প্রতিস্থাপন করা হয় session.Query<Foo>()সঙ্গে context.Foosবা অনুরূপ হওয়া পর্যন্ত প্রনয়ন। বিরক্তিকর কাজ, তবে বিমূর্ত স্তরটি কোডিংয়ের চেয়ে কম সময় নেয়।

Is the repository pattern still valid when not using an ORM and you are using ADO.NET for data access and populating object data yourself?

হ্যাঁ. কোডটি পুনঃব্যবহারযোগ্য হওয়া উচিত এবং এর অর্থ স্কেল বিল্ডিং, অবজেক্ট ম্যাটারিয়ালাইজেশন ইত্যাদি এক জায়গায় স্থাপন করা (পৃথক শ্রেণি)। আপনি ক্লাসটিকে "এক্সরেপোসিটরি" হিসাবে কল করতে পারেন এবং এটি থেকে একটি ইন্টারফেস বের করতে পারেন।

If you use an ORM but not the repository pattern where do you keep commonly used queries? 
Would it be wise to represent each query as a class and have some sort of query factory to create instances?

ধরেই নেওয়া লিনকিউ ব্যবহৃত হয় একটি ক্লাসের র‍্যাপার ওভারকিল আইএমএইচও হবে। একটি দুর্দান্ত উপায় হ'ল এক্সটেনশন পদ্ধতি

public static IQueryable<T> Published<T>(this IQueryable<T> source) where T : Page
{
    // at some point someone is going to forget to check that status
    // so it makes sense to extract this thing
    return source.Where(x => x.Status == Status.Published && x.PublishTime <= DateTime.UtcNow);
}

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

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