色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

什么是遺留代碼?遺留代碼處理過程拆解

OSC開源社區(qū) ? 來源:OSCHINA 社區(qū) ? 作者:京東云開發(fā)者-馮鴻 ? 2022-11-11 09:57 ? 次閱讀

1 什么是遺留代碼

本質是一種技術債務,產生原因一方面是業(yè)務原因:如業(yè)務本身場景繁多、流程復雜等;另一方面是技術原因:如代碼不規(guī)范、設計不合理、祖?zhèn)鞔a文檔注釋缺失等。它會影響我們的程序很多方面:如可讀性、可修改性、可復用性、可維護性、可測試性等。

2 遺留代碼處理過程拆解

劃分為梳理 -> 重構 / 重寫 -> 替換 / 驗證三個階段 bdba9462-60ff-11ed-8abf-dac502259ad0.png

2.1 梳理

遺留代碼的處理是一種逆向工程,從已有的代碼 + 數據模型 + 文檔倒推出業(yè)務模型、交互和規(guī)則,在保真的前提下再重新構建代碼 + 數據模型 + 文檔。

我們這里可以參考下 DDD 領域驅動設計里戰(zhàn)略設計部分常用的工具(事件風暴法)來進行這部分梳理工作。

bdeb6556-60ff-11ed-8abf-dac502259ad0.png

事件風暴本質上是一種系統(tǒng)建模的方法,與它處于對等位置的,會有 “UML 建?!薄ⅰ笆录寗咏!?等。事件風暴跟敏捷開發(fā)里的一些理念(如用戶故事)的產生背景類似,都是在理性思考無法應對變化頻繁且文字難以描述的情況下,通過一些輔助性的提示卡片、視覺手段,輔以相關人員的集中、高頻溝通來完成對于業(yè)務的準確把握和抽象建模。 事件風暴的過程:

通過梳理業(yè)務流程,創(chuàng)建相應的領域事件(Event)

補充引發(fā)每個領域事件的命令(Command)

通過實體 / 聚合把命令和事件關聯起來

劃分領域邊界及事件流動線條

識別用戶操作所需的關聯視圖及其角色

事件風暴的產物:

領域對象 即實體 / 聚合。這里的領域對象并非數據庫模型, 而是與業(yè)務緊密聯系的 “對象”。因為事件風暴是一種面向對象的建模方式, 而不是面向數據庫的建模方式。

領域事件 即對象在某些操作或特點時點下所產生的事件, 這些事件將決定之后多個聚合和限界上下文(BC)之間的通訊方式。

限界上下文 當所有的對象(實體 / 聚合)被梳理出來后,屬于同一種 “通用語言” 的對象, 則會被歸入同一個限界上下文邊界內;不屬于同一種 “通用語言” 的對象, 則會被邊界給分割開,劃入不同的子域或限界上下文。

梳理結果示例:

be2b8be0-60ff-11ed-8abf-dac502259ad0.png

2.2 重構 / 重寫

通過重構 / 重寫對軟件要素進行重新組織,使其不改變外部行為的情況下,提升代碼的可讀性或使其結構更合理。

be730cc2-60ff-11ed-8abf-dac502259ad0.png

針對不同層次的軟件要素要做不同的處理和控制:

bf08594e-60ff-11ed-8abf-dac502259ad0.png

并且整個重構 / 重寫過程有些需要遵照的原則:

單一職責:可以將依賴歸攏,統(tǒng)一行為和控制。權責明確,場景明確。

單一原則:消除重復的數據聲明、行為;因為單一所以保證了復用,統(tǒng)一標準 ,可裝配性。

封裝原則:不需要過度關心依賴類內部實現,最好一個。就能調用。

歸屬原則:上帝的歸上帝,凱撒的歸凱撒。誰提供的數據更多,歸屬于誰。

抽象層次:越高層的抽象越穩(wěn)定,越細節(jié)的東西越容易變化。舉例:接口應傳遞職責而非實現細節(jié)。

開閉原則:對修改關閉,對擴展開放。

kiss 原則:好理解,好維護。

清晰原則:只讀小部分代碼就可以知道怎么改邏輯,做擴展。而不是要通讀所有代碼,才能理清。

其中有兩點落地細節(jié)我們具體分析下:

業(yè)務邏輯的處理
業(yè)務代碼和技術代碼解耦
主流程代碼和附加流程代碼解耦
長鏈路的拆解編排

關注點的分離
雙向依賴:上下文之間缺少一層未被澄清的上下文,或者兩個上下文其實可被合為一個;
循環(huán)依賴:任何一個上下文發(fā)生變更,依賴鏈條上的上下文均需要改變;
過深的依賴:自身依賴的信息不能直接從依賴者獲取到,需要通過依賴者從其依賴的上下文獲取并傳遞,依賴鏈路過長,依賴鏈條上的任何一個上下文發(fā)生變更,其鏈條后的任何一個上下文均可能需要改變;

2.3 替換驗證

大概分為以下幾個要點:

領會意圖,抽取用例,增加可復測性

增加可監(jiān)測性

分成小塊,逐步替換

試點、看到成效

可借助過程管理工具如 PDCA 法進行管理

bf866bd6-60ff-11ed-8abf-dac502259ad0.png

3 案例演示

3.1 案例 1:針對強耦合的實現做重構

原始需求:案例為一個轉賬服務,用戶可以通過銀行網頁轉賬給另一個賬號,支持跨幣種轉賬。同時因為監(jiān)管和對賬需求,需要記錄本次轉賬活動。 原始架構:是一個傳統(tǒng)的三層分層結構:UI 層、業(yè)務層、和基礎設施層。上層對于下層有直接的依賴關系,導致耦合度過高。在業(yè)務層中對于下層的基礎設施有強依賴,耦合度高。我們需要對這張圖上的每個節(jié)點做抽象和整理,來降低對外部依賴的耦合度。

bfa0e48e-60ff-11ed-8abf-dac502259ad0.png

重構關鍵設計點:

c05629e8-60ff-11ed-8abf-dac502259ad0.png

重構后代碼特征: 業(yè)務邏輯清晰,數據存儲和業(yè)務邏輯完全分隔。

Entity、Domain Primitive、Domain Service 都是獨立的對象,沒有任何外部依賴,但是卻包含了所有核心業(yè)務邏輯,可以單獨完整測試。

原有的轉賬服務不再包括任何計算邏輯,僅僅作為組件編排,所有邏輯均 delegate 到其他組件。

3.2 案例 2:提高老代碼的復用性

原始需求:現有幾個策略實現類,被很多代碼使用。現在需要根據不同的業(yè)務方在每個策略執(zhí)行前做不同的前置邏輯處理。 解法分析:盡量避免把邏輯耦合到已有的實現類中。引入外部類進行控制反轉。這里我們使用訪問者模式。 訪問者模式把數據結構和作用于結構上的操作解耦合,使得操作集合可相對自由地演化。

訪問者模式適用于數據結構相對穩(wěn)定算法又易變化的系統(tǒng)。因為訪問者模式使得算法操作增加變得容易。若系統(tǒng)數據結構對象易于變化,經常有新的數據對象增加進來,則不適合使用訪問者模式。訪問者模式的優(yōu)點是增加操作很容易,因為增加操作意味著增加新的訪問者。訪問者模式將有關行為集中到一個訪問者對象中,其改變不影響系統(tǒng)數據結構。其缺點就是增加新的數據結構很困難。

c09c3a46-60ff-11ed-8abf-dac502259ad0.png

具體實現:

c0df306c-60ff-11ed-8abf-dac502259ad0.pngc11b1b18-60ff-11ed-8abf-dac502259ad0.png

重構后代碼特征: 可以通過訪問者對老代碼邏輯進行編排,將修改外置,減少對老邏輯的影響。通過 java8 默認接口實現提供默認訪問行為,避免大量策略子類的感知,只需要需要提供自己實現行為的子類對默認實現進行覆寫。

4 總結

遺留代碼的處理能力一方面是對技術的要求,另一方面也是對業(yè)務掌握的挑戰(zhàn)。希望我們可以跨越荊棘、穿過迷霧,順利到達成功的彼岸!





審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯系本站處理。 舉報投訴
  • UML
    UML
    +關注

    關注

    0

    文章

    122

    瀏覽量

    30858
  • JAVA語言
    +關注

    關注

    0

    文章

    138

    瀏覽量

    20090
  • PDCA
    +關注

    關注

    0

    文章

    15

    瀏覽量

    3085

原文標題:遺留代碼處理技巧與案例演示

文章出處:【微信號:OSC開源社區(qū),微信公眾號:OSC開源社區(qū)】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    Gmapping源代碼

    Gmapping源代碼.docx
    發(fā)表于 11-16 13:42 ?0次下載

    參數化的延遲鏈代碼分享

    在日常寫代碼過程中,我們經常會用到“打拍”的操作。如圖1代碼段所示。這個打拍的作用,很多時候主要是為了減少亞穩(wěn)態(tài)。
    的頭像 發(fā)表于 10-21 13:54 ?171次閱讀
    參數化的延遲鏈<b class='flag-5'>代碼</b>分享

    代碼整潔之道-大師眼中的整潔代碼是什么樣

    幾個月前寫了一篇文章“如何寫出難以維護的代碼”,從中能大概了解到不好維護的代碼是什么樣,有哪些壞味道,那肯定有人會反問,難以維護的代碼見的太多了,也知道長什么樣,但是對于好維護的代碼
    的頭像 發(fā)表于 09-09 16:30 ?332次閱讀
    <b class='flag-5'>代碼</b>整潔之道-大師眼中的整潔<b class='flag-5'>代碼</b>是什么樣

    java反編譯的代碼可以修改么

    Java反編譯是一種將編譯后的Java字節(jié)碼(.class文件)轉換回源代碼過程。反編譯后的代碼可以進行修改,但是需要注意,反編譯代碼的質量和可讀性可能會受到原始編譯
    的頭像 發(fā)表于 09-02 11:00 ?655次閱讀

    ida反編譯出來代碼能直接用嗎

    IDA反編譯出來的代碼通常 不能直接使用 ,這主要基于以下幾個方面的原因: 一、代碼的不完整性 IDA反編譯生成的代碼可能缺少原始源代碼中的某些關鍵信息。在編譯
    的頭像 發(fā)表于 09-02 10:55 ?652次閱讀

    「重構:改善既有代碼的設計」實戰(zhàn)篇

    代碼層面的整理,它更是一種軟件開發(fā)的哲學,強調持續(xù)改進和適應變化的重要性。 ? ? 書中通過詳細的案例分析和代碼示例,將理論與實踐巧妙地融合在一起。我尤其贊賞作者 如何將復雜的重構任務拆解成一系列的小步驟 ,每一步都
    的頭像 發(fā)表于 08-14 10:42 ?251次閱讀
    「重構:改善既有<b class='flag-5'>代碼</b>的設計」實戰(zhàn)篇

    國內低代碼平臺推薦--萬界星空科技低代碼平臺

    代碼平臺是一種應用程序,它為編程提供圖形用戶界面,從而以極快的速度開發(fā)代碼,減少傳統(tǒng)編程工作。 這些工具有助于快速開發(fā)代碼,最大限度地減少手工編碼的工作量。這些平臺不僅有助于編碼,還有助于快速設置和部署。
    的頭像 發(fā)表于 07-18 15:39 ?296次閱讀
    國內低<b class='flag-5'>代碼</b>平臺推薦--萬界星空科技低<b class='flag-5'>代碼</b>平臺

    該如何提高代碼容錯率、降低代碼耦合度?

    提高RT-Thread代碼的容錯率和降低耦合度是確保代碼質量和可維護性的關鍵,下面列舉了幾種在編寫代碼時,提高代碼容錯率和降低耦合度的思路。讓我們一起來看看吧~一、提高
    的頭像 發(fā)表于 06-26 08:10 ?659次閱讀
    該如何提高<b class='flag-5'>代碼</b>容錯率、降低<b class='flag-5'>代碼</b>耦合度?

    三菱伺服故障代碼大全及處理方法

    三菱伺服電機是工業(yè)自動化領域中廣泛應用的一種高性能電機,其故障診斷和處理對于保證生產效率和設備穩(wěn)定性至關重要。本文將詳細介紹三菱伺服電機的故障代碼及其處理方法,以幫助用戶快速定位問題并采取相應措施
    的頭像 發(fā)表于 06-06 12:28 ?9685次閱讀

    探討AI編寫代碼技術,以及提高代碼質量的關鍵:靜態(tài)代碼分析工具Perforce Helix QAC &amp; Klocwork

    過程,并回答這個問題: AI會取代程序員嗎? 什么是AI代碼生成? 近年來,生成式AI的應用呈爆炸式增長,這主要因為現在有足夠的計算能力來運行深度學習算法,而且訓練機器學習模型所需的海量數據也在增加。 AI代碼生成是指使用生成
    的頭像 發(fā)表于 06-05 14:10 ?401次閱讀

    藍牙遙控代碼及使用

    藍牙遙控代碼及使用
    的頭像 發(fā)表于 05-15 10:15 ?820次閱讀

    如何提升代碼質量與效率的秘訣

    提高編程能力其實沒有捷徑,最佳方式就是多寫代碼。 不過,除了寫大量代碼,提升編程能力還需要大量閱讀別人寫的代碼。
    的頭像 發(fā)表于 04-28 14:53 ?392次閱讀
    如何提升<b class='flag-5'>代碼</b>質量與效率的秘訣

    一招掌握C語言代碼如何變成bin文件?

    一、關鍵步驟將單片機的源代碼轉換成二進制文件(bin文件)的過程涉及幾個關鍵步驟,這些步驟是編譯過程中的標準組成部分,主要包括以下步驟:預處理、編譯、匯編、鏈接、二進制轉換。01預
    的頭像 發(fā)表于 04-13 08:10 ?3217次閱讀
    一招掌握C語言<b class='flag-5'>代碼</b>如何變成bin文件?

    g代碼和m代碼表示什么功能

    加工的動作指令。在程序中,多條G代碼指令按順序組成一個工藝過程,以實現工件的形狀加工。G代碼可分為基本功能代碼和輔助功能代碼。 基本功能
    的頭像 發(fā)表于 02-14 15:49 ?4311次閱讀

    淺談代碼優(yōu)化與過度設計

    本文記錄了作者從“代碼優(yōu)化”到“過度設計”的典型思考過程,這過程中涉及了很多Java的語法糖及設計模式的東西,很典型,能啟發(fā)思考,遂記錄下來。 有一天Review師妹的代碼,看到一
    的頭像 發(fā)表于 01-19 10:05 ?545次閱讀
    淺談<b class='flag-5'>代碼</b>優(yōu)化與過度設計
    主站蜘蛛池模板: 91羞羞视频| 巨胸美乳中文在线观看| 战狼4在线观看完免费完整版| 青年医生插曲| 羞羞漫画免费漫画页面在线看漫画秋蝉 | 父亲猜女儿在线观看| 人人插人人射| 久久精品国产免费播放| 高h原耽肉汁动漫视频| 3dbdsm变态videos高清| 亚洲高清免费在线观看| 久久精品中文字幕免费| 88福利视频| 亚洲日韩中文字幕区| 双性人皇上被c到哭| 欧美美女论坛| 浪潮色诱AV久久久久久久| 99久久全国免费久久爱| 一本大道香蕉中文在线视频观看| 神马伦理2019影院不卡片| 男生插曲女生身全过程| 捆绑白丝粉色JK震动捧喷白浆 | 特级做A爰片毛片免费69| 欧美精品一区二区三区四区| 久久免费国产| 精品无码国产污污污免费网站2 | 天天久久影视色香综合网| 欧美视频精品一区二区三区| 可以看的黄页的网站| 九九热视频免费| 韩日美无码精品无码| 国产欧美日韩国产高清| 国产精品久久久久久人妻精品蜜桃| writeas雷狮直播| 外国三级片名| 色窝窝亚洲AV在线观看| 久久热这里面只有精品| 久草网国产自偷拍| 久久亚洲精品AV成人无| 久久人妻少妇嫩草AV无码| 久久久久久天天夜夜天天|