该项目的目的是分析绿色能源公司 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”宏,而原始脚本则使用多个子例程完成相同的任务。
最后,重构的脚本可以更容易地修改以执行其他分析的类似任务。数据存储在宏本身的数组中,而不是在循环运行时填充工作表中的单元格。如果我们为了其他目的而重新设计原始脚本,我们几乎必须完全重写循环。如果我们要出于其他目的重新调整重构的脚本,我们实际上只需要编辑数组并使用搜索和替换函数来更新循环中的数组名称。