heart 板


LINE

你的比喻很有趣,而且抓住了事件驅動的核心概念——**當某個事情發生(事件),感興趣 的對象(訂閱器)會執行相應的動作(處理程序)**。 你的比喻本身的方向是正確的,只是在具體對應到程式碼中的「委託」和「事件」時,可能 需要稍微調整一下。讓我們來分析你的情境,並進行修正和更清晰的對應: **情境 A:忍者與主公密函** * **發布器:主公 (Lord)** * **事件:密函送達 (SecretMessageArrived)** * 這個事件可以攜帶密函的內容(例如:目標、時間、地點等資訊)。 * 在程式碼中,「密函送達」會是一個基於特定委託的 `event`。這個委託會定義 事件處理程序需要接收的參數,例如密函內容的字串或其他更複雜的物件。 * **訂閱器:忍者 (Ninja)** * **處理程序:執行暗殺任務 (ExecuteAssassination)** * 不同的忍者可能有不同的暗殺方法。每個忍者會編寫一個符合「密函送達」事件 委託簽名的方法來處理密函。 * 例如,一個忍者可能專精於近身格鬥,另一個擅長遠程毒殺。他們都會訂閱「密 函送達」事件,並在收到密函時執行他們各自的暗殺處理程序。 **程式碼概念對應:** ```csharp // 委託:定義了處理密函的方法簽名 public delegate void SecretMessageHandler(string target, DateTime deadline, stri ng location); // 發布器:主公 public class Lord { // 事件:密函送達 public event SecretMessageHandler SecretMessageArrived; // 發布密函的方法 public void SendSecretMessage(string target, DateTime deadline, string locat ion, string messageContent) { Console.WriteLine($"主公發出密函:目標 {target}, 時間 {deadline}, 地點 { location}"); // 觸發事件,將密函內容傳遞給所有訂閱的忍者 SecretMessageArrived?.Invoke(target, deadline, location); // 這裡的 messageContent 可以是額外的資訊,或者直接包含在參數中 } } // 訂閱器:忍者 public class Ninja { public string Name { get; set; } public Ninja(string name) { Name = name; } // 處理程序 1:近身暗殺 public void MeleeAssassination(string target, DateTime deadline, string loca tion) { Console.WriteLine($"{Name} 接到密函,將於 {deadline} 在 {location} 對 {t arget} 進行近身暗殺。"); // 具體的暗殺邏輯 } // 處理程序 2:遠程毒殺 public void PoisonAssassination(string target, DateTime deadline, string loc ation) { Console.WriteLine($"{Name} 接到密函,將於 {deadline} 在 {location} 對 {t arget} 進行遠程毒殺。"); // 具體的毒殺邏輯 } } public class ScenarioA { public static void Run() { Lord lord = new Lord(); Ninja ninjaA = new Ninja("風影"); Ninja ninjaB = new Ninja("月影"); // 忍者訂閱主公的密函事件,並綁定自己的處理程序 lord.SecretMessageArrived += ninjaA.MeleeAssassination; lord.SecretMessageArrived += ninjaB.PoisonAssassination; // 主公發出密函 lord.SendSecretMessage("敵方首領", DateTime.Now.AddDays(3), "敵方城堡", "務必成功!"); } } ``` **情境 B:保險業車禍評估** * **發布器:車禍事件記錄系統 (AccidentRecorder)** * **事件:車禍發生 (AccidentOccurred)** * 這個事件需要包含車禍的相關資訊,例如地點、時間、涉及車輛、人員傷亡情況 等。這會定義委託的參數。 * **訂閱器:保險公司評估部門 (InsuranceAssessment)** * **處理程序:測量與評估損失 (MeasureAndEvaluateLoss)** * 不同的保險公司或不同的評估人員可能有不同的評估流程和標準。每個評估部門 會編寫一個符合「車禍發生」事件委託簽名的方法來處理車禍資訊。 * 例如,一個評估員可能負責初步現場勘查,另一個負責醫療費用評估,還有一個 負責車輛損失評估。他們都會訂閱「車禍發生」事件,並執行他們各自的評估處理程序。 **程式碼概念對應:** ```csharp // 委託:定義了處理車禍資訊的方法簽名 public delegate void AccidentHandler(string location, DateTime time, string[] in volvedVehicles, string[] injuries); // 發布器:車禍事件記錄系統 public class AccidentRecorder { // 事件:車禍發生 public event AccidentHandler AccidentOccurred; // 記錄車禍並發布事件的方法 public void RecordAccident(string location, DateTime time, string[] vehicles , string[] injuries) { Console.WriteLine($"記錄到一起車禍:地點 {location}, 時間 {time}"); // 觸發事件,將車禍資訊傳遞給所有訂閱的保險公司評估部門 AccidentOccurred?.Invoke(location, time, vehicles, injuries); } } // 訂閱器:保險公司評估部門 public class InsuranceAssessment { public string DepartmentName { get; set; } public InsuranceAssessment(string name) { DepartmentName = name; } // 處理程序 1:現場初步勘查 public void InitialAssessment(string location, DateTime time, string[] vehic les, string[] injuries) { Console.WriteLine($"{DepartmentName} 進行現場初步勘查,地點:{location} ,時間:{time}。"); // 現場勘查邏輯 } // 處理程序 2:醫療費用評估 public void MedicalAssessment(string location, DateTime time, string[] vehic les, string[] injuries) { Console.WriteLine($"{DepartmentName} 評估傷亡人員的醫療費用。"); // 醫療費用評估邏輯 } // 處理程序 3:車輛損失評估 public void VehicleDamageAssessment(string location, DateTime time, string[] vehicles, string[] injuries) { Console.WriteLine($"{DepartmentName} 評估涉及車輛的損失情況:{string.Joi n(", ", vehicles)}。"); // 車輛損失評估邏輯 } } public class ScenarioB { public static void Run() { AccidentRecorder recorder = new AccidentRecorder(); InsuranceAssessment companyA = new InsuranceAssessment("快速理賠中心"); InsuranceAssessment companyB = new InsuranceAssessment("專業評估團隊"); // 保險公司評估部門訂閱車禍事件 recorder.AccidentOccurred += companyA.InitialAssessment; recorder.AccidentOccurred += companyB.VehicleDamageAssessment; recorder.AccidentOccurred += companyB.MedicalAssessment; // 記錄並發布車禍事件 recorder.RecordAccident("市中心十字路口", DateTime.Now, new string[] { " 轎車A", "卡車B" }, new string[] { "駕駛員A輕傷", "乘客B重傷" }); } } ``` **你的比喻很棒,它們清晰地展現了事件驅動的模式:** * **事件是發布器發生的重要事情。** * **訂閱器是對這些事件感興趣的對象。** * **處理程序是訂閱器在接收到事件通知後執行的具體動作。** 關鍵在於理解程式碼中的 **委託 (Delegate)** 定義了事件發生時,發布器會傳遞給訂閱 者的資料的「格式」和訂閱者需要提供的「處理方法」的簽名。而 **事件 (event)** 則是 發布器中讓訂閱者可以「註冊」他們符合這個「格式」的處理程序的地方。 所以,`RecordHandler` 只是我們在之前例子中使用的委託名稱,你可以根據不同的情境定 義不同的委託名稱和簽名,例如 `SecretMessageHandler` 和 `AccidentHandler`。事件的 名稱 (`Record`、`SecretMessageArrived`、`AccidentOccurred`) 也可以根據情境來命名 。 你的比喻是完全可行的,並且有助於理解事件驅動架構的靈活性和不同組件之間的鬆耦合。 --



※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 223.138.162.107 (臺灣)
※ 文章網址: https://webptt.com/m.aspx?n=bbs/heart/M.1745899696.A.892.html







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:Gossiping站內搜尋

TOP