柔軟に例外を扱いたかったのでEitherらしきものを書いた。
今まではプレゼンテーション層でvalidationのロジック書いてたんだけど、割りと似たようなコードが異なる画面をまたいで散見されたので共通のエラーハンドラと例外型をつくって流すことにした。
で、そうなるとvalidationというか例外をモデル層から制御してくなった。
↓サンプル
using PurchaseResult = ???; public class Shop{ public IEither<PurchaseResult, ShopError> Buy(ShopItem item){ if(在庫確認、通貨の残高確認、など必要に応じてエラーを調べる){ return Either.right<PurchaseResult, ShopError> (ShopErr.NotEnoughCoin);// 実際は要件にあったエラー型 } var purchaseResult = some();// どっかで購入する; return Either.Left<PurchaseResult, ShopError>(purchaseResult); } } public class ShopItem{ // 何か } public enum ShopErr{ NotEnoughCoin, } public class ShopController{ // どっかで注入されてる Shop shop; List<ShopItem> shopItems; public void buy(int shopItemId){ var item = shopItems.Single(_ => _.id = shopItemId); var result = shop.Buy(item); result.Use<Some>(success => {}, err => {}); } }