ভাবেনদের একটি বিশাল সম্প্রদায় রয়েছে যারা তাদের ডোমেনগুলি প্রয়োগ করতে সিকিউআরএস ব্যবহার করে। আমার অনুভূতিটি হ'ল, যদি আপনার ভাণ্ডারের ইন্টারফেসটি তাদের দ্বারা ব্যবহৃত সেরা অনুশীলনের সাথে সাদৃশ্যপূর্ণ হয় তবে আপনি খুব বেশি পথভ্রষ্ট হতে পারবেন না।
আমি যা দেখেছি তার উপর ভিত্তি করে ...
1) কমান্ড হ্যান্ডলাররা সাধারণত সংগ্রহস্থলের মাধ্যমে সামগ্রিক লোড করতে সংগ্রহস্থল ব্যবহার করে। কমান্ডগুলি সামগ্রীর একক নির্দিষ্ট উদাহরণকে লক্ষ্য করে; সংগ্রহস্থলটি আইডি দ্বারা মূলটি লোড করে। সেখানে আমি দেখতে পাচ্ছি না, এমন একটি ক্ষেত্রে যেখানে কমান্ডগুলি সমাহার সংগ্রহের বিরুদ্ধে পরিচালিত হয় (পরিবর্তে, আপনি প্রথমে সমাহার সংগ্রহের জন্য একটি কোয়েরি চালাবেন, তারপরে সংগ্রহটি গণনা করুন এবং প্রত্যেককে একটি আদেশ জারি করুন।
সুতরাং, আপনি যেখানে সামগ্রিক সংশোধন করতে চলেছেন সেই প্রসঙ্গে, আমি সংগ্রহস্থলটি সত্তাটি ফেরৎ প্রত্যাশা করব (উগ্র সমষ্টিগত মূল)।
2) ক্যোয়ারী হ্যান্ডলাররা মোটেও মোটাকে স্পর্শ করে না; পরিবর্তে, তারা সমষ্টিগুলির প্রাক্কলনের সাথে কাজ করে - মান অবজেক্টস যা কোনও এক সময়ে সমষ্টি / সমষ্টিগুলির অবস্থা বর্ণনা করে। সুতরাং অ্যাগ্রিগেট ডিটিওর চেয়ে প্রজেকশন ডিটিও মনে করুন এবং আপনার সঠিক ধারণা আছে have
আপনি যে সামগ্রীতে সামগ্রিকের বিরুদ্ধে অনুসন্ধান চালাচ্ছেন, এটি প্রদর্শনের জন্য প্রস্তুত করছেন এবং এই জাতীয় প্রসঙ্গে, আমি কোনও সত্তার পরিবর্তে কোনও ডিটিও বা ডিটিও সংগ্রহ ফিরে আসার প্রত্যাশা করব।
আপনার সমস্ত getCustomerByProperty
কল আমার কাছে ক্যোয়ারির মতো দেখায় তাই সেগুলি পরবর্তী বিভাগে চলে আসবে। সংগ্রহটি উত্পন্ন করতে আমি সম্ভবত একটি একক এন্ট্রি পয়েন্ট ব্যবহার করতে চাই, তাই আমি যদি তা সন্ধান করতে চাই
getCustomersThatSatisfy(Specification spec)
একটি যুক্তিসঙ্গত পছন্দ; এরপরে ক্যোয়ারি হ্যান্ডলারগুলি প্রদত্ত প্যারামিটারগুলি থেকে যথাযথ স্পেসিফিকেশন তৈরি করবে এবং সেই স্পেসিফিকেশনটি সংগ্রহস্থলের নিকটে প্রেরণ করবে। ক্ষতিটি হ'ল স্বাক্ষরটি সত্যই প্রস্তাব দেয় যে সংগ্রহস্থলটি মেমরির একটি সংগ্রহ; এটি আমার কাছে পরিষ্কার নয় যে রিপোজিটরিটি কেবল একটি সম্পর্কিত ডেটাবেসের বিরুদ্ধে এসকিউএল স্টেটমেন্ট চালানোর বিমূর্ততা হলে প্রিপিকেট আপনাকে অনেক বেশি ক্রয় করে।
যদিও কিছু নিদর্শন রয়েছে যা সাহায্য করতে পারে। উদাহরণস্বরূপ, হাত দ্বারা স্পেসিফিকেশন তৈরির পরিবর্তে, সীমাবদ্ধতার একটি বিবরণ সংগ্রহস্থলের নিকট প্রেরণ করুন এবং কী করবেন তা সিদ্ধান্ত নেওয়ার জন্য সংগ্রহস্থলের প্রয়োগের অনুমতি দিন।
সতর্কতা: জাভা টাইপ করার মতো সনাক্ত হয়েছে
interface CustomerRepository {
interface ConstraintBuilder {
void setLastName();
void setFirstName();
}
interface ConstraintDescriptor {
void copyTo(ConstraintBuilder builder);
}
List<CustomerProjection> getCustomersThatSatisfy(ConstraintDescriptor descriptor);
}
SQLBackedCustomerRepository implements CustomerRepository {
List<CustomerProjection> getCustomersThatSatisfy(ConstraintDescriptor descriptor) {
WhereClauseBuilder builder = new WhereClauseBuilder();
descriptor.copyTo(builder);
Query q = createQuery(builder.build());
//...
}
}
CollectionBackedCustomerRepository implements CustomerRepository {
List<CustomerProjection> getCustomersThatSatisfy(ConstraintDescriptor descriptor) {
PredicateBuilder builder = new PredicateBuilder();
descriptor.copyTo(builder);
Predicate p = builder.build();
// ...
}
class MatchLastName implements CustomerRepository.ConstraintDescriptor {
private final lastName;
// ...
void copyTo(CustomerRepository.ConstraintBuilder builder) {
builder.setLastName(this.lastName);
}
}
উপসংহারে: একটি সামগ্রিক সরবরাহ এবং একটি ডিটিও সরবরাহের মধ্যে পছন্দটি গ্রাহকরা এটির জন্য আপনি কী প্রত্যাশা করছেন তার উপর নির্ভর করে। আমার অনুমানটি প্রতিটি প্রসঙ্গে ইন্টারফেসকে সমর্থনকারী একটি কংক্রিট বাস্তবায়ন হবে।
GetCustomerByName('John Smith')
আপনার ডাটাবেসে বিশ জন স্মিথ থাকলে কী ফিরে আসবে ? দেখে মনে হচ্ছে আপনি দু'জনের একই নাম নেই বলে ধরে নিচ্ছেন।