2016-02-22 34 views
1

最近,我需要對更改廣泛使用的表(如PRODUCT,USER等)的DB列定義進行影響分析。我覺得這是一個非常耗時,無聊和困難的任務。我想問問是否有已知的方法這樣做?如何快速分析程序變更的影響?

這個問題也適用於應用程序,文件系統,搜索引擎等的變化。起初,我認爲這種函數關係應該是預先記錄的或者一些如何跟蹤,但是然後我意識到一切都可以有變化,這是不可能的。

我甚至不知道應該給這個問題貼什麼標籤,請幫忙。

對不起,我英文很差。

+0

是的,關係**必須**被記錄。它主要取決於你或你的前任如何設計應用程序。試着從軟件架構師的角度來看問題,而不是來自編碼器 –

回答

1

最終這個任務無法實現自動化或減少到一個算法,否則將是一個工具預覽重構的更改。你一開始寫代碼越好,任務就越簡單。

讓我解釋一下如何達到答案:隔離是關鍵。將所有內容映射到對象屬性可以幫助您自動執行審閱。

我可以給你一個例子。如果你能設法將你的具體案例映射到下面,它將拯救你的生命。

的OR/M的變化模式

像Hibernate或者實體框架......

的變化到數據庫列可通過分析哪些代碼使用某個對象的屬性進行簡單預覽。由於所有的數據庫列映射到對象屬性,並假設沒有代碼使用純SQL,你是好去爲你估計


這是變革管理的一個非常簡單的模式。

爲了減少文件系統/網絡或數據文件問題的上述模式,您需要其他軟件模式實施。我的意思是,如果您可以將複雜場景減少爲對象屬性的更改,則可以利用IDE檢測您的更改,包括需要稍微修改或需要重新編寫的代碼。

  • 如果你想管理遠程服務的變化,當你開始寫你的軟件,換行服務的接口。因此,您只需修改其實施
  • 如果要管理數據文件格式中的可能更改(例如,位置格式的字段更改長度,列重新排序),請編寫一個將該文件映射到對象的服務(如使用BeanIO解析器)
  • 如果要管理文件系統路徑可能發生變化,設計你的應用程序如果要管理的加密算法可能改變使用更多的運行時變量
  • ,在服務包起來(例如HashService ,CryptoService,SignService)

如果你這樣做,你的manua l要求審查會更容易。由於整個任務是手動的,但可以通過自動化工具進行輔助。您可以嘗試在編譯

最壞的情況下更改類的屬性的名稱,並看到其副作用

顯然,如果你需要在更改特定列的名稱,類型和長度在數據庫使用普通SQL進行硬編碼並在代碼周圍多處破碎的軟件,更糟糕的是許多表格呈現類似的列名稱,另外還沒有項目文檔(我是否寫過最差的情況,對吧?)總共有10000多個班級,除了手動探索您的項目,您使用查找工具,而不是使用依靠上的其他方式。

如果你沒有一個測試計劃,這是你可以希望發起軟件測試套件的文件,這將是一次使一個。

2

當然。從技術上講,至少可以通過確定程序片段知道哪些代碼觸及了DB列(讀取或寫入它)。

方法:查找源代碼中的所有SQL代碼元素。確定哪些人觸及相關專欄。 (小心:SELECT ALL可能會觸及您的列,因此您需要知道該模式)。確定哪些變量讀取或寫入該列。遵循這些變量,並確定它們影響的代碼和變量;也請遵循所有這些變量。 (這相當於計算正向切片)。同樣,找到用於填充列的變量的來源;跟隨他們回到他們的代碼和來源,並且也遵循這些變量。 (這相當於計算一個反向切片)。

切片的所有元素都可能受到變化的影響/影響。切片選擇的代碼中可能存在明顯超出新用例所期望條件的條件,並且您可以從代碼中刪除該代碼。您可能已經檢查/修改以進行更改的所有其他切片。

現在,您的更改可能會影響其他一些代碼(例如,使用數據庫列的新位置,或將數據庫列中的值與某個其他值組合)。您需要檢查您更改的代碼的上游和下游切片。

您可以將此過程應用於您可能對代碼庫進行的任何更改,而不僅僅是數據庫列。

手動這在一個大的代碼庫中並不容易,它肯定不是很快。對於C和C++代碼有一些自動化的功能,但對於其他語言來說並不多。

通過運行涉及所需變量或操作的測試用例並檢查測試覆蓋率,可以得到一個不好的近似值。 (如果你運行的測試用例確實不能覆蓋你想要的變量或動作,並且消除了它所涵蓋的所有代碼,那麼你的近似會變得更好。

0

只需加我2美分。我假設你在生產環境中工作,所以必須進行某種形式的單元測試,集成測試和系統測試。

如果是,那麼驗證您的更改的一個好方法是再次運行所有這些測試並創建任何可能需要的新測試。

爲了說明這一點,不要將您的代碼更改集成到主生產代碼庫中,而不運行這些測試。

又一次在測試環境中正常工作的更改可能無法在生產環境中使用。 有某種形式的源代碼配置管理系統,如顛覆,GitHub上,CVS等 的這使您可以回滾所做的更改