14. • 將 Mathematical Function 以 code 呈現,稱為 Pure
Function
• Pure Function : function 的結果只與參數有關,不會
與其他任何東西相關
Pure Function
int Foo(int x)
{
return x + 1;
}
15. • Func() 的結果會與參數以外的資料相關 => 非 Pure
Function
• z 的改變可能影響到其他 function (Side Effect)
• w 的改變可能影響 Func() (Side Effect)
Programming Function
int z = 1;
int w = 0;
int Foo(int x)
{
w = 3;
return 2 * x + z + 3;
}
17. • 修改 Function 外部的變數
• 修改 Function 的 input 參數
• 拋出 Exception
• 處理 I/O
Side Effect
18. • Function as Data / Higher Order Functions
• No State Mutation
Functional Programming
19. • First-Class Function
• 能將 Function 指定給變數 (Delegate)
• 能將 Function 傳進 Function (Higher Order Function)
• 能使 Function 回傳 Function (Higher Order Function)
• 能將 Function 存進 Collection
Function as Data
22. • 定義 Triple() Local Function
• Triple() 會自動轉成 Delegate 傳入 Select()
• Select() 為 Higher Order Function
能將 Function 傳進 Function
int Triple(int x) => x * 3;
Range(1, 3)
.Select(Triple)
.OrderBy(x => -x)
.ToList()
.ForEach(WriteLine);
9
6
3
23. • 將 3 也變成參數
• Triple(3) 回傳的是 Function (Delegate)
• Tripe() 為 Higher Order Function
能使 Function 回傳 Function
Func<int, Func<int,int>> Triple = x => y => x * y;
Range(1, 3)
.Select(Triple(3))
.OrderBy(x => -x)
.ToList()
.ForEach(WriteLine);
9
6
3
24. • 使用 Dictionary 實現 Function Factory
能將 Function 存進 Collection
var lut = new Dictionary<char, Func<int, int>> {
{'+', x => x + x},
{'*', x => x * x}
};
Range(1, 3).
.Select(lut[ '*' ])
.ToList()
.ForEach(WriteLine);
1
4
9
26. Mutable
public class Rectangle
{
public int Length { get; set; }
public int Height { get; set; }
public void Grow(int length, int height)
{
Length += length;
Height += height;
}
}
Rectangle r1 = new Rectangle {
Length = 5, Height = 10
};
r1.Grow(10, 10); 15; 20
27. Immutable
public class Rectangle
{
public int Length { get; }
public int Height { get; }
public Rectangle(int length, int height)
{
Length = length;
Height = height;
}
public Rectangle Grow(int length, int height)
=> new Rectangle(Length + length, Height + height);
}
Rectangle r1 = new Rectangle(5, 10);
var r2 = r1.Grow(10, 10);
15; 20
28. • Sort() 直接對 data 做排序,修改原本資料
• Sort() 為 void,無法繼續串下去
Mutable
var data = new List<int> { 3, 2, 1 };
data.Sort();
data.ForEach(WriteLine);
1
2
3
29. • OrderBy() 沒有宣改原本 data,而是建立新的 data
Immutable
var data = new List<int> { 3, 2, 1 };
data
.OrderBy(item => item)
.ToList()
.ForEach(WriteLine);
1
2
3
41. OOP 與 FP 比較表
OOP FP
Encapsulation
Data 與 Logic 包在
class 內
Data 與 Logic 分家
State Mutation Mutable Immutable
Modularity Class Function
Dependency IoC Container Higher Order Function
Loose Coupling Interface Signature