我們究竟應不應該使用框架?
AxonIQ商業主管及Axon框架佈道師Frans van Buul近日在其部落格中發表了一篇關於框架和類庫孰優孰劣的文章,引起了人們的熱議。雖然很多人提倡類庫反對框架,但Frans仍然提出了一些傾向於框架的見解,詳細內容請見正文。
AxonIQ商業主管及Axon框架佈道師Frans van Buul近日在其部落格中發表了一篇關於框架和類庫孰優孰劣的文章,引起了人們的熱議。儘管很多人更傾向類庫,但Van Buul仍然認為框架對商業程式開發非常有價值,尤其是那些使用了CQRS(命令查詢職責分離)、DDD(領域驅動設計)、event sourcing(事件溯源)等架構的應用程式。
Van Buul認為,類庫是由類和函式組成的一組程式碼,這些程式碼可供應用程式使用,但本身又不是應用程式的一部分,應用程式通過函式呼叫或方法呼叫與類庫互動。而框架則是一種特殊的類庫,應用程式實現了框架提供的介面,或者使用框架提供的註解。程式碼在兩者中的呼叫方向完全相反,框架呼叫應用程式程式碼,而類庫則被應用程式程式碼呼叫。
Van Buul認為,幾乎所有的應用程式都用到了框架,即使只是一個單純的Java應用程式也在無形中使用了框架,畢竟Java程式碼仍然需要執行在Java虛擬機器這個“大框架”中。他還指出,大多數商業應用程式都會提供基於Web的介面,並使用抽象層為應用程式建立入口,這其實也是在使用框架。
Van Buul認為,框架之所以優越,是因為CQRS、DDD以及事件溯源。首先使用框架可以把程式設計師從底層開發中解放出來,只需要關注業務邏輯。他指出,很多時候,人們沒有使用類庫而是選擇構建自己的框架,這隻會讓事情變得更復雜,也會讓程式設計師花費很多額外的時間。他強烈反對這種情形,因為這樣不但會加大風險,還會增加成本。他引用了CQRS之父Greg Yong在2016年DDD歐洲大會中的演講原話:
不要自己開發CQRS框架。
Peter Kummins則認為,框架是系統開發中最大的反模式,他認為框架難於上手,也大大增加了專案的複雜度和依賴性。他認為軟體開發應該保持簡單,使用穩定的基礎工具,儘量採用核心語言方案,最大程度地避免使用框架或類庫。
Kummins反對框架的主要原因有:
難學,技術很難應用到其他地方
限制了開發人員的創造性
增加了專案的複雜度
框架隨時有被遺棄的可能性
Mathias Verraes同意Van Buul對框架的定義,並做了如下引用:
類庫被你的程式碼呼叫,但框架主動呼叫你的程式碼。
他反對使用框架,認為一個超過十年的框架將比那些難懂、過時甚至抽象混亂的程式碼更難維護。他建議只在短週期開發專案中使用框架,如果開發週期允許,還是儘量避免使用框架。
Tomas Petricek也同意Van Buul對框架的定義,但他認為使用框架最大的問題是難以共容。當使用兩種框架時,幾乎很難把一個框架應用到另一個框架中,但是類庫就可以很容易的避免這個問題。他同時也認為框架很難深入理解並且會影響你的編碼方式。
Petricek傾向於使用功能類庫的設計原則,並指出,避免使用框架和回撥的一種方法是使用非同步工作流和基於事件驅動的程式設計機制。這種機制並不是要提供抽象函式或虛擬函式,而是在需要完成某些操作時觸發事件。他還指出,事件機制並不能讓我們控制什麼時候發生事件,我們只能控制事件發生後的東西。如果你不喜歡這種方式的話,就只能使用可組合的類庫,而且要為問題的不同部分選擇不同的類庫。
最後, Van Buul強調,類庫比框架更靈活,但這也要取決於所使用的框架。如果是不能擴充套件的框架,那自然也就沒什麼靈活性可言,但如果是定義了開放性介面的開源框架,其靈活性則一點不會比類庫差。
英文原文:https://www.infoq.com/news/2019/02/frameworks-libraries-axon
相關文章
- 我們應該使用 TLS1.3 嗎TLS
- Vue 3是一個錯誤,我們不應該再犯。Vue
- 我不應該用JWT的!JWT
- 我們都應該學習PHPPHP
- 我們應該如何給需求排序?排序
- 學習Tomcat,我們應該懂的Tomcat
- 我們應該測試 DAO 層嗎?
- 2020年,為什麼我們應該使用abapGit代替SAPLinkGit
- 對於Linux,我們應該學什麼?Linux
- 關於註解我們應該知道的
- 我們究竟該怎麼定義「率土like」?
- 我們應該如何選擇蘋果簽名?蘋果
- 面對變革,我們應該怎麼做?
- 【單頁應用】我們該如何處理框架彈出層層級關係?框架
- 我,28歲,應不應該從普通工程師轉行到AI?工程師AI
- Airbnb棄用之後,我們還應該用ReactNative嗎?AIReact
- 生物識別技術:我們應該擔心嗎?
- 找工作時,我們應該思考的幾件事情。
- 淺談AsyncLocal,我們應該知道的那些事兒
- web前端各類框架工具不斷頻繁更新,我們要怎麼應對?Web前端框架
- 我應該使用 MongoDB 還是 PostgreSQL? - AmritMongoDBSQL
- 當我們在聊 Serverless 時你應該知道這些Server
- 時到如今,我們應該如何評價《死亡擱淺》?
- 119的節日的安排,我們應該做些什麼
- 我們應該怎樣學習嵌入式系統
- 面試官:集合使用時應該注意哪些問題?我:應該注意該注意的問題!面試
- 進行直播搭建前,我們應該瞭解的常識
- 我們應該如何編寫高質量的前端程式碼前端
- 我們的系統應該配置哪些監控報警項?
- URL中的空格、加號究竟應該使用何種方式編碼
- 我們在編寫python程式碼時應該注意那幾件事!Python
- 今天,我們為什麼應該讀懂華為人工智慧?人工智慧
- 印表機不識別墨盒?我們總結了應對方法
- 普通公司不應該使用K8s - Anurag GoelK8SGo
- 當容器應用越發廣泛,我們又該如何監測容器?
- 智雲通CRM:客戶說“太貴了”,我們該如何應對?
- 我們應該如何(以及為什麼)要將Typescript與Express、nodejs一起使用(譯文)TypeScriptExpressNodeJS
- Caffe 作者賈揚清:我們應該跳出框架的桎梏,往更廣泛的領域尋找價值框架