আমি এখন কয়েকদিন ডিডিডি নিয়ে পড়েছি এবং এই নমুনা ডিজাইনের সাহায্য দরকার। ডিডিডি-র সমস্ত বিধিগুলি আমাকে খুব বিভ্রান্ত করে তোলে যে কখন যখন ডোমেন অবজেক্টগুলিকে অ্যাপ্লিকেশন স্তরটিতে পদ্ধতিগুলি প্রদর্শন করার অনুমতি দেওয়া হয় না তখন কীভাবে আমি কিছু তৈরি করার কথা; অর্কেস্ট্রেট আচরণ আর কোথায়? সঞ্চিত্রে সত্তা ও সত্তাগুলিতে সন্ধানের জন্য ভান্ডারগুলিকে অনুমতি দেওয়া হয় না সুতরাং তারা অবশ্যই রাজ্যে কাজ করবে work তারপরে কোনও সত্তাকে ডোমেন থেকে অন্য কিছু জানা দরকার, তবে অন্যান্য সত্তা অবজেক্টগুলিকেও ইঞ্জেকশন দেওয়ার অনুমতি দেওয়া হয় না? এর মধ্যে কিছু জিনিস আমার কাছে বোধগম্য হয় তবে কিছু তা বোঝে না। প্রতিটি উদাহরণ অর্ডার ও পণ্য সম্পর্কে যেমন পুরো বৈশিষ্ট্যটি কীভাবে তৈরি করা যায় তার আরও ভাল উদাহরণ আমি এখনও খুঁজে পাইনি এবং অন্যান্য উদাহরণগুলি বারবার বারবার বলছি। আমি উদাহরণগুলি পড়ে ভালভাবে শিখি এবং এই পর্যন্ত ডিডিডি সম্পর্কে আমি যে তথ্য অর্জন করেছি তা ব্যবহার করে একটি বৈশিষ্ট্য তৈরির চেষ্টা করেছি।
আমার ভুলটি কীভাবে করা যায় এবং কীভাবে এটি ঠিক করা যায় তা বোঝাতে আমার আপনার সহায়তা দরকার, সর্বাধিক কোড হিসাবে "আমি এক্স এবং ওয়াইয়ের ক্ষতিপূরণ দেব না" এমন একটি প্রসঙ্গে বোঝা খুব কঠিন যেখানে সবকিছু ইতিমধ্যে অস্পষ্টভাবে সংজ্ঞায়িত করা হয়েছে। আমি যদি অন্য কোনও সত্তাকে ইনজেক্ট করতে না পারি তবে এটি কীভাবে সঠিকভাবে করা যায় তা দেখতে আরও সহজ।
আমার উদাহরণে ব্যবহারকারী এবং মডারেটর রয়েছে। একজন মডারেটর ব্যবহারকারীদের নিষিদ্ধ করতে পারে তবে ব্যবসায়ের নিয়ম সহ: প্রতিদিন কেবল 3 জন। সম্পর্কগুলি দেখানোর জন্য একটি শ্রেণি চিত্রটি স্থাপন করার চেষ্টা করেছি (নীচের কোড):
interface iUser
{
public function getUserId();
public function getUsername();
}
class User implements iUser
{
protected $_id;
protected $_username;
public function __construct(UserId $user_id, Username $username)
{
$this->_id = $user_id;
$this->_username = $username;
}
public function getUserId()
{
return $this->_id;
}
public function getUsername()
{
return $this->_username;
}
}
class Moderator extends User
{
protected $_ban_count;
protected $_last_ban_date;
public function __construct(UserBanCount $ban_count, SimpleDate $last_ban_date)
{
$this->_ban_count = $ban_count;
$this->_last_ban_date = $last_ban_date;
}
public function banUser(iUser &$user, iBannedUser &$banned_user)
{
if (! $this->_isAllowedToBan()) {
throw new DomainException('You are not allowed to ban more users today.');
}
if (date('d.m.Y') != $this->_last_ban_date->getValue()) {
$this->_ban_count = 0;
}
$this->_ban_count++;
$date_banned = date('d.m.Y');
$expiration_date = date('d.m.Y', strtotime('+1 week'));
$banned_user->add($user->getUserId(), new SimpleDate($date_banned), new SimpleDate($expiration_date));
}
protected function _isAllowedToBan()
{
if ($this->_ban_count >= 3 AND date('d.m.Y') == $this->_last_ban_date->getValue()) {
return false;
}
return true;
}
}
interface iBannedUser
{
public function add(UserId $user_id, SimpleDate $date_banned, SimpleDate $expiration_date);
public function remove();
}
class BannedUser implements iBannedUser
{
protected $_user_id;
protected $_date_banned;
protected $_expiration_date;
public function __construct(UserId $user_id, SimpleDate $date_banned, SimpleDate $expiration_date)
{
$this->_user_id = $user_id;
$this->_date_banned = $date_banned;
$this->_expiration_date = $expiration_date;
}
public function add(UserId $user_id, SimpleDate $date_banned, SimpleDate $expiration_date)
{
$this->_user_id = $user_id;
$this->_date_banned = $date_banned;
$this->_expiration_date = $expiration_date;
}
public function remove()
{
$this->_user_id = '';
$this->_date_banned = '';
$this->_expiration_date = '';
}
}
// Gathers objects
$user_repo = new UserRepository();
$evil_user = $user_repo->findById(123);
$moderator_repo = new ModeratorRepository();
$moderator = $moderator_repo->findById(1337);
$banned_user_factory = new BannedUserFactory();
$banned_user = $banned_user_factory->build();
// Performs ban
$moderator->banUser($evil_user, $banned_user);
// Saves objects to database
$user_repo->store($evil_user);
$moderator_repo->store($moderator);
$banned_user_repo = new BannedUserRepository();
$banned_user_repo->store($banned_user);
ব্যবহারকারীর অধিকারের 'is_banned'
ক্ষেত্রে এমন ক্ষেত্র থাকা উচিত যা পরীক্ষা করা যায় $user->isBanned();
? কীভাবে নিষেধাজ্ঞা সরিয়ে নেওয়া যায়? আমার কোন ধারণা নাই.