मैंने अभी दिनों के लिए DDD के बारे में पढ़ा है और इस नमूने के डिजाइन के साथ मदद की ज़रूरत है। डीडीडी के सभी नियम मुझे बहुत उलझन में डालते हैं कि मैं कैसे कुछ भी निर्माण करने वाला हूं जब डोमेन ऑब्जेक्ट को एप्लिकेशन परत को विधियों को दिखाने की अनुमति नहीं है; और कहां से आर्केस्ट्रा का व्यवहार? भंडार को संस्थाओं में इंजेक्ट करने की अनुमति नहीं है और संस्थाओं को स्वयं इस प्रकार राज्य पर काम करना चाहिए। फिर एक इकाई को डोमेन से कुछ और जानने की आवश्यकता होती है, लेकिन अन्य इकाई वस्तुओं को इंजेक्शन लगाने की अनुमति नहीं है? इनमें से कुछ चीजें मुझे समझ में आती हैं लेकिन कुछ नहीं। मुझे अभी तक अच्छे उदाहरण नहीं मिले हैं कि कैसे एक संपूर्ण फीचर का निर्माण किया जाए क्योंकि हर उदाहरण ऑर्डर्स एंड प्रोडक्ट्स के बारे में है, अन्य उदाहरणों को बार-बार दोहराते हैं। मैं उदाहरणों को पढ़कर सबसे अच्छा सीखता हूं और मैंने अभी तक DDD के बारे में जो जानकारी प्राप्त की है उसका उपयोग करके एक फीचर बनाने की कोशिश की है।
मुझे यह बताने में आपकी सहायता की आवश्यकता है कि मैं क्या गलत करता हूं और इसे कैसे ठीक करूं, सबसे अधिमानतः कोड के साथ "मैं एक्स और वाई करने के लिए पुनर्मिलन नहीं करूंगा" एक संदर्भ में समझना बहुत कठिन है जहां सब कुछ पहले से ही परिभाषित है। अगर मैं एक इकाई को दूसरे में इंजेक्ट नहीं कर सकता, तो यह देखना आसान होगा कि इसे ठीक से कैसे किया जाए।
मेरे उदाहरण में उपयोगकर्ता और मध्यस्थ हैं। एक मध्यस्थ उपयोगकर्ताओं पर प्रतिबंध लगा सकता है, लेकिन एक व्यापार नियम के साथ: केवल 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();
? प्रतिबंध कैसे हटाएं? मुझे पता नहीं है।