相信很多人都有類似的經歷:隨著業務越來越多, 系統的越來越復雜, 我們都會感覺我們的代碼越來越難看, 重復代碼越來越多, 越來越難以維護。 恩, 這確實是個問題, 但有沒有可能解決的辦法? 老實說, 確實很難, 但不是完 " /> 国产一区免费在线观看,青柠在线观看视频在线,亚洲精品视频免费看

天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

以數據庫為中心的系統中的業務邏輯組織方式

前言
相信很多人都有類似的經歷:隨著業務越來越多, 系統的越來越復雜, 我們都會感覺我們的代碼越來越難看, 重復代碼越來越多, 越來越難以維護。 恩, 這確實是個問題, 但有沒有可能解決的辦法? 老實說, 確實很難, 但不是完全沒有可能, 或者說有改善的可能。 最近就關于這方面進行了一些學習和考慮, 以純理論的方式總結了一下, 希望能對對這方面有興趣的同學有所幫助。

很多面向應用的系統是以數據為中心的, 在這些系統中, 以數據庫存儲數據; 業務邏輯代碼則根據需求圍繞著數據庫中存儲的數據來組織邏輯;以購買商品的系統為例, 商品數據, 交易數據和用戶數據是系統中的核心數據, 絕大多數業務代碼則是根據需求來倒騰這些數據。這個非常符合那個關于程序的定義: 程序 = 數據 + 行為; 在這里, 數據是數據庫中的數據, 行為則對應業務邏輯。

對于所構建的系統, 我們自然希望可擴展性好, 可維護性;這是一個非常有挑戰性對的事情, 大型的應用尤其如此; 能否真的做就在很大程度取決于邏輯的組織方式。 這篇文章大體介紹以數據庫為中心的應用中的三個典型的業務邏輯組織方式。

邏輯組織方式
事務腳本方式
這里的事務與數據庫術語事務有所區別, 這里的事務更多的指一次業務交互。

應用系統中, 大多數業務邏輯可以看做一系列子任務的集合; 比如用戶購買一個商品時, 可以大體分成幾步:

先根據商品的信息到數據庫中查詢是否有可銷售的商品存在;有的話, 添加一個用戶購買商品的購買記錄;然后把商品數量減少;其他事情, 比如發郵件通知用戶等。

以事務腳本方式組織代碼時, 業務邏輯組織上沒有層次之分, 在實現一個具體業務時, 根據其業務的需要從前到后進行一系列的事務調用; 就購買商品為例, 先從數據庫中查詢商品數量, 然后判斷是否足夠, 足夠的話添加用戶購買商品的記錄, 然后操作數據庫減少商品。這種方式有個明顯的特點, 一個事務腳本實現以一個用例或者或者一個功能。這個方式優點很明顯, 簡單,直觀, 易學易用,開發速度快;這些容易理解, 因為這些寫代碼的方式與直觀的思維方式類似, 在實際中, 很多系統都是這樣實現的;尤其那些快速開發系統; 但是抽象度低, 容易導致重復代碼多,與其他系統的耦合程度高, 維護麻煩,尤其是對于復雜的系統來說。 舉個例子來說,購買商品購買這個功能,桌面版提供了之后,手機版的也需要實現, 由于手機版與桌面版是兩個不同的用例, 如果用事務腳本來組織代碼的話, 很自然的就會出現類似的代碼出現在了不同的地方的情況。 一個很明顯的優化是封裝成函數, 但是封裝成函數這個事情的模塊化程度低, 在業務復雜的情況下, 對業務邏輯的有效管理和維護是一個挑戰。

事務腳本這種方式適用于相對簡單的業務邏輯環境,而且在現實中, 很多業務本身就是簡單的, 這種方式可以在開發高效, 運行高效的前提下工作的很好; 另外對于快速開發環境中也非常適用。 但是當業務邏輯復雜, 而且上線后維護期很長或維護量很大的系統來說,可能不是一種很好的方式。

表模塊方式
在事務腳本方式當中,很容易導致:相同或者類似的代碼重復出現;相關邏輯分布在多個地方。

對于前一個問題, 可以通過把相同或者相似邏輯封裝成函數來改進, 第二個問題通過流程或規范可以得到控制。 但是, 還是會在業務復雜的情況下對業務邏輯的有效管理和維護是一個挑戰 因為缺乏一種有效的編碼的機制來控制這樣的問題。
表模塊組織方可以從機制上提供一個相對好的解決辦法, 其大概思路是,把與一個或者多個數據庫表(或者視圖)有關的邏輯組織成一個類, 把對與這個表有關的邏輯組織成這個類的方法。以上面那個購買商品為例, 查詢商品是否足夠可能是一個單獨的方法, 修改商品數量是一個單獨的方法;購買商品是一個方法,所完成的事情就是把前面兩個方法組織起來。 一旦有了這個邏輯, 只要是需要用到購買商品邏輯的地方, 直接調用這個購買商品的方法就可以了; 除了這個購買商品之外, 其他與商品有關邏輯都組織在這個類里面,避免了與商品有關的邏輯分布到多個地方。

除了提供一個代碼組織的方式外,這種組織方式還有一些其他的好處:不需要數據庫表就直接可以測試,也便于打樁測試; 與很多數語言提供的數據庫操作API配合使用方便, 很多數據庫操作API返回的結果都市記錄集的方式, 尤其以微軟提供的相關API為典型代表, .NET提供的Dataset更是功能強大。實際上, 微軟提供的開發平臺倡導的就是以表模塊方式組織邏輯, 并提供了各種便利的開發工具和API; 在管理代碼的有效性和復雜度上有比較好的平衡,他比前面的事務腳本方式相對繁瑣點, 比后面好提到的領域模型方式簡單很多。

領域模型

領域模型方式組織代碼就是OO的編程思想, 把領域邏輯對象化, 從而達到在復雜的業務邏輯是有好的可擴展性和可維護性。表模塊組織方式在管理代碼的有效性和復雜度上有比較好的平衡, 但是在其提供的抽象機制畢竟有限; 在管理復雜的業務邏輯方面有些不給力。比如, 對于不同類型的商品, 其購買邏輯可能不一樣;這時候, 面向對編碼的威力會就能比較好的發揮了, 商品這個例子中, 購買時的行為可能不一樣, 利用多態機制, 對調用者來說可能是透明的。

領域模型這種方式與表模型的方式的區別在于OO的力度不一樣; 表模型以表為單位來組織, 領域模型可能則以表里面的記錄為單位來組織的, 因此代碼中, 一個表只有一個類實例, 而領域模型則會針對一條記錄有個對象。

模型這種方式的優點是便于有效的管理復雜性和可擴展性, 對于復雜的業務邏輯以及那種維護周期很長的系統來說比較適用; 但其缺點也很明: OO建模復雜,開發周期相對會長些;學習成本高, 尤其對于新團隊來說; 同樣, 如果代碼組織不好, 也會出現其他方式中出現的類似問題, 如代碼重復等。

小結
三種不同的邏輯組織方式各有特點, 適用于不同的場合, 可以根據實際情況選擇, 一般來說, 簡單應用, 要求快速開發快, 維護周期短的可以考慮事務腳本方式; 業務邏輯復雜, 維護周期長時, 在開發人員技能滿足的條件下可以考慮領域模型; 在這個兩個中間的情況可以考慮表模塊方式, 尤其是在微軟的平臺上。 在實際中,由于實際業務的復雜性, 很多時候以一種單一的方式組織還不夠, 可能幾個方式綜合起來運用。 比如, 把核心業務按領域對象的方式組織, 之上再以事務腳本來組織多變的應用業務。

it知識庫以數據庫為中心的系統中的業務邏輯組織方式,轉載需保留來源!

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

主站蜘蛛池模板: 两个奶被男人揉了一个晚上 | 亚洲欧美韩国综合色 | 毛片无码免费无码播放 | 97成人碰碰在线人妻少妇 | gogogo免费视频观看 | 免费小视频在线观看 | 亚洲一区乱码电影在线 | 99久久国产综合色 | 久久99re7在线视频精品 | 国产日韩精品一区二区三区在线 | 老头xxx | 色欲AV亚洲永久无码精品麻豆 | 青柠在线观看免费完整版 | 国产免费啪嗒啪嗒视频看看 | 精品久久久久久久99热 | 国产精品99久久久久久WWW | 国产免费久久爱久久啪 | 精品视频中文字幕 | 小处雏一区二区三区 | 老司机深夜福利ae 入口网站 | 99久久国产综合精品国 | bl被教练啪到哭H玉势 | 成人性生交片无码免费看 | 国产亚洲精品久久综合阿香 | 和I儿媳妇激情 | 中文字幕无码A片久久 | 欧美精品成人a多人在线观看 | 我解开了岳的乳第一个女人 | 热久久免费频精品99热 | 丝袜美女被啪啪不带套漫画 | 在线观看国产区 | 亚洲乱码日产精品BD在线下载 | 久久久黄色大片 | 再插深点嗯好大好爽 | 久久机热免费视频 | 拍戏被CAO翻了H | 伊人久久大线蕉香港三级 | 四虎亚洲中文字幕永久在线 | 高h辣h双处全是肉一对一 | 免费又黄又硬又爽大片 | 国产婷婷午夜无码A片 |