此專案的目的是分析綠色能源公司 2017 年和 2018 年的股票數據。
總體而言,這些綠色能源股票 2017 年的表現比 2018 年好得多,但 TerraForm Power(股票代碼 TERP)除外,您可以從下面的數據中看到。
2017 年和 2018 年重構的腳本執行子程式的時間分別為 0.55 秒和 0.57 秒。與原始腳本的 0.64 秒和 0.67 秒相比,這是一個微小的改進,下面提供了螢幕截圖。
用於產生相同資料的兩種方法的主要區別在於資料儲存方法。在原始子程式中,工作表中的儲存格隨著 for 迴圈的每次迭代而更新,類似於下面的程式碼。
For i in tickers
...
Worksheets("AllStocksAnalysis").Activate
Cells(4 + i, 1).Value = ticker
Cells(4 + i, 2).Value = totalVolume
Cells(4 + i, 3).Value = endingPrice / startingPrice - 1
...
End i
重構方法的腳本將循環輸出資料儲存在三個資料數組中,然後在資料擷取循環運行後使用這些資料更新工作表,類似於下面的程式碼。
Dim tickerVolumes(12) As Long
Dim tickerStartingPrices(12) As Single
Dim tickerEndingPrices(12) As Single
...
'For loops populating arrays
...
For i = 0 To 11
Worksheets("All Stocks Analysis").Activate
Cells(4 + i, 1).Value = tickers(i)
Cells(4 + i, 2).Value = tickerVolumes(i)
Cells(4 + i, 3).Value = tickerEndingPrices(i) / tickerStartingPrices(i) - 1
End i
這種操作看似微不足道,但它確實使每個子程式的運行時間減少了大約十分之一秒。
根據具體情況,重構程式碼可能有優點也有缺點。無論如何,如果原始程式碼沒有足夠的註釋,或者程式碼的目的不是很熟悉,那麼重構可能會非常困難,因為人們可能對編碼方法或目的沒有足夠的了解的程式碼。
如果程式碼沒有足夠的註釋,人們可能很難弄清楚每個語句和函數的用途。這將使程式碼很難重構。
如果程式碼的用途不熟悉,那麼在不知道最終目標是什麼的情況下很難重構程式碼。以使用廣義多粒子米氏理論對金屬半導體奈米粒子進行電動模擬為例。看到問題了嗎?無論一個人在重組程式碼方面有多擅長,這個主題都需要先進的電動力學和高階偏微分方程知識。
此外,重構程式碼最終可能會付出大量的工作而獲得一點回報。以我們以VBA進行股票分析為例。如果人們正在處理的資料集仍然保持在我們在這裡操縱的數量級上,那麼重新調整程式碼以使其運行速度加快 0.1 秒可能不會引起人們的興趣。當程式碼開始需要三十分鐘或更長時間來執行時,這種重組可能非常有價值。
重構程式碼確實也有很多優點。一般來說,重構程式碼往往會讓程式碼更加優雅、高效,有時甚至更容易理解。
如果能夠操縱程式碼,以更少的行數和更強大的功能來實現相同的目標,那麼程式碼通常會更容易理解,並且可能執行得更快。
此外,重構程式碼可以讓人們更深入地了解程式碼最初的用途以及最終目標是如何實現的。重構程式碼時,人們需要再次查看腳本並決定每個語句的作用以及是否或如何使程式碼更有效率。程式碼知識的增加可能意味著第二次對重構程式碼的評論將更加有用和更具描述性。
我們重構的 VBA 腳本最明顯的優勢是運行時間。如前所述,重構腳本的運行速度比原始腳本快約十分之一秒。
我們的重構腳本還包含更好的註釋,以便我們稍後回顧程式碼並比理解原始腳本更好地理解重構腳本。
此外,我們重構的腳本包含一個「one-subroutine-does-it-all」宏,而原始腳本則使用多個子程式完成相同的任務。
最後,重構的腳本可以更容易地修改以執行其他分析的類似任務。資料儲存在巨集本身的陣列中,而不是在循環運行時填入工作表中的儲存格。如果我們為了其他目的而重新設計原始腳本,我們幾乎必須完全重寫循環。如果我們要出於其他目的重新調整重構的腳本,我們實際上只需要編輯陣列並使用搜尋和替換函數來更新循環中的陣列名稱。