読者です 読者をやめる 読者になる 読者になる

例外型書いた

柔軟に例外を扱いたかったのでEitherらしきものを書いた。

今まではプレゼンテーション層でvalidationのロジック書いてたんだけど、割りと似たようなコードが異なる画面をまたいで散見されたので共通のエラーハンドラと例外型をつくって流すことにした。

で、そうなるとvalidationというか例外をモデル層から制御してくなった。

gist.github.com

↓サンプル

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 => {});


        
    }
}