আমি এখন থেকে প্রায় 8 বছর ধরে ডোমেন-চালিত ডিজাইনটি রূপান্তর করছি এবং এত বছর পরেও এখনও একটি জিনিস আছে, যা আমাকে বাগিয়ে দিচ্ছে। এটি কোনও ডোমেন অবজেক্টের বিপরীতে ডেটা স্টোরেজে অনন্য রেকর্ডের জন্য অনুসন্ধান করছে।
২০১৩ সালের সেপ্টেম্বরে মার্টিন ফোলার টেলডোনটঅ্যাস্ক নীতিটি উল্লেখ করেছিলেন , যা সম্ভব হলে সমস্ত ডোমেন অবজেক্টে প্রয়োগ করা উচিত, যা একটি বার্তা ফেরত পাঠানো উচিত, কীভাবে অপারেশনটি চলেছিল (অবজেক্ট-ওরিয়েন্টেড ডিজাইনে এটি বেশিরভাগ ব্যতিক্রমের মধ্য দিয়ে করা হয়, যখন অপারেশন ব্যর্থ হয়েছিল)।
আমার প্রকল্পগুলি সাধারণত অনেকগুলি ভাগে বিভক্ত হয়, যেখানে তাদের দুটি ডোমেন (ব্যবসায়িক বিধি এবং অন্য কিছুই থাকে না, ডোমেনটি সম্পূর্ণ অধ্যবসায়-অজ্ঞ)। পরিষেবাগুলি CRUD ডেটাতে ব্যবহৃত রেপোজিটরি স্তর সম্পর্কে জানত।
যেহেতু কোনও সামগ্রীর সাথে সম্পর্কিত কোনও গুণাবলীর স্বতন্ত্রতা একটি ডোমেন / ব্যবসায়িক নিয়ম, এটি ডোমেন মডিউল থেকে দীর্ঘ হওয়া উচিত, সুতরাং নিয়মটি যেখানে এটি হওয়ার কথা ঠিক ঠিক সেখানেই হয়।
রেকর্ডের স্বতন্ত্রতা পরীক্ষা করতে সক্ষম হওয়ার জন্য, আপনাকে বর্তমান ডেটাসেট, সাধারণত একটি ডাটাবেস, জিজ্ঞাসা করতে হবে, এটির জন্য একটি রেকর্ড Name
ইতিমধ্যে উপস্থিত রয়েছে কিনা তা খুঁজে বের করতে হবে ।
ডোমেন স্তর বিবেচনা করা অধ্যবসায় অজ্ঞ এবং এটি কীভাবে তথ্য পুনরুদ্ধার করতে পারে তবে কীভাবে কেবল তাদের উপর ক্রিয়াকলাপ চালানো যায় সে সম্পর্কে কোনও ধারণা নেই, এটি সত্যিকার অর্থেই সংগ্রহস্থলগুলিকে স্পর্শ করতে পারে না।
আমি তখন নকশাটি খাপ খাইয়েছি এমন দেখায়:
class ProductRepository
{
// throws Repository.RecordNotFoundException
public Product GetBySKU(string sku);
}
class ProductCrudService
{
private ProductRepository pr;
public ProductCrudService(ProductRepository repository)
{
pr = repository;
}
public void SaveProduct(Domain.Product product)
{
try {
pr.GetBySKU(product.SKU);
throw Service.ProductWithSKUAlreadyExistsException("msg");
} catch (Repository.RecordNotFoundException e) {
// suppress/log exception
}
pr.MarkFresh(product);
pr.ProcessChanges();
}
}
এটি ডোমেন স্তরের চেয়ে ডোমেনের নিয়মগুলি সংজ্ঞায়িত করে এমন পরিষেবাগুলির দিকে পরিচালিত করে এবং আপনার কোডের একাধিক বিভাগে বিধি ছড়িয়ে দেওয়া আপনার বিধি রয়েছে।
আমি টেলডোনটঅ্যাস্ক নীতিটি উল্লেখ করেছি, কারণ আপনি স্পষ্ট দেখতে পাচ্ছেন যে পরিষেবাটি একটি ক্রিয়াকলাপ সরবরাহ করে (এটি হয় Product
একটি ব্যতিক্রম বাঁচায় বা ছুঁড়ে ফেলে) তবে পদ্ধতির অভ্যন্তরে আপনি পদ্ধতিগত পদ্ধতির সাহায্যে অবজেক্টগুলিতে অপারেশন করছেন।
সুস্পষ্ট সমাধান হ'ল Domain.ProductCollection
একটি Add(Domain.Product)
পদ্ধতি নিক্ষেপ করে একটি ক্লাস তৈরি করা ProductWithSKUAlreadyExistsException
, তবে এটির কার্যকারিতা অনেকটাই অভাব, কারণ কোডের সন্ধানের জন্য আপনার সমস্ত পণ্য ডেটা স্টোরেজ থেকে সংগ্রহ করতে হবে, কোনও পণ্য ইতিমধ্যে একই এসকিউ রয়েছে কিনা তা খুঁজে বের করতে হবে would আপনি যে পণ্যটি যুক্ত করার চেষ্টা করছেন তা হিসাবে।
আপনি ছেলেরা কীভাবে এই নির্দিষ্ট সমস্যাটি সমাধান করবেন? এটি সত্যিই প্রতি সমস্যা নয়, আমার কয়েক বছরের জন্য পরিষেবা স্তরটি ডোমেনের কিছু নিয়মের প্রতিনিধিত্ব করেছে। পরিষেবা স্তরটি সাধারণত আরও জটিল ডোমেন ক্রিয়াকলাপ পরিবেশন করে, আমি কেবল ভাবছি যে আপনি আপনার ক্যারিয়ারের সময় আরও ভাল, আরও কেন্দ্রীভূত, সমাধানের উপর ঝাঁপিয়ে পড়েছেন কিনা।