2017年1月2日 星期一

Function Composition

由多個小 function 組合成大 function
  1. var john = new User("John", "Doe");
  2. string EmailTo(User u) => Domain(FullName(u));
  3. var email = EmailTo(john);
  4. Console.WriteLine(email);
  5. // 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
  1. namespace ConsoleApp
  2. {
  3. public static class Email
  4. {
  5. public static string FullName(this User u) => ShortName(u.FirstName) + CutName(u.LastName);
  6. public static string Domain(this string localPart) => $"{localPart}@gmail.com";
  7. private static string ShortName(string s) => s.Substring(0, 2).ToLower();
  8. }
  9. }

將 Name() 與 Domain() 的第一個參數都改加上 this,變成為 Extension Method
  1. namespace ConsoleApp
  2. {
  3. internal static class Program
  4. {
  5. private static void Main()
  6. {
  7. var email =
  8. new User("John", "Doe")
  9. .FullName()
  10. .Domain();
  11. Console.WriteLine(email);
  12. }
  13. }
  14. }

原本的 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

沒有留言:

Visual Studio 2017/2019 推薦的擴充功能與更新

參考文章: 覺得 Google 的 Blogger 不太順手?透過 HTML 的 iframe 移花接木 HackMD