2022 鐵人賽文 搬回點部落
開始試煉
先來看看一些專案的程式碼
SimplCommerce 的 Result.cs
cloudscribe.SimpleContent 的 CommandResult.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;
}
}
有用一些物件導向手法讓我來說明
- GenericResultDto 用 abstract 是利用不能new 抽象方法的特性 但是又可以拿來當作固定的回傳類型 跟一些固定的方法可以先實做好 像是
public bool IsFail => _isSuccess == false;
- 再來 SuccessResultDto 跟 FailResultDto 是想加上可讀性 如果不這樣做的話
通常都要傳 true/false 當參數 少一個參數還可以增加可讀性 應該有比較優吧 - sealed 因為這SuccessResultDto 跟 FailResultDto 無需在被繼承
- 當然要能夠通用的好辦法就是用泛型啦
- 可以依照自己(團隊)的習慣 處理一些細節像是SuccessResultDto跟FailResultDto跟建構子參數是相反的 成功時先放資料,失敗時先放錯誤訊息 對我來說是很直覺的
使用上的範例code
GenericResultDto<DateTime> Demo(bool isNow)
{
if(isNow)
{
return new SuccessResultDto<DateTime>(DateTime.Now);
}
return new FailResultDto<DateTime>("some message");
}
延伸試煉
泛型還不是很熟請到樓下練功一下吧
C#語法——泛型的多種應用
結束試煉
準備離開新手村時 有這樣的組合技能力 下副本時一定用的上
如果內容有誤請多鞭策謝謝