对于一个新的应用程序,我使用的是层:
RestRessource -> ApplicationService ->域
我有一个基本的用例,用户可以在其中创建一个“bduget”。如果本年度没有其他预算,则状态为“初始”。AFter表示可以创建新的预算,其状态将与另一个属性“索引”相结合: CORRECTIVE#1,CORRECTIVE#2,.
现在是一些编码。ApplicationService有一个名为"createBudget“的方法。
@Autowired
private BudgetRepository budgetRepo;
@Autowired
private BudgetService budgetService;
public Budget createBudget(int year) {
Budget newBudget;
if (budgetService.existsBudgetInitialFor(year)) {
newBudget = new Budget(year, "INITIAL");
} else {
newBudget = new Budget(year, "CORRECTIVE", budgetService.nextIndex());
}
budgetRepo.insert(newBudget);
return newBudget;
}BudgetService正在使用BudgetRepository来计算数据库。existsBudgetInitialFor返回一个布尔值,如果计数>0 :)
现在问题是:
budgetService.existsBudgetInitialFor(year)提取为私有方法,模拟它以返回真/假,依此类推。createInitialBudget命令,然后发送一个createCorrectiveBudget命令,会更好吗?在这种情况下,我们需要检查命令的有效性(以避免多个初始创建:唯一性验证)。这只是一个非常简单的代码(我把权限管理、验证等放在一边)。所以我试着在编写更复杂的应用程序之前,先做好这类代码。其主要目的是验证这些层,向我的同事解释,显示这段代码可以测试,等等。
非常感谢!
弗朗索瓦
发布于 2014-11-11 16:55:05
希望这能有所帮助。
发布于 2014-11-11 21:12:32
这是一项属于财政预算案本身的执行关注事项,亦是财政预算案对如何指明某一地位的知识:
a)域服务:
numberOfBudgets = budgetRepository.numberOfBudgetsIn(anYear);
budget = Budget.newFrom(anYear, numberOfBudgets + 1);
budgetRepository.add(budget);( b)财政预算案类别内的公营工厂方法:
Budget.newFrom(anYear, budgetNumber) {
status = 'INITIAL';
if (numberOfBudgets > 0) {
status = 'CORRECTIVE' + budgetNumber
}
return new Budget(anYear, status);
}这样,您只在a点中提到了一个域服务。
干杯,塞巴斯蒂安。
发布于 2014-11-12 02:03:03
对于这个例子,我发现budgetServcie毫无用处。在existsBudgetInitialFor中移动BudgetRepository更好吗?
好主意我说,我个人不喜欢xxxService(xxx是实体名称),名称本身并没有多大的意义。
你觉得“如果.否则.”语句位于一个好位置:它是AppService层的责任还是对您来说是一条域规则,要强制执行,您是否在BudgetService中移动这些代码?
在这个用例中,我认为将语句留在应用程序服务中是可以接受的。由于单元测试仍然很简单,有两个备选路径(初始和预算存在)。如果用例变得更加复杂,或者其他一些用例涉及预算创建,那么您可能需要一个BudgetFactory来保存该语句。
为了封装budgetService.nextIndex调用,起诉工厂创建预算更好吗?(代替构造函数)。你认为现在是计算nextIndex的正确时机吗?
是的,我想是时候了。如果不在这里计算,它很可能是在持久性层中计算的,因为它们通常需要更多的精力来编写和维护,并且更加脆弱,因此测试起来更加困难。
应用层是亚喷射到单元测试,还是可能只用于集成测试?你为什么要那样做?当我试图对这个方法进行单元测试时,我需要至少模拟一下BudgetService,BudgetRepository,我在想:这是代码嗅觉的标志吗?另一种简化单元测试的解决方案是提取budgetService.existsBudgetInitialFor(年份)作为私有方法,模拟它以返回真/假,等等。
考虑到这个用例的简单性,如果您将if-else语句留在应用层中,那么就进行单元测试。如果您引入一个BudgetFactory来封装if-else和nextIndex,那么应用层就会变得很薄。如果采用tdd,仍然可以编写单元测试,如果没有,也可以将其保留在功能测试中。
在编写这段代码时,我并不认为创建是实体的责任。我发现尴尬的地方是“如果.否则.”预算实体内部的逻辑。我说得对吗?(请告诉我至少一次我是对的)我同意。单一预算无法判断是否存在其他预算。 最后一个问题是我问自己:也许我从一开始就错了。如果UI发送一个createInitialBudget命令,然后发送一个createCorrectiveBudget命令,会更好吗?在这种情况下,我们需要检查命令的有效性(以避免多个初始创建:唯一性验证)。
当UI显示带有createCorrectiveBudget和createInitialBudget的两个按钮,让用户选择他/她应该单击的按钮时,我不认为这是个好主意。后端的验证是好的,但知识泄露,迫使人们做出不必要的选择。
https://stackoverflow.com/questions/26862117
复制相似问题