[討論] FP正在殺死設計模式嗎?
拿策略模式舉例,因為正好在研究這個
http://i.imgur.com/UWc8gR6.jpg
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.
--
設計模式,是從OO長出來的....
跟殺死沒關係。就不適用
OO就跟Scrum是一種理所當然 專注在他們想解決的課題才合理
是的 很多情境下可以設計更簡單,傳參數就好了
你的例子還是策略模式啊,只是interface省了而已
FP不是只是first call function就是FP
*first class function
那你不就只有殺死策略模式-.- 舉個例子 singleton 呢?觀
察者 / 裝飾器 / 發布訂閱等等常用的模式呢?你把這些拿
出來看再看看 FP 再學一下 javascript 這種超高自由度的
語言,再重新下結論不遲
即使是 JS 也會用到各種設計模式
高內聚低耦合可測試才是重點,OO或FP不重要也可以混用
設計模式也要看語言八 有些設計模式是在補語法的問題
有語言特性支援,很多技巧可以省略
還要配上好的型別系統才能用的爽
殺死Pattern 不是好事嗎 如果今天語言能解決對應問題
我不就不需要另外尻這些Pattern了
台灣的另一個有趣的現象,就是大家的案子,基本上沒幾
個"物件"會重用的,但大家就是天天design pattern.
那就是overdesign
但也跟案子的型態很有關
週期太短 產品風險太高無法迴避的 線上正常的 要減少重構
新code可以用更好的方法去實現 但不要回頭為了重用而重改
換言之 不是重構程式碼 而是重構人的思維模式
前公司架構師:我入行這幾年
從來不需要用什麼design pattern
不用的原因有可能已經是無招勝有招
因為對工作於設計模式出現之前的也是會有方法解決問題
設計模式只是把那些方法歸類取名
所以 不用 指得不是不用方法 而是那時還不叫設計模式
推19F,一堆整個開發週期都只有一個impl的在那邊定
interface超87,不定還會森77說你開發習慣不好XD
這就是overdesign 沒有擴充需求應是搞需求出來
設計是為了需求服務 這點很多人沒搞懂
在需求很不明確或是可以預期跳躍的時候 要盡量少系統與架構
FP就是一種可以一直串的設計模式啊 要盡量寫pure func
tion
原來fp是說functional programming.. DP就是有需要才用
你說的模式本身就可以當作是FP和OOP的結合
基本的OOP 每個物件就可以視為帶有一組"背景資料"
但方法函式不能"動態擴充"
而純FP則是沒有context的概念 你的模式等於把兩方
加上各自缺少的部分
有沒有必要當然是取決於現實需求
你應該多看原始碼,其實用不少,你同事會不會又是另一回事
這支影片的觀點滿類似的,可以參考看看
*定義Interface都省了,只要函數簽名相同都行* <= 你自
己都說了函數簽名仍要相同,不過是語言特性省去寫Interf
ace,還是一樣的pattern
設計模式就是oop如Java 因為語言限制而產生的經驗法
則 即便你不知道什麼叫作策略模式 你依照限制依究能
產生出來而不用看書 只有這類的語言才講究這種東西
fp或動態語言很爽的其實可以不用管這種東西 而程式碼
品質最終還是取決於個人的心態和目的
記得在對岸論壇看過某句話很有道理 忘記在哪 大概意
思是人們發明新概念與觀點方式用來解決問題 然而該事
物會用某種型式反過來束縛你
不過意思差不多可以類比成獨孤九劍和一般劍法
看情況吧 如果你是要寫一個plugin給別人用 定interface
就滿重要的 就好像電線之於插座 用電線可以接上任何電
器 但要是220v接到100v呢 這時就需要靠interface來限定
接口長怎樣
這世界的電器百百種 有個既成的規格可以讓電器開發商
不需煩惱接口的事 當然小專案就不需要考慮這些了
能動比較重要
樓上這種教科書般的例子實際很少有吧,真要說手機快充
不也搞了一堆特規...
台灣沒什麼人在寫十萬行起跳的程式碼framework,不用開發f
ramework給百人,千人,萬人用。當然覺得不需要設計模式。
你寫的程式頂多幾千行,頂多2-3個人會看第二次,就很了不
起了。當然不需要設計模式也能做得更好。
設計模式的聖經書書名都說了:Elements of Reusable Objec
t-Oriented Software
因為你寫的,不需要一直給別人重複使用,當然不需要設計模
式。
讓我用綠豆糕的角度回答這個問題,我覺得設計模式是許多
種可用來描述演算法的常用模式,一個問題可以有多種不同
的解,你的解題思路不同就會選用不同的模式,倒不一定是
為了重用程式碼。就像一個問題可以迴圈解也可以遞迴解,
也還可以用狀態機解。套用模式的好處是別人容易看懂你在
做什麼
沒有完美的語言 模式也只是前人在補強功能的各種方
式中歸納出來供人借鑒的
這些被歸納出來的模式 就是有經過時間證明其價值
要不照模式 當然可以 不過多數時候是幾個月後就會
後悔當初自以為的天才hack
十萬行的多數是屎山 最少行數最簡短的實現一樣的功能
才是好的 物件導向也只是其中一種方式
這就是套路或者稱作是定石摟 然而並不需要專門去學才
會了解 如上所說 這只是限制下的經驗 看了這篇說實話
什麼鬼邏輯...FP只是換個方式實作設計模式而已
我也不知道什麼叫作策略模式 但我就寫出一模一樣的東
西過
要看語言本身特性 對很多語言來講是可以跳過這環節的
個人淺見是,設計模式像心法,OO, FP 則像外功。FP
是否好用,還是要看你用的語言特性,像原po提到的J
S, class 只是語法糖,跟 java, c#, 本質就不同,
對 JS 來說,用 function 更直覺。 自己工作上從 O
O 轉 FP 一段時間, 相比 OO 來說,FP 設計上講究
狀態皆來自參數,無副作用的函式測試好寫,也好維
護。
咦原來十萬就是很多了...
自己跟別人看好懂好維護就行
JS轉TS時,generics應該會讓你不太爽
實際上設計模式還是外功 你整的再好也只是在上面玩耍
能整到十萬我懷疑它的品質以及可維護程式可控性
怎麼可能取代策略模式…我一樣用策略模式不會塞lambda
寫十萬行 code... 有兩種,一種是需要寫十萬行...另一
種是寫了十萬行,就像 design pattern 一樣,一種是需
要用...另一種是用下去了
台灣的軟體生命週期太短+1
design pattern常用的可以用,不常用的就別用,很多desig
n pattern寫到最後會讓人無法trace code,如果只是個幾萬
行而已的專案就別全部硬要套design pattern了,常用的倒
是可以用,比如builder/factory/singleton/deco等
另外台灣的軟體不是軟體,板子換了軟體重寫,也不需要用
design pattern,寫code可以hardcode就好,速度快,出錯
也沒關係,反正出bug的時候,該軟體可能都快結束生命了
反正出問題也不需要再修~ 何必搞design pattern?
不同的語言有不同的DP. Haskell有lens 但是Java不用
FP 以外唯一支持 C++ TMP,C++20/23 加上 boost::mp11
根本 compile-time dependent type,幾乎是想做什麼都可
以幫你 type check
傳統設計模式相較之下就像是二維平面的小孩玩具一樣幫 QQ
interface寫好,設計想得很好,結果同類型新專案不拿去
共用的場景太多了,寫的讓同事看得懂優先級可能高點
選擇用什麼pattern之前 先考慮同事的程度吧
Builder 跟 factory 不是很讓人喜歡...看到生搬硬套的
用法就很討厭
爆
Re: [請益] 怎麼抓到題材股?原本我主要是以基本面價值為主的波段 今年為了順應盤勢 所以就開發一套以資金流向為主的波段 先給大家看一下紀錄的進出場表 可能在同學會有看過54
[心得] 資金管理策略研究-馬丁格爾vs反馬丁格爾blog完整文章: 最近開始研究資金管理策略, 第一個想到的主題就是非常有名的馬丁格爾策略 & 反馬丁 格爾策略, 目前第一階段研究得差不多了, 就來這邊跟大家分享下研究結果。 只用一句話解釋這兩種資金管理策略如下:32
Re: [請益] 為何有人相信個人靠程式交易可賺錢有可能 交易策略 就是 系統 K線 就是訊號 就是訊號與系統 只要進來的訊號20
[心得] 以技術分析做程式交易操作(Part.2)上一篇在這邊 趁著年假有點時間補充一些關於操作策略的心得 上篇提到說一套策略是程式選股+出場操作策略組合而成 也就是整個程式操作要經過「選股→買入→持有→賣出」這幾個階段18
[請益] 如何選擇適合的設計模式小弟在設計系統的功能時,時常會不知該用什麼準則來判斷適合的模式 之前曾在某個網站中看到同一個問題,拿來套進 23 個模式之中 當下看完後,心想:所以大部份的問題都可以任意套用模式? 應該不是這樣子,否則四人幫就沒有必要把它們分成三大類了 那到底該如何決擇正確的模式17
[心得] 如何分類桌遊的種類 - 淺談BGG遊戲機制一部落格 應該比較好讀版? 先打預防針,遊戲定義並非絕對,大多數都是靠玩家本身的回饋而定義出遊戲的類型。 所以有人會覺得「阿瓦隆」是策略遊戲、「歷史巨輪」是家庭遊戲,這個非常正常。 但,若是BGG上,大部分的玩家觀點都認為某遊戲是某種類,還是有一定的參考價值。12
Re: [心得]以策略模式重構switch case或if (影片)終於有空來加入討論啦~ 這邊有 markdown 好讀版: 這邊我也來提一下我的看法。為了閱讀方便我把一些 code snippet 複製在這邊: ```java= public double shippingFee(String shipper, double length, double width, double3
Re: [心得]以策略模式重構switch case或if (影片)上回用 Java + IntelliJ 來重構一堆 if/else 的計算運費範例, 這次改用 C# + Rider 來重構一樣的例子,方便習慣 C# 的朋友參考與練習, 不過這次刻意改用 Func<T> 來當作 strategy 的實作內容, 以 function 來取代,省去 class + interface 的部份。 兩種作法適用場景不同,東西夠小夠單純,想要少一點 class/interface 等 elements,3
Re: [問卦] 為什麼吳宗憲兒子女兒差那麼多看到推文中有人說良率 提升良率的方法,就是不良品檢出,銷毀 但除非是幾個月前墮胎(若能看出未來不成才而墮胎,不知有多少人肯做) 另一個方法就是修正了 以自動控制模型來說1
Re: [心得]以策略模式重構switch case或if (影片)原原 PO 用 interface 的好處是,shipper 有新的行為時。 可以很簡單的在 interface 加新的 function。 同時可以檢查有 implement Shipper 的 class 要加入新的 function。 感覺上,彈性更好。 缺點嘛... 如果 shipper 很多時每個都要再補 function 是比較累一點。