我的識道、行道、佈道之旅——從自定義ORM工具到NHibernate
說明:本文專為圖靈社群活動“喚醒你心中的佈道師”而寫,歡迎大家積極參與!
在2005年,參與的首個專案是維護一個定製化的管理資訊系統(MIS),主要應用的技術是ASP.NET、C#、SQL Server,美其名曰經典的三層架構,而實際情況是臃腫而混亂的表示層、乾癟的業務層、龐雜的資料訪問層。然而當時只有埋頭學習的份兒,還有就是一邊修改老Bug一邊製造新Bug(可是現場維護哦)。接下來的兩年,則是在不斷開發新專案、學習新技術中度過的。
初識道——啃《企業應用架構模式 》
在2008年,機緣巧合下載了一本名為《Patterns of Enterprise Application Architecture》(《企業應用架構模式 》,Martin Fowler著)的電子書,在金山詞霸的幫助下,終於把它啃下來了。當時讀完後的喜悅溢於言表,對於書中提到各種企業應用架構模式更是愛不釋手、躍躍欲試。
初行道——嘗試編寫自定義ORM工具
於是,開始反思兩年多來開發中的各種得失,發現資料訪問層中有許多非常簡單的SQL語句,做的只是CRUD(Create、Retrieve、Update、Delete,即增查改刪)的基本操作,而且規律性很強。由此萌生了編寫程式碼生成器的念頭。經過一段時間的學習及實踐,在應用了Table Module(表模組)、Query Object(查詢物件)等模式後,終於完成了能根據資料庫表自動生成同名表物件類的程式碼生成器、以及配套使用的DataModelManager<T>和QueryConditionJointer兩個輔助類。
【注】ORM是Object Relational Mapping的縮寫,即物件關係對映,是一種程式設計技術,用於實現物件導向程式語言裡不同型別系統之間的資料轉換。
其實,當完成程式碼生成器及相關輔助類時,對於ORM的概念並不十分清楚,其目的只是為了減少手工編寫CRUD等基本操作SQL語句的工作量,從而提高工作效率。
初佈道——應用自定義ORM工具
自定義ORM工具初步完成後,先在一個小專案中試用。與其說是佈道,不如說是先斬後奏。一開始我就告訴專案組的同事,那些同名表物件類、以及CRUD基本操作的程式碼由我包了。大家一開始覺得我在吹牛,可是當第二天大家看到那些工工整整的程式碼時顯得既吃驚又好奇。這時我才把自定義ORM工具正式介紹給大家。從此以後,這套自定義ORM工具便推廣開來,成為了隨後多個專案的必備工具。當然,在開發過程中也遇到不少問題,其中大多數都順利解決了,但仍有幾個無法攻克。
再識道——讀《領域驅動設計與模式實戰》
上面提到,雖然自定義ORM工具可以解決大多數問題,並大大提高開發效率,但是隨著專案規模的擴大和業務規則複雜度的增加,程式碼變得越來越難以控制,重複程式碼越來越多,程式碼質量越來越差。
從那時起,我開始尋找問題及其解決方案。長話短說,最終將問題定位於以資料為中心的設計思想上,當專案規模較小、業務規則相對簡單時,這種設計思想可以從容應對。而自定義ORM工具也正是基於這種設計思想開發出來的。至於解決方案就是尋求一種設計思想來處理規模更大、複雜度更高的專案。
當接觸到領域驅動設計(Domain-Driven Design)思想時,直覺告訴我,這就是要尋找的理想解決方案。後來讀了《領域驅動設計與模式實戰》(Jimmy Nilsson著),這才豁然開朗,心中的疑團終於解開了!
再行道——學習NHibernate,重新設計架構
《領域驅動設計與模式實戰》中建議的基礎架構為NHibernate(NHibernate是面向.NET框架的ORM解決方案。主要用來把物件模型表示的物件對映到基於SQL的關係模型資料結構中去。),於是開始學習NHibernate,發現它功能強大,完全可以取代之前編寫的自定義ORM工具。因此決定完全拋棄自定義ORM工具,並根據領域驅動設計思想重新設計架構。
再佈道——從以資料為中心全面轉向以領域模型為中心
由於大家已經習慣了以資料為中心的開發思路,因此當我告訴大家,我們來學習一下功能強大的NHibernate、試試用領域驅動設計時,大家都表示反對(除我之外),因為表示同意就意味一個全新的開始,即從以資料為中心轉向以領域模型為中心,而這幾乎是個180度的轉變,確實一時難以接受。
於是,故伎重演,我將專案中最複雜的核心業務邏輯部分承包下來,根據領域驅動設計思想進行設計、開發。完成後再逐句給大家講解,沒過多久大家就體會到其中的優勢,開始主動學習NHibernate、並模仿我的程式碼編寫相似的功能。雖然要走的路還很長,但這至少是個不錯的開始!
結束語
子曰:己所不欲,勿施於人。因此,佈道者在佈道前,須識道、行道,而佈道時應謹記“己之所欲,慎施於人”,身教重於言傳,務必身體力行、以身示道!
我的識道、行道、佈道之旅沒有終點,希望能結識更多的同路人 :D
相關文章
- 企業版本控制的改革:從ClearCase到Git--我的佈道之旅Git
- 自定義ORM框架ORM框架
- 谷歌開發者工具自定義佈局谷歌
- 從一道面試題,到“我可能看了假原始碼”面試題原始碼
- Eloquent ORM 自定義 builderORMUI
- 企業C++大型系統遺留程式碼變遷的佈道之旅C++
- MySQL 效能壓測工具,從入門到自定義測試項MySql
- 五位準佈道師誕生——喚醒你心中的佈道師活動總結
- Laravel 自定義通知頻道,至 企業微信機器人Laravel機器人
- 如何在Android TV 桌面新增自定義頻道/節目Android
- .net core自定義高效能的Web API服務閘道器WebAPI
- 從一道PG知識的選擇題談起
- MySQL 效能壓測工具-sysbench,從入門到自定義測試項MySql
- 禪道命名標識約定-敏捷在禪道(五)敏捷
- 爪哇,我初學乍道
- 個人網站遷移之旅:從部落格到知識庫,從 Hexo 到 Docusaurus網站Hexo
- 分享30道Redis面試題,面試官能問到的我都找到了Redis面試題
- 《音效行業白皮書》:從小眾到流行,酷狗蝰蛇音效佈局音效行業賽道行業
- 在 KubeSphere 中使用 APISIX Ingress 閘道器接入自定義監控API
- 從一道面試題認識函式柯里化面試題函式
- 我與Linux的相識之旅Linux
- Clang 之旅--[翻譯]新增自定義的 attribute
- 從JDBC到ORM的事務實現JDBCORM
- 多佈局的自定義AdapterAPT
- 從0到1Android自定義View(一)零散基礎知識AndroidView
- UICollectionView自定義佈局(二)UIView
- UICollectionView自定義佈局(一)UIView
- Django 自定義管理命令:從入門到高階Django
- AI閘道器對企業的意義及如何構建 AI 閘道器AI
- Docker大行其道—初識Docker
- 從兩道面試題說起面試題
- conda的配置檔案.condarc頻道優先順序和定義頻道
- 分享幾道我們面試前端的“真題”面試前端
- U盤中毒了怎麼恢復檔案,我來說道說道
- 從輸入URL到頁面載入的過程?由一道題完善自己的前端知識體系!前端
- Vue從甜小白到皮大佬系列(四) 自定義指令Vue
- 【iOS】關於 UICollectionView 的自定義佈局iOSUIView
- 深入解析Android的自定義佈局Android