আমি নিজেকে ডিডিডি বিশেষজ্ঞ হিসাবে বিবেচনা করি না তবে সমাধান আর্কিটেক্ট হিসাবে যখনই সম্ভব সম্ভব সেরা অনুশীলনগুলি প্রয়োগ করার চেষ্টা করব do আমি জানি ডিডিডি-তে নো (পাবলিক) সেটার "স্টাইল" এর প্রো এবং কনসের চারপাশে প্রচুর আলোচনা রয়েছে এবং আমি যুক্তির উভয় দিক দেখতে পাচ্ছি। আমার সমস্যাটি হ'ল আমি দক্ষতা, জ্ঞান এবং অভিজ্ঞতার বিস্তৃত বৈচিত্র সহ একটি দলে কাজ করি যার অর্থ যে প্রতিটি বিকাশকারী "সঠিক" উপায়ে কাজ করবে তা আমি বিশ্বাস করতে পারি না। উদাহরণস্বরূপ, যদি আমাদের ডোমেন অবজেক্টগুলি এমনভাবে ডিজাইন করা হয় যাতে কোনও পদ্ধতির মাধ্যমে অবজেক্টের অভ্যন্তরীণ অবস্থার পরিবর্তন হয় তবে জনসাধারণের সম্পত্তি সেটার সরবরাহ করা হয় তবে কেউ পদ্ধতিটি কল করার পরিবর্তে সম্পত্তি অনিবার্যভাবে সেট করবে। এই উদাহরণটি ব্যবহার করুন:
public class MyClass
{
public Boolean IsPublished
{
get { return PublishDate != null; }
}
public DateTime? PublishDate { get; set; }
public void Publish()
{
if (IsPublished)
throw new InvalidOperationException("Already published.");
PublishDate = DateTime.Today;
Raise(new PublishedEvent());
}
}
আমার সমাধানটি সম্পত্তি সেটটারগুলিকে ব্যক্তিগত করা হয়েছে যা সম্ভব, কারণ আমরা যে ওআরএম অবজেক্টগুলিকে হাইড্রেট করতে ব্যবহার করছি তা প্রতিবিম্ব ব্যবহার করে যাতে এটি ব্যক্তিগত সেটটারগুলিতে অ্যাক্সেস করতে সক্ষম হয়। যাইহোক, ইউনিট পরীক্ষা লেখার চেষ্টা করার সময় এটি একটি সমস্যা উপস্থাপন করে। উদাহরণস্বরূপ, যখন আমি একটি ইউনিট পরীক্ষা লিখতে চাই যা প্রয়োজনীয়তা যা আমরা পুনরায় প্রকাশ করতে পারি না তা যাচাই করে, আমার অবশ্যই এটি ইঙ্গিত করতে হবে যে অবজেক্টটি ইতিমধ্যে প্রকাশিত হয়েছে। আমি অবশ্যই দুবার প্রকাশকে কল করে এটি করতে পারি, তবে তারপরে আমার পরীক্ষাটি ধরে নেওয়া হচ্ছে যে প্রথম কলের জন্য প্রকাশটি সঠিকভাবে প্রয়োগ করা হয়েছে। কিছুটা দুর্গন্ধযুক্ত মনে হচ্ছে।
আসুন নীচের কোডটি দিয়ে দৃশ্যকে আরও কিছুটা বাস্তব-জগতে পরিণত করুন:
public class Document
{
public Document(String title)
{
if (String.IsNullOrWhiteSpace(title))
throw new ArgumentException("title");
Title = title;
}
public String ApprovedBy { get; private set; }
public DateTime? ApprovedOn { get; private set; }
public Boolean IsApproved { get; private set; }
public Boolean IsPublished { get; private set; }
public String PublishedBy { get; private set; }
public DateTime? PublishedOn { get; private set; }
public String Title { get; private set; }
public void Approve(String by)
{
if (IsApproved)
throw new InvalidOperationException("Already approved.");
ApprovedBy = by;
ApprovedOn = DateTime.Today;
IsApproved = true;
Raise(new ApprovedEvent(Title));
}
public void Publish(String by)
{
if (IsPublished)
throw new InvalidOperationException("Already published.");
if (!IsApproved)
throw new InvalidOperationException("Cannot publish until approved.");
PublishedBy = by;
PublishedOn = DateTime.Today;
IsPublished = true;
Raise(new PublishedEvent(Title));
}
}
আমি ইউনিট পরীক্ষা লিখতে চাই যা যাচাই করে:
- দস্তাবেজটি অনুমোদিত না হলে আমি প্রকাশ করতে পারি না
- আমি কোনও দস্তাবেজ পুনরায় প্রকাশ করতে পারি না
- প্রকাশিত হলে প্রকাশিত ও প্রকাশিত মানগুলি যথাযথভাবে সেট করা থাকে
- প্রকাশিত হলে প্রকাশিত ইভেন্টটি উত্থাপিত হয়
সেটারগুলিতে অ্যাক্সেস না করে, আমি পরীক্ষাগুলি সম্পাদনের জন্য প্রয়োজনীয় বস্তুকে রাজ্যে রাখতে পারি না। সেটটারগুলিতে অ্যাক্সেস খোলা অ্যাক্সেস প্রতিরোধের উদ্দেশ্যকে পরাস্ত করে।
আপনি কীভাবে (আছে) এই সমস্যাটি সমাধান করবেন?