在这个关头,我的设计面临一个重大问题。我的方法是尝试完成以下操作:
- 将传入的对象插入数据库。
- 从插入中获取自动递增的 id,并使用它与对象一起调用 webservice1。
- 从 webservice1 获取结果并使用原始对象和来自 webservice1 的一些响应调用 webservice2。
- 将 webservice1 和 2 的结果结合起来,写入数据库。
- 从最后一次插入中获取生成的自动递增 id,并使用最终会导致操作成功或失败的原始对象调用 webservice3。
我想以灵活的方式设计它,因为需求在不断变化,我不想继续根据任何变化修改我的逻辑。我确实意识到一些变化是不可避免的,但我想尽量减少损害并尊重开闭原则。
我最初的看法如下:
def complexOperation(someObject:T) =
dbService.insertIntoDb(someObject) match {
case Left(e:Exception) => Left(e)
case Right(id:Int) => webService.callWebService1(id,someObject) match {
case Left(e:Exception) => Left(e)
case Right(r:SomeResponse1) => webService.callWebservice2(r,someObject) match {
case Left(e:Exception) => webService.rollbackService1();Left(e)
case Right(context:ResponseContext) => dbService.insertContextIntoDb(context) match {
case Left(e:Exception) => Left(e)
case Right(id:Int) => webService.callWebservice3(id,someObject) match {
case Left(e:Exception) => webService.rollbackService3();Left(e)
case Right(r:Response) => Right(r)
}
}
}
}
如您所见,这是一团乱麻。如果事情失控,我既不能对它进行单元测试,也不能扩展它,也不能很容易地调试它。这段代码达到了它的目的,但如果能获得一些关于我应该如何重构它以使继承我的代码的人的生活更轻松一些的想法将会很棒。
谢谢