作者steven11329 (清新柳橙)
看板Soft_Job
标题Re: [心得]以策略模式重构switch case或if (影片)
时间Wed Jan 20 14:42:32 2021
※ 引述《electgpro (Ray)》之铭言:
: 首先,这根本不能算「策略模式」,只能算是一般的多型应用,不过我这边不是很想讨
: 论 strategy pattern 本身,有兴趣的可以去 wiki 比较一下差在哪里。
: ## 所以原本的 code 到底有什麽问题?
: 基本上有两点可以讨论:
: 1. 不同计算方法都被写在同一个 function 里
: 2. 如果 caller 丢了一个不认识的 shipperName,这 function 就会丢出 exception
: ### 1. 不同计算方法都被写在同一个 function 里
: 原 solution 定义了一个 interface,所以要实作这个 function 必须建立一个 class
: 来实作这个 interface,所以算是有解决到这个问题。但其实单纯的为不同的 shipper
: 建立相对应的 function 就行了,并没有必要多一个 interface:
原原 PO 用 interface 的好处是,shipper 有新的行为时。
可以很简单的在 interface 加新的 function。
同时可以检查有 implement Shipper 的 class 要加入新的 function。
感觉上,弹性更好。
缺点嘛... 如果 shipper 很多时每个都要再补 function 是比较累一点。
: ### 2. 如果 caller 丢了一个不认识的 shipperName,这 function 就会丢出
: exception
: 假设今天,我们新增了一个货运商,工程师记得要建立一个新的 class 并实作 Shipper
: interface,但是他忘了把它加入 shippers hashmap,又刚好没写测试,於是 rollout
: 之後就触发了 exception,就 QQ 惹。
: 有没有方法可以保证不会有例外呢?这问题就有点有趣了,但首先让我们先换一个语言
以下略...
: 因为 kotlin 的 when 有提供 exhausive check 的功能。 (以下略...
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
你都说了是 kotlin 功能了,这已经跟 code 的 design 无关了吧...
只能说用 kotlin 有提供更好的预先除错功能而已。
--
人生宗旨:摔不死!那就再来吧!
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 118.169.245.81 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Soft_Job/M.1611124959.A.D93.html
※ 编辑: steven11329 (118.169.245.81 台湾), 01/20/2021 14:44:50
1F:→ electgpro: code 跟 design 跟 language 当然有关系 01/20 14:47
2F:→ electgpro: 尤其是原原 po 後来也有拿其他语言出来 01/20 14:51
3F:→ electgpro: 拿 kotlin 出来不为过吧? 01/20 14:51
4F:→ electgpro: BTW 我没有说 interface 有什麽问题,我只有说那不是 01/20 14:53
5F:→ electgpro: 策略模式而已 01/20 14:53
6F:→ electgpro: 至於你说的「弹性」我觉得 ok,只是在这边没必要 01/20 14:54
7F:推 ura1210: 如果说因为改动interface 导至全部的implement class 都 01/29 09:11
8F:→ ura1210: 必须改动 我不认为这也叫做弹性 倒不如说是防呆吧 我认 01/29 09:11
9F:→ ura1210: 为做法应该偏向依职责需求做出拆解不同介面吧 01/29 09:11