Tôi đã đọc về DDD nhiều ngày nay và cần trợ giúp với thiết kế mẫu này. Tất cả các quy tắc của DDD làm cho tôi rất bối rối về cách tôi phải xây dựng mọi thứ khi các đối tượng miền không được phép hiển thị các phương thức cho lớp ứng dụng; nơi nào khác để phối hợp hành vi? Các kho lưu trữ không được phép đưa vào các thực thể và bản thân các thực thể phải hoạt động theo trạng thái. Sau đó, một thực thể cần phải biết một cái gì đó khác từ miền, nhưng các đối tượng thực thể khác cũng không được phép tiêm? Một số trong những điều này có ý nghĩa với tôi nhưng một số thì không. Tôi vẫn chưa tìm thấy các ví dụ hay về cách xây dựng toàn bộ tính năng vì mọi ví dụ là về Đơn hàng và Sản phẩm, lặp đi lặp lại các ví dụ khác. Tôi học tốt nhất bằng cách đọc các ví dụ và đã cố gắng xây dựng một tính năng bằng cách sử dụng thông tin tôi đã đạt được về DDD cho đến nay.
Tôi cần sự giúp đỡ của bạn để chỉ ra những gì tôi đã làm sai và cách khắc phục nó, tốt nhất là với mã là "Tôi sẽ không áp dụng làm X và Y" là rất khó hiểu trong bối cảnh mà mọi thứ chỉ được định nghĩa một cách mơ hồ. Nếu tôi không thể tiêm một thực thể vào một thực thể khác, sẽ dễ dàng hơn để xem làm thế nào để làm điều đó đúng.
Trong ví dụ của tôi có người dùng và người điều hành. Người điều hành có thể cấm người dùng, nhưng với quy tắc kinh doanh: chỉ 3 mỗi ngày. Tôi đã cố gắng thiết lập một sơ đồ lớp để hiển thị các mối quan hệ (mã bên dưới):
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);
Quyền lợi của Người dùng 'is_banned'
có nên được kiểm tra $user->isBanned();
không? Làm thế nào để loại bỏ lệnh cấm? Tôi không có ý kiến.