在介紹了域驅動設計之後,我意識到DDD專注於業務模型,而不是任何特定的框架/語言/技術。作爲一個數據驅動的心態持有者(x),我正在努力確定在我們的真實項目中實施DDD的步驟。我想知道現實世界DDD實施中的實際步驟是什麼。例如:在實際項目中執行DDD的步驟
- 第一識別業務領域模型
- 相關每個用例,用戶故事,業務需求模型
- 發展與規定的框架解決方案爲DDD
或(?)別的東西?
在介紹了域驅動設計之後,我意識到DDD專注於業務模型,而不是任何特定的框架/語言/技術。作爲一個數據驅動的心態持有者(x),我正在努力確定在我們的真實項目中實施DDD的步驟。我想知道現實世界DDD實施中的實際步驟是什麼。例如:在實際項目中執行DDD的步驟
或(?)別的東西?
域驅動設計鼓勵增量開發,而不是瀑布式開發。 DDD是關於對複雜領域的理解,它不能一次完全發現。我建議經常重複你給出的步驟。
另一件事是用例和業務需求與領域模型高度耦合。真的很難分開創建它們。
我通常在開始時做的是識別域的所有實體。
例如,我們來看看典型的博客方法。
我們可以擁有這個實體,用戶,帖子和管理員。
有時候,首先不能識別所有這些數據,因此我不會先獲得分析paralisys我首先處理代碼。
對我而言,下一步自然就是確定這些實體之間如何協作。寫帖子的用戶是誰?然後,讓我們向它的代碼:
$user->create(new Post($title, $body));
那麼也許管理員需要審查後接受它,並顯示在頁面:
$admin->reviewPostFrom($user);
正如你看到的,我們儘量使代碼儘可能自然,這就是想法,能夠向領域專家解釋代碼。
接下來的事情是通過定義用例,我們可以創建應用程序需要的操作。
我們可以用命令的方式,例如:
class CreateNewPost
{
protected $userId;
protected $postTitle;
protected $postBody;
public function __construct(UserId $idUser, PostTitle $postTitle, PostBody $postBody)
{
// Here we can make some kind of validation of the data
}
}
而且接下來我們將命令發送到我們的命令總線,誰將會是RESPONSABLE處理此命令。它是命令處理程序,所有的使用情況下發生:
class CreateNewPostHandler
{
// here we inject all dependencies we need to accomplish our use case
public function __construct(UserRepositoryInterface $userRepo, etc..)
{
$this->userRepository = $userRepo;
etc...
}
public function handle(CreateNewPost $command)
{
$user = $userRepo->getById($command->userId);
$user->create(new Post($command->getTitle(), $command->getBody()));
// Maybe we can launch an event here that launches a notification to admin, etc.
$this->eventDispatcher(new PostCreatedEvent($user));
}
}
正如你所看到的,我們沒有想到很多事情,雖然我們的編碼我們意識到我們需要的。我希望它是你的利益!
嗨Mequrel,謝謝你的迴應。作爲新來者,我陷入了DDD理論。從堆棧溢出中的少數帖子中,我瞭解到ddd只適用於非常複雜的項目。我並不完全同意它。如果定義了一些明確的步驟,以便每個特殊的新手都得到一些指導線。 – mnhmilu 2015-03-23 03:45:06