ওওপি সম্প্রদায়ের মধ্যে বিস্তৃত চুক্তি দেখা যাচ্ছে যে শ্রেণি নির্মাতাকে কোনও বিষয় আংশিক বা পুরোপুরি অস্বীকার করা উচিত নয়।
"আরম্ভ" বলতে আমি কী বুঝি? মোটামুটিভাবে বলতে গেলে, পারমাণবিক প্রক্রিয়া যা নতুনভাবে তৈরি করা একটি বস্তুকে এমন একটি রাজ্যে নিয়ে আসে যেখানে এর সমস্ত শ্রেণীর আগ্রাসন থাকে। এটি প্রথম জিনিসটি হওয়া উচিত যা কোনও বস্তুর সাথে ঘটে, (এটি কেবল প্রতিটি বস্তুতে একবার চালানো উচিত) এবং কোনও অ-আরম্ভীকৃত বস্তু ধরে রাখার অনুমতি দেওয়া উচিত নয়। (এইভাবে ক্লাস কনস্ট্রাক্টরে অবজেক্ট ইনিশিয়ালেশন সম্পাদন করার জন্য প্রায়শই পরামর্শ the একই কারণে,
Initialize
পদ্ধতিগুলি প্রায়শই ভ্রূণ হয়, কারণ এগুলি পরমাণুটিকে পৃথক করে দেয় এবং এটি কোনও অবজেক্টকে ধরে রাখা এবং ব্যবহার সম্ভব করে তোলে যা এখনও অবধি নেই is একটি সংজ্ঞায়িত অবস্থায়।)
সমস্যা: যখন সিকিউআরএস ইভেন্ট সোর্সিং (সিকিউআরএস + ইএস) এর সাথে একত্রিত হয়, যেখানে কোনও বস্তুর সমস্ত রাষ্ট্রীয় পরিবর্তন ইভেন্টের ক্রমযুক্ত ক্রম (ইভেন্ট স্ট্রিম) এ ধরা পড়ে, তখন আমি অবাক হয়েই থাকি যখন কোনও বস্তু আসলে পুরোপুরি-প্রাথমিক অবস্থায় পৌঁছায়: ক্লাস কন্সট্রাক্টর শেষে, নাকি প্রথম ইভেন্টটির পরে অবজেক্টে প্রয়োগ করা হয়েছে?
দ্রষ্টব্য: আমি "সমষ্টিগত মূল" শব্দটি ব্যবহার করা থেকে বিরত রয়েছি। আপনি যদি পছন্দ করেন তবে আপনি যখনই "অবজেক্ট" পড়েন তখন এটিকে বিকল্প দিন।
আলোচনার উদাহরণ: ধরুন যে প্রতিটি বস্তু স্বতন্ত্রভাবে কিছু অস্বচ্ছ Id
মান দ্বারা চিহ্নিত করা হয়েছে (জিইউডি ভাবেন)। ইভেন্ট স্টোরের মধ্যে সেই সামগ্রীর স্টেটের পরিবর্তনের প্রতিনিধিত্বকারী একটি ইভেন্ট স্ট্রিম একই Id
মান দ্বারা চিহ্নিত করা যেতে পারে : (আসুন সঠিক ইভেন্ট ক্রমের বিষয়ে চিন্তা করবেন না))
interface IEventStore
{
IEnumerable<IEvent> GetEventsOfObject(Id objectId);
}
আরও ধরে নিন যে দুটি বস্তুর ধরণ রয়েছে Customer
এবং ShoppingCart
। আসুন এতে ফোকাস করুন ShoppingCart
: তৈরি করার সময় শপিং কার্টগুলি খালি থাকে এবং অবশ্যই এক গ্রাহকের সাথে যুক্ত থাকতে হবে। শেষ বিটটি একটি শ্রেণির আক্রমণকারী: একটি ShoppingCart
অবজেক্ট যা কোনওটির সাথে সম্পর্কিত নয় তা Customer
অবৈধ অবস্থায় রয়েছে।
Traditionalতিহ্যবাহী ওওপি-তে, কেউ এটি নির্মাণকারীর মধ্যে মডেল করতে পারে:
partial class ShoppingCart
{
public Id Id { get; private set; }
public Customer Customer { get; private set; }
public ShoppingCart(Id id, Customer customer)
{
this.Id = id;
this.Customer = customer;
}
}
তবে আমি কী ক্ষতির মধ্যে আছি যে কীভাবে পিছিয়ে পড়া শুরু না করে সিকিউআরএস + ইএস-এ এটি মডেল করা যায়। যেহেতু এই সাধারণ সূচনাটি কার্যকরভাবে একটি রাষ্ট্রীয় পরিবর্তন, তাই এটি কী কোনও ইভেন্ট হিসাবে মডেলিং করতে হবে না?:
partial class CreatedEmptyShoppingCart
{
public ShoppingCartId { get; private set; }
public CustomerId { get; private set; }
}
// Note: `ShoppingCartId` is not actually required, since that Id must be
// known in advance in order to fetch the event stream from the event store.
স্পষ্টতই কোনও ShoppingCart
বস্তুর ইভেন্টের প্রবাহের এটি প্রথম ইভেন্ট হতে হবে এবং ইভেন্টটি প্রয়োগ হওয়ার পরে that অবজেক্টটি কেবলমাত্র আরম্ভ করা হবে।
সুতরাং যদি সূচনাটি ইভেন্ট স্ট্রিম "প্লেব্যাক" এর অংশ হয়ে যায় (এটি একটি খুব জেনেরিক প্রক্রিয়া যা সম্ভবত একইরকম কাজ করবে, কোনও Customer
বস্তু বা কোনও ShoppingCart
অবজেক্টের জন্য বা অন্য কোনও অবজেক্টের ক্ষেত্রে এটিই হোক ...)
- কনস্ট্রাক্টরটি কি প্যারামিটার-কম হওয়া উচিত এবং কিছু না করে সমস্ত কাজ কিছু
void Apply(CreatedEmptyShoppingCart)
পদ্ধতিতে ফেলে রাখা (যা অনেকটা একইসাথেInitialize()
)? - অথবা কনস্ট্রাক্টরের কোনও ইভেন্ট স্ট্রিম গ্রহণ করা উচিত এবং এটিকে আবার খেলানো উচিত (যা আবার সূচনাকে পারমাণবিক করে তোলে, তবে এর অর্থ প্রতিটি শ্রেণীর কনস্ট্রাক্টরের একই জেনেরিক "প্লে ব্যাক অ্যান্ড অ্যাপ্লিকেশন" লজিক থাকে, অর্থাৎ অযাচিত কোড ডুপ্লিকেশন)?
- অথবা উভয় এমন একটি traditional তিহ্যবাহী ওওপি নির্মাণকারী (উপরে বর্ণিত হিসাবে) থাকা উচিত যা সঠিকভাবে বস্তুটি আরম্ভ করে, এবং তারপরে সমস্ত ইভেন্টগুলি প্রথমে এর সাথে
void Apply(…)
যুক্ত হয়?
আমি সম্পূর্ণরূপে কার্যকরী ডেমো বাস্তবায়ন সরবরাহের উত্তর আশা করি না; আমি ইতিমধ্যে খুব খুশি যদি কেউ যেখানে আমার যুক্তি ত্রুটিপূর্ণ হয়, অথবা কিনা বস্তুর আরম্ভের সত্যিই ব্যাখ্যা হতে পারে হতে চাই হয় একটি "ব্যথা পয়েন্ট" সবচেয়ে CQRS + + ইএস বাস্তবায়নের হবে।
Initialize
পদ্ধতি) দখল করে নিয়েছিল। এটি আমাকে প্রশ্নের দিকে নিয়ে যায়, আপনার এমন কারখানাটি দেখতে কেমন হতে পারে?