この時点で、設計に関する大きな問題に直面しています。私の方法は、次のことを達成しようとしています:
- 渡されたオブジェクトをデータベースに挿入します。
- 挿入から自動インクリメントされた 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)
}
}
}
}
ご覧のとおり、これはもつれた混乱です。制御不能になった場合、単体テストも拡張も簡単にデバッグすることもできません。このコードはその目的を果たしますが、コードを継承する人々の生活をもう少し楽にするためにコードをリファクタリングする方法についていくつかのアイデアを得ることは素晴らしいことです.
ありがとう