試煉22 - 如何用 擴充方法 來打造可讀性程式

2022 鐵人賽文 搬回點部落

開始試煉

先來看一下程式碼 這是產CSV的示意程式碼

void Main()
{
    var sb = new StringBuilder();
    var prodcut = new Prodcut { Name = "Sports & Outdoors", Price = 1200 };
    sb.Append($"{nameof(prodcut.Name)}");
    sb.Append(",");
    sb.AppendLine($"{nameof(prodcut.Price)}");
    sb.Append(prodcut.Name);
    sb.Append(",");
    sb.Append(prodcut.Price);
    sb.AppendLine();
    sb.ToString().Dump();
}
public class Prodcut
{
    public string Name { get; set; }
    public int Price { get; set; }
}

程式碼可以看到為了要加, 用兩種方法
但是這樣的程式碼很不好閱讀
所以可以用擴充方法來幫忙讓程式碼可讀性

void Main()
{
    var sb = new StringBuilder();
    var prodcut = new Prodcut { Name = "Sports & Outdoors", Price = 1200 };
    sb.AppendCsv($"{nameof(prodcut.Name)}");
    sb.AppendLine($"{nameof(prodcut.Price)}");
    sb.AppendCsv(prodcut.Name);
    sb.AppendLine(prodcut.Price.ToString());
    sb.ToString().Dump();
}
public static class StringBuilderExtensions
{
    public static StringBuilder AppendCsv(
    this StringBuilder stringBuilder,
    string value) => stringBuilder.Append($"{value},");
}

像是Linq 自己本身就是用擴充方法 實做完成的
可以加上自己的擴充方法 讓可讀性更佳
正常來說分頁一定要先算出 第幾頁 有一頁幾筆
才知道要跳過多少筆 再來要取幾筆

public static class IQueryableExtension
{
    public static IQueryable<T> Page<T>(
        this IQueryable<T> @list, 
        int page, 
        int pageSize)
    {
        var skip = (page - 1) * pageSize;
        return @list.Skip(skip).Take(pageSize);
    }
}

使用起來就是這樣
query = query.OrderBy(x => x.Price).Page(inputDto.Page, inputDto.PageSize);

把細節邏輯封裝到擴充方法內 加上一個好的命名
這樣程式碼的可讀性 就可以提高

結束試煉

程式碼可讀性寫的好 連維護都簡單許多喔

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