var john = new User("John", "Doe");
string EmailTo(User u) => Domain(FullName(u));
var email = EmailTo(john);
Console.WriteLine(email);
// jodo@gmail.com (姓 2 碼 + 名 2 碼 +
gmail.com)
EmailFor() 能根據 User 的 姓 與 名 自動產生 email
string EmailTo(User u) => Domain(FullName(u));
EmailTo() 為 Local Function 由 FullName() 與 Domain() 組合出新的 EmailTo()
這就是所謂的 Function Composition
Function Composition 重複使用性高,程式碼必須『由右而左』
一般人『由左至右』的閱讀習慣,改用 Function Pipeline
namespace ConsoleApp
{
public static class Email
{
public static string FullName(this User u) => ShortName(u.FirstName) + CutName(u.LastName);
public static string Domain(this string localPart) => $"{localPart}@gmail.com";
private static string ShortName(string s) => s.Substring(0, 2).ToLower();
}
}
將 Name() 與 Domain() 的第一個參數都改加上 this,變成為 Extension Method
namespace ConsoleApp
{
internal static class Program
{
private static void Main()
{
var email =
new User("John", "Doe")
.FullName()
.Domain();
Console.WriteLine(email);
}
}
}
原本的 EmailTo() Local Function 就不需要了
只要將 User new 後,直接用 FullName() 與 Domain(),維持了『由左至右』的閱讀習慣
只要將第一個參數加上 this 修飾成為 Extenstion Method 後,
就可由 Function Composition 改成 Function Pipeline 風格
Function Composition 與 Function Pipeline 講的是同一件事情,
只是 Function Composition 採用 由右至左,
而 Function Pipeline 符合閱讀習慣,採用 由左至右
Funciton Compostion 與 Function Pipeline 是 FP 關鍵部分,
以前總以為 C# 沒有支援,
因此無法使用 C# 寫 FP,
有了 Extension Method,
C# 就能很輕鬆的實踐 FP
沒有留言:
張貼留言