Php 启动Behat功能/故事的正确方式
我开始使用BDD,经过一些阅读后,我发现它与DDD非常匹配 现在我有了这个域,Php 启动Behat功能/故事的正确方式,php,domain-driven-design,bdd,behat,Php,Domain Driven Design,Bdd,Behat,我开始使用BDD,经过一些阅读后,我发现它与DDD非常匹配 现在我有了这个域,机构拥有位置,由受让人将其添加到机构,受让人是被分配为组织经理的用户 我仍然不知道它应该是什么样子,但这项功能听起来像:作为机构的受让人,我必须能够为组织增加职位 我正在考虑的代码(对于代码优先的方法很抱歉)如下所示: if ($institution->isAssignee($user)) { $institution->addPlace(/* properties*/); } 现在,我应该如何
机构
拥有位置
,由受让人
将其添加到机构
,受让人是被分配为组织经理的用户
我仍然不知道它应该是什么样子,但这项功能听起来像:作为机构的受让人,我必须能够为组织增加职位
我正在考虑的代码(对于代码优先的方法很抱歉)如下所示:
if ($institution->isAssignee($user)) {
$institution->addPlace(/* properties*/);
}
现在,我应该如何编写功能及其场景?我是否应该将作为受让人离开,然后离开它?还是应该有多个场景?情况会是怎样的
编辑:
因此,我暂时不进行用户权限检查,而是启动了第一个功能,然后是实现规范。可以找到代码
这个功能不是很简单吗?当然,这是my domain的核心功能,但我甚至没有在我的功能中提到无法添加相同位置的位置的情况,但我在InstitutionSpec
前进:如果我想编辑机构的位置
,有什么更好的方法:
$place = $institution->getPlace($placeId);
$place->editWhatever(/***/);
或
检查用户是否有权向机构添加场所
似乎是另一个人的受限上下文
(BC
)问题,如授权
。通过查询授权BC
以从具有受让人“
角色的用户创建受让人,可以在应用层的抗破坏层中机构集合
之外执行此检查
在这个BC中,只有一个受让人
,可能是一个值对象
,它有一个用户ID
和一个名称
另外,你的BDD
测试应该按照BC
进行划分,而且应该按照Aggregate
进行划分
通常,在一开始,大多数开发人员都考虑重用所有步骤。您只是隐藏了这个场景应该显示的内容—阻止添加具有相同协调的新位置。在我看来,第一步应该是:
然后像这样润色你们的场景,帮助你们找到更好的命名方式,展示问题
正如您所问的:这个功能不是很简单吗?
-如果每个场景都正确地按功能划分-那么不是-您是按行为设计代码的。如果这只是您需要的,那么可以,但您还应该考虑功能的边界条件-添加下一个场景
关于最后一部分,使用“编辑位置”-考虑实体。
我听到了一个很好的例子:D
您喜欢什么:
- 到笼子->抓狮子->用下巴抓肚子->把食物放进去->把肚子放回去->离开
或
- 去笼子->把食物扔给狮子->离开
当你们试图抓住这个机构的“胃”时,第一个选择就是打破这个基础
我认为,在您的上下文中,第二种选择更好。确定用户是否是给定机构的受让人可能不像角色检查那么容易。我通常都支持身份和访问BC,但在这里,支持上下文需要引入额外的抽象集,例如在特定上下文或特定目标中扮演角色。在需要关联的BC中直接建模关联可能更容易。
$institution->editWhateverInPlace($placeId, /** edits **/);
Given an institution named "Test institution" with places:
| name | coordination |
| Test Place | 54.222,24.333 |