跳到主要內容

我為何由OOP轉向函數式編程

 經過多年學習與使用物件導向程式設計(OOP),我漸漸轉向函數式編程結合模組化設計。

很多人學習OOP之後,認為寫程式都要套Pattern,物件要分層,宣告時要用介面而不要用類別。

這樣造成什麼結果呢?在沒必要抽象的類別大量使用抽象化設計,為了永遠用不到的彈性而去把程式寫得非常複雜,導致效能差得難以接受,為了提升效能只好大量使用快取,於是寫出來的程式又大又肥,完全沒有效率。

舉例來說,大部分的網站或是企業內部程式都很小,以企業網站為例,多年前用過一個 SageFrame 的C#架站機,它的優點是把網頁做成Web Part,每個Web Part都是獨立的Module,只要寫出ascx就可以拖拉放進去。乍看之下確實很好,開發後就發現很多困難,版型設計要符合它的設計,又因為Menu Module等把CSS設計卡住了。最要命的是運行時很慢,因為ascx都是動態編譯,加上架構複雜導致執行時會有不少的Exception產生,雖然例外被系統catch住,卻造成執行時極大的負擔。

今年敝公司遇到國外駭客在掃描網站漏洞時,就造成SageFrame幾度當機,雖然後來會恢復,但實在很令人難以接受。藉著要淘汰jQuery的機會,找年輕同事利用 Nuxt 完美複刻原本的官網,並且把原本讀資料庫的部份都改為讀取JSON檔案;最棒的是 Nuxt能夠布署為靜態HTML檔,只要把它設定成唯讀,就完全不用擔心駭客攻擊。

回來說程式風格,由於像Cursor這類AI自動產生程式越來越強,產生出來的程式確實可用,只要能確保輸入與輸出符合規格,又何必要堅持符合物件導向呢?

天下武功,雖快不破。能夠快速改變,符合規格才是王道。在大型複雜需求時,使用OOP增加彈性確實非常有用,但是在沒必要時,不需要為了OO而OO,寫程式要靈活,只要輸出九九乘法表,還把每個數字和四則運算都寫成物件不就是脫褲子放屁嗎?Think before you do it !


留言

這個網誌中的熱門文章

自然人憑證讀卡機驅動程式

鳥毅用的是第一代的自然人憑證讀卡機,EZ100PU(後來有同事買EZmini可以讀SIM卡似乎更好),每年報稅時用一次。 本來只是要申請些政府業務,一時之間找不到光碟,沒想到在 驅動程式下載 居然看到Linux和Mac的驅動程式,剩下的就是政府單位的網頁和程式應該改版了吧!!!

DBeaver 介面語言

DBeaver是我個人頗常用的一套跨平台Database管理工具,最近升級後發現Windows版本居然變成簡體中文,而且無法切換為英文。

如何將較高版本SQL Server複製到低版本SQL Server (降級為舊版)並保留權限及資料庫圖表

一般若是要將SQL Server裡的Database轉往其他Server時,最簡單的方式就是備份(Backup)後再還原(Restore),或者是䣃離(detach)後附加(attach)。 但是很不幸地,若是由較低版本(e.g. 2008)到較高版本(e.g. 2012)要怎麼辦呢?