試煉8 - 下副本前 開始練習組合技 物件導向 + 泛型

2022 鐵人賽文 搬回點部落

開始試煉

先來看看一些專案的程式碼
SimplCommerceResult.cs
cloudscribe.SimpleContentCommandResult.cs

像這樣的 Result class 常用到的情境像是去打API後拿資料 當然打API有失敗的可能所以都會想一個處理方法
我自己用的程式碼是

public abstract class GenericResultDto<T>
{
    protected bool _isSuccess;
    public bool IsSuccess => _isSuccess;

    public bool IsFail => _isSuccess == false;

    protected string _errorMessage;
    public string ErrorMessage => _errorMessage;

    protected T _value;
    public T Value => _value;
}

public sealed class SuccessResultDto<T> : GenericResultDto<T>
{
    public SuccessResultDto(T value = default,string errorMessage = default)
    {
        _isSuccess = true;
        _value = value;
        _errorMessage = errorMessage;
    }
}

public sealed class FailResultDto<T> : GenericResultDto<T>
{
    public FailResultDto(string errorMessage = default, T value = default)
    {
        _isSuccess = false;
        _errorMessage = errorMessage;
        _value = value;
    }
}

有用一些物件導向手法讓我來說明

  1. GenericResultDto 用 abstract 是利用不能new 抽象方法的特性 但是又可以拿來當作固定的回傳類型 跟一些固定的方法可以先實做好 像是
    public bool IsFail => _isSuccess == false;
  2. 再來 SuccessResultDto 跟 FailResultDto 是想加上可讀性 如果不這樣做的話
    通常都要傳 true/false 當參數 少一個參數還可以增加可讀性 應該有比較優吧
  3. sealed 因為這SuccessResultDto 跟 FailResultDto 無需在被繼承
  4. 當然要能夠通用的好辦法就是用泛型啦
  5. 可以依照自己(團隊)的習慣 處理一些細節像是SuccessResultDto跟FailResultDto跟建構子參數是相反的 成功時先放資料,失敗時先放錯誤訊息 對我來說是很直覺的

使用上的範例code

GenericResultDto<DateTime> Demo(bool isNow)
{
    if(isNow)
    {
        return new SuccessResultDto<DateTime>(DateTime.Now);
    }

    return new FailResultDto<DateTime>("some message");
}

延伸試煉

泛型還不是很熟請到樓下練功一下吧
C#語法——泛型的多種應用

結束試煉

準備離開新手村時 有這樣的組合技能力 下副本時一定用的上

如果內容有誤請多鞭策謝謝