Adapter => 我不會講台語 透過媽媽當翻譯 間接跟阿公溝通
=> 媽媽就是 Adapter = 橋接器
什麼情況下用的到?
前提: 我想用一樣的方式操作所有東西
要解決的問題: 目標不好用、為了降低與目標的藕合、目標還在開發中可能一直變、我得一直配合他改......
Adapter => 我不會講台語 透過媽媽當翻譯 間接跟阿公溝通
=> 媽媽就是 Adapter = 橋接器
什麼情況下用的到?
前提: 我想用一樣的方式操作所有東西
要解決的問題: 目標不好用、為了降低與目標的藕合、目標還在開發中可能一直變、我得一直配合他改......
觀察者模式 => 我訂閱了一個東西 當他發生變化時 希望他可以通知我 = 執行我肚子的函式
所以可知這個Pattern裡面一定有些東西
1. 有一個集合 => 存哪些人訂閱我 => 當我有變化時我才知道要通知誰
2. 訂閱者的是 '被通知的' => 粉絲肚子裡的函式被粉專呼叫
=> 當粉專有新貼文時 由粉專通知所有粉絲
3. 通知的方法是粉專來執行所有粉絲肚子裡的某一個函式
外觀模式 => 把很多子系統包起來 => 對外統一呼叫我就好
假設公司內部很亂 每個部門開發自己的子系統
但每件需求一定都是跨部門發生 所以我總得先Call A 部門的程式、再 B 部門的程式、再 C 部門的程式
但實際上怎麼用其他部門的程式都是固定的 我想把他們包裝起來
Proxy => 透過代理 (Proxy) 間接操作真實物件
=> 強調間接性 => 大家都透過 Proxy '間接' 碰真實物件 => 所以所有行為都可以被 Proxy 掌控
也因此什麼時後需要用到 Proxy ?
1. 我想隱藏真實物件到底是誰
2. 因為是透過 Proxy 間接操作 所以可以在 Proxy 中自己再做一些加工 例如 Cache, 權限, 其他...
策略模式 => 我希望用戶只認識我 連實際他的需求是哪個子類別在做都不要知道
考量前一篇 簡單工廠時 用戶端叫用的程式碼為
static void Main(string[] args)
{
Housework housework = HomeworkFactory.CreateHousework("掃地");
housework.Do();
}
簡單工廠模式 => 幫我選擇出用戶實際要用的是哪個子類別
99.99 的人學 DP 的第一課都是簡單工廠
因為它簡單又好用
今天學會 明天馬上用得到
委派 Delegate
講的簡單一點 他就像一個轉接頭
你充 iphone 需要轉接頭 但轉接頭的兩端能插什麼線是固定的
你買了 Type-C 的線 就不可能插進 Micro USB 的孔
但也就是說 只要是插的進去的線 就都可以讓你充電
今天你有錢可以用原廠的線 明天比較窮就用夜市牌的
反正只要插的進轉接器 就是可以用的線
原本偵錯時 區域變數視窗長這樣
所以每天都在浪費生命 點、點、點 把每個點開看他到底是誰
偵錯時我當然想看到重點 而不是沒意義的Class Name
其實所有跟 Task 有關的操作裡面,重要的事情一直只有一項
哪些會繼續往下跑、還有哪些會阻塞 (要等的意思)
今天再來看看 GetAwaiter() 的阻塞與不阻塞
async 非同步
await 等待
前面我們看過了 Task 幾種使用方法
那如果今天我們想要的是
1. 三個好友同時搶廉航機票,只要任一人搶成功,就可以成行
=> Task.WaitAny
2. 三個好友同時從起點出發,全部都抵達終點才算獲勝
=> Task.WaitAll
3. 三個好友接力賽跑,A 跑完才能換 B,B 跑完才能換 C
=> ContinueWith
在比較久以前的.NET Framework版本 大家可能直接操作過Thread
一言以蔽之 在絕大部份情況下
建議大家使用 Task 取代 Thread
再一個問題
前面我們討論過 Parallel,當然我們也可以同時 new 很多 Task,讓結果就像是 Parallel
那我該選擇哪個?
一言以蔽之 在絕大部份情況下
建議大家用 Parallel 取代 多個 Task
Lock是一個一次只能有一個人進去的區域
但如果我有自己的上限值 ex: 一次可以 3 個人一起進入某個區域
那我該怎麼做呢?
答案就是使用 SemaphoreSlim
Parallel.For很明顯跟上一篇Parallel.Foreach是差不多的東西
所以我們再加上 Lock 來讓情況變有趣些
假設媽媽跟你說 今天晚上九點時 你有三件事要做
1. 掃地 2. 洗澡 3. 洗碗
因為這三件事並不存在先後關係 所以哪件先做都可以
而聰明如你一定會想 如果我可以同時掃地、洗澡、洗碗一起做
那不是就太好了嗎
承上題 [報表程式 - 3] 多個觸發點+多種資料來源 => ViewModel
再假設最後我們發現每個觸發點中,連組裝資料的邏輯都完全各走各的了
所以 BaseEvent 只剩下流程控制與共用類別、參數宣告的功能
除此之外都不能共用了,都會寫在各自的 Event.cs 中
上題雖然有兩個觸發點 (出站+進站) 但都來自同一張LOT_TXN 過站記錄
那假設我們今天有第三種事件 卻來自另一張表 (SNAP 快照 指的是只有每個貨批當下最新的一筆資料)
但其實三個事件間邏輯都是類似的 我們該怎麼處理呢
承上題 [報表程式 - 1] 單一觸發點
今天我們稍微把上次的例子做個變化
1. 當報進站事件 ( MoveIn ) => 數量 (Qty) 都要 +1
2. 當報出站事件時 ( MoveOut ) => 數量 (Qty) 都要 -1
但除此之外,其他欄位邏輯都相同
常常我們有一些撈報表資料的需求
我們需要從資料庫裡撈出一些符合某種情況的資料 (觸發點)
然後再根據這些資料 去衍生出更多資料 (來自更多其他的資料表)
再把所有資料拿來做一些計算
最後組裝成我們要的結果
並且以不同的方式進行呈現 (也許寫出成檔案)
大家寫程式寫一陣子以後就會開始聽到一些名詞
控制反轉(Inversion of Control,縮寫為IoC)
相依性注入(Dependency Injection,簡稱DI)
也許再加上很久以前也許就沒認真搞懂的介面 (Interface)
關於這些東西到底是什麼意思 我想中文解釋大家都會背
但我可能就是搞不懂 到底把程式搞這麼複雜有什麼好處?
原本的程式也跑得很好 為什麼大家總是說得這樣寫才好?
我想用最簡單的例子來做個說明