PTT評價

[討論] FP正在殺死設計模式嗎?

看板Soft_Job標題[討論] FP正在殺死設計模式嗎?作者
ohmylove347
(米特巴爾)
時間推噓20 推:21 噓:1 →:109

拿策略模式舉例,因為正好在研究這個
http://i.imgur.com/UWc8gR6.jpg

Context 和 Strategy:組合關係,Context 持有 Strategy。

Strategy 和 ConcreteStrategyA/B:實現關係,ConcreteStrategyA 和 ConcreteStrategy

先簡單定義,策略模式是"將相同類型可互相替換的操作封裝成獨立策略,達到在運行時動態替換"的一種設計模式
Java要實現的話,比較普遍的作法:
1. 定義策略Class or Interface
2. 實現具體策略類
3. 創建上下文類管理策略的設定與使用

但是使用一些天生自帶FP特性的語言(現在用Kotlin
發現策略模式好像根本不需要
最簡單的方法是直接利用高階函數,把需要的操作當參數傳進去用
連定義Interface都省了,只要函數簽名相同都行

如果要限制操作種類
只要寫個枚舉類整理一下全部的操作就好,也不用額外的策略類跟上下文
還能隱藏策略的具體實現只讓選擇本身可見

看了看,好像策略模式用不太到?
是不是高階函數太好用了
只要關於動態行為的時候
用高階函數加個函數參數搞定
FP是不是某種程度上殺死設計模式了?

-----
Sent from JPTT on my Google Pixel 7 Pro.

--

※ PTT 留言評論
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.136.159.79 (臺灣)
PTT 網址
※ 編輯: ohmylove347 (114.136.159.79 臺灣), 06/25/2024 11:05:01 ※ 編輯: ohmylove347 (114.136.159.79 臺灣), 06/25/2024 11:06:15

sw1206/25 11:12設計模式,是從OO長出來的....

sw1206/25 11:12跟殺死沒關係。就不適用

※ 編輯: ohmylove347 (114.136.159.79 臺灣), 06/25/2024 11:14:51

NDark06/25 11:14OO就跟Scrum是一種理所當然 專注在他們想解決的課題才合理

papa51006/25 11:53是的 很多情境下可以設計更簡單,傳參數就好了

w000515106/25 13:22你的例子還是策略模式啊,只是interface省了而已

w000515106/25 13:22FP不是只是first call function就是FP

w000515106/25 13:23*first class function

brucetu06/25 13:52那你不就只有殺死策略模式-.- 舉個例子 singleton 呢?觀

brucetu06/25 13:52察者 / 裝飾器 / 發布訂閱等等常用的模式呢?你把這些拿

brucetu06/25 13:52出來看再看看 FP 再學一下 javascript 這種超高自由度的

brucetu06/25 13:52語言,再重新下結論不遲

brucetu06/25 13:53即使是 JS 也會用到各種設計模式

brucetu06/25 14:00高內聚低耦合可測試才是重點,OO或FP不重要也可以混用

wei11506/25 14:37設計模式也要看語言八 有些設計模式是在補語法的問題

wei11506/25 14:38有語言特性支援,很多技巧可以省略

MoonCode06/25 14:39還要配上好的型別系統才能用的爽

black257506/25 15:30殺死Pattern 不是好事嗎 如果今天語言能解決對應問題

black257506/25 15:30我不就不需要另外尻這些Pattern了

Lordaeron06/25 15:50台灣的另一個有趣的現象,就是大家的案子,基本上沒幾

Lordaeron06/25 15:50個"物件"會重用的,但大家就是天天design pattern.

NDark06/25 16:05那就是overdesign

NDark06/25 16:06但也跟案子的型態很有關

NDark06/25 16:06週期太短 產品風險太高無法迴避的 線上正常的 要減少重構

NDark06/25 16:07新code可以用更好的方法去實現 但不要回頭為了重用而重改

NDark06/25 16:07換言之 不是重構程式碼 而是重構人的思維模式

mercurycgt6806/25 16:49前公司架構師:我入行這幾年

mercurycgt6806/25 16:49從來不需要用什麼design pattern

NDark06/25 16:50不用的原因有可能已經是無招勝有招

NDark06/25 16:51因為對工作於設計模式出現之前的也是會有方法解決問題

NDark06/25 16:51設計模式只是把那些方法歸類取名

NDark06/25 16:51所以 不用 指得不是不用方法 而是那時還不叫設計模式

abccbaandy06/25 16:53推19F,一堆整個開發週期都只有一個impl的在那邊定

abccbaandy06/25 16:53interface超87,不定還會森77說你開發習慣不好XD

NDark06/25 16:57這就是overdesign 沒有擴充需求應是搞需求出來

NDark06/25 16:57設計是為了需求服務 這點很多人沒搞懂

NDark06/25 16:58在需求很不明確或是可以預期跳躍的時候 要盡量少系統與架構

k79897686906/25 18:41FP就是一種可以一直串的設計模式啊 要盡量寫pure func

k79897686906/25 18:41tion

wulouise06/25 18:47原來fp是說functional programming.. DP就是有需要才用

recorriendo06/25 19:16你說的模式本身就可以當作是FP和OOP的結合

recorriendo06/25 19:18基本的OOP 每個物件就可以視為帶有一組"背景資料"

recorriendo06/25 19:18 但方法函式不能"動態擴充"

recorriendo06/25 19:20而純FP則是沒有context的概念 你的模式等於把兩方

recorriendo06/25 19:20加上各自缺少的部分

recorriendo06/25 19:21有沒有必要當然是取決於現實需求

KY199806/25 20:50你應該多看原始碼,其實用不少,你同事會不會又是另一回事

blackdiz06/25 21:29這支影片的觀點滿類似的,可以參考看看

blackdiz06/25 21:29https://youtu.be/srQt1NAHYC0

foxbrush06/25 21:56*定義Interface都省了,只要函數簽名相同都行* <= 你自

foxbrush06/25 21:56己都說了函數簽名仍要相同,不過是語言特性省去寫Interf

foxbrush06/25 21:56ace,還是一樣的pattern

superpandal06/25 23:32設計模式就是oop如Java 因為語言限制而產生的經驗法

superpandal06/25 23:34則 即便你不知道什麼叫作策略模式 你依照限制依究能

superpandal06/25 23:36產生出來而不用看書 只有這類的語言才講究這種東西

superpandal06/25 23:40fp或動態語言很爽的其實可以不用管這種東西 而程式碼

superpandal06/25 23:41品質最終還是取決於個人的心態和目的

superpandal06/26 00:05記得在對岸論壇看過某句話很有道理 忘記在哪 大概意

superpandal06/26 00:07思是人們發明新概念與觀點方式用來解決問題 然而該事

superpandal06/26 00:08物會用某種型式反過來束縛你

superpandal06/26 00:10不過意思差不多可以類比成獨孤九劍和一般劍法

vi00024606/26 00:31看情況吧 如果你是要寫一個plugin給別人用 定interface

vi00024606/26 00:32就滿重要的 就好像電線之於插座 用電線可以接上任何電

vi00024606/26 00:32器 但要是220v接到100v呢 這時就需要靠interface來限定

vi00024606/26 00:32接口長怎樣

vi00024606/26 00:34這世界的電器百百種 有個既成的規格可以讓電器開發商

vi00024606/26 00:35不需煩惱接口的事 當然小專案就不需要考慮這些了

vi00024606/26 00:35能動比較重要

abccbaandy06/26 00:49樓上這種教科書般的例子實際很少有吧,真要說手機快充

abccbaandy06/26 00:49不也搞了一堆特規...

DrTech06/26 02:16台灣沒什麼人在寫十萬行起跳的程式碼framework,不用開發f

DrTech06/26 02:16ramework給百人,千人,萬人用。當然覺得不需要設計模式。

DrTech06/26 02:16你寫的程式頂多幾千行,頂多2-3個人會看第二次,就很了不

DrTech06/26 02:16起了。當然不需要設計模式也能做得更好。

DrTech06/26 02:21設計模式的聖經書書名都說了:Elements of Reusable Objec

DrTech06/26 02:21t-Oriented Software

DrTech06/26 02:22因為你寫的,不需要一直給別人重複使用,當然不需要設計模

DrTech06/26 02:22式。

brucetu06/26 08:28讓我用綠豆糕的角度回答這個問題,我覺得設計模式是許多

brucetu06/26 08:28種可用來描述演算法的常用模式,一個問題可以有多種不同

brucetu06/26 08:28的解,你的解題思路不同就會選用不同的模式,倒不一定是

brucetu06/26 08:28為了重用程式碼。就像一個問題可以迴圈解也可以遞迴解,

brucetu06/26 08:29也還可以用狀態機解。套用模式的好處是別人容易看懂你在

brucetu06/26 08:29做什麼

recorriendo06/26 08:36沒有完美的語言 模式也只是前人在補強功能的各種方

recorriendo06/26 08:36式中歸納出來供人借鑒的

recorriendo06/26 08:36這些被歸納出來的模式 就是有經過時間證明其價值

recorriendo06/26 08:36 要不照模式 當然可以 不過多數時候是幾個月後就會

recorriendo06/26 08:36後悔當初自以為的天才hack

superpandal06/26 09:25十萬行的多數是屎山 最少行數最簡短的實現一樣的功能

superpandal06/26 09:27才是好的 物件導向也只是其中一種方式

superpandal06/26 09:32這就是套路或者稱作是定石摟 然而並不需要專門去學才

superpandal06/26 09:33會了解 如上所說 這只是限制下的經驗 看了這篇說實話

WTS2accuracy06/26 09:34什麼鬼邏輯...FP只是換個方式實作設計模式而已

superpandal06/26 09:34我也不知道什麼叫作策略模式 但我就寫出一模一樣的東

superpandal06/26 09:34西過

superpandal06/26 09:36要看語言本身特性 對很多語言來講是可以跳過這環節的

zxcasdjason106/26 11:38個人淺見是,設計模式像心法,OO, FP 則像外功。FP

zxcasdjason106/26 11:38是否好用,還是要看你用的語言特性,像原po提到的J

zxcasdjason106/26 11:38S, class 只是語法糖,跟 java, c#, 本質就不同,

zxcasdjason106/26 11:38對 JS 來說,用 function 更直覺。 自己工作上從 O

zxcasdjason106/26 11:38O 轉 FP 一段時間, 相比 OO 來說,FP 設計上講究

zxcasdjason106/26 11:38狀態皆來自參數,無副作用的函式測試好寫,也好維

zxcasdjason106/26 11:38護。

wulouise06/26 12:54咦原來十萬就是很多了...

ma72106/26 14:01自己跟別人看好懂好維護就行

KY199806/26 14:19JS轉TS時,generics應該會讓你不太爽

superpandal06/26 15:46實際上設計模式還是外功 你整的再好也只是在上面玩耍

superpandal06/26 15:49能整到十萬我懷疑它的品質以及可維護程式可控性

angusyu06/26 20:30怎麼可能取代策略模式…我一樣用策略模式不會塞lambda

Lipraxde06/26 20:36寫十萬行 code... 有兩種,一種是需要寫十萬行...另一

Lipraxde06/26 20:36種是寫了十萬行,就像 design pattern 一樣,一種是需

Lipraxde06/26 20:36要用...另一種是用下去了

viper970906/26 21:19台灣的軟體生命週期太短+1

peter9806/26 22:55design pattern常用的可以用,不常用的就別用,很多desig

peter9806/26 22:56n pattern寫到最後會讓人無法trace code,如果只是個幾萬

peter9806/26 22:56行而已的專案就別全部硬要套design pattern了,常用的倒

peter9806/26 22:56是可以用,比如builder/factory/singleton/deco等

peter9806/26 22:57另外台灣的軟體不是軟體,板子換了軟體重寫,也不需要用

peter9806/26 22:58design pattern,寫code可以hardcode就好,速度快,出錯

peter9806/26 22:58也沒關係,反正出bug的時候,該軟體可能都快結束生命了

peter9806/26 22:58反正出問題也不需要再修~ 何必搞design pattern?

appleway06/26 23:24不同的語言有不同的DP. Haskell有lens 但是Java不用

CoNsTaR06/27 01:34FP 以外唯一支持 C++ TMP,C++20/23 加上 boost::mp11

CoNsTaR06/27 01:34 根本 compile-time dependent type,幾乎是想做什麼都可

CoNsTaR06/27 01:34以幫你 type check

CoNsTaR06/27 01:34傳統設計模式相較之下就像是二維平面的小孩玩具一樣幫 QQ

Suleika06/27 17:10interface寫好,設計想得很好,結果同類型新專案不拿去

Suleika06/27 17:10共用的場景太多了,寫的讓同事看得懂優先級可能高點

ko27tye06/27 19:23選擇用什麼pattern之前 先考慮同事的程度吧

Lipraxde06/27 20:28Builder 跟 factory 不是很讓人喜歡...看到生搬硬套的

Lipraxde06/27 20:28用法就很討厭