2017年1月2日 星期一

Function Composition

由多個小 function 組合成大 function


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

沒有留言:

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

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