如何快速分析程序变更的影响?

时间:2016-02-22 09:33:15

标签: code-analysis impact-analysis

最近我需要对更改广泛使用的表(如PRODUCT,USER等)的数据库列定义进行影响分析。我发现这是一个非常耗时,乏味和困难的任务。我想问一下是否有任何已知的方法这样做?

这个问题也适用于应用程序,文件系统,搜索引擎等的变化。首先,我认为这种功能关系应该预先记录下来,或者一些如何跟踪,但后来我意识到一切都可以改变,这是不可能的。

我甚至不知道应该为这个问题添加什么标签,请帮忙。

抱歉我的英语不好。

3 个答案:

答案 0 :(得分:2)

不确定。从技术上讲,通过确定程序片,技术上至少可以知道哪些代码接触DB列(读取或写入)。

方法:查找源中的所有SQL代码元素。确定哪些触摸相关列。 (小心:SELECT ALL可能会触及您的列,因此您需要了解架构)。确定读取或写入该列的变量。随时随地跟踪这些变量,并确定它们影响的代码和变量;也遵循所有这些变量。 (这相当于计算前向切片)。同样,找到用于填充列的变量的来源;跟随他们回到他们的代码和来源,并遵循这些变量。 (这相当于计算后向切片)。

切片的所有元素都可能受到更改的影响/影响。切片选择的代码中可能存在明显超出新用例预期条件的条件,您可以从中考虑消除该代码。切片中的其他所有内容都可以检查/修改以进行更改。

现在,您的更改可能会影响其他一些代码(例如,使用DB列的新位置,或者将DB列中的值与其他值组合)。您将要检查您更改的代码的上行和下游切片。

您可以将此过程应用于您可能对代码库进行的任何更改,而不仅仅是数据库列。

手动这在大型代码库中并不容易,而且它当然不是很快。 C和C ++代码有一些自动化,但对其他语言来说并不多。

通过运行涉及所需变量或操作的测试用例并检查测试覆盖率,可以得到错误的近似值。 (如果运行测试用例,您的近似值会更好,您确定不会覆盖所需的变量或操作,并且会消除它所涵盖的所有代码。)

答案 1 :(得分:1)

最终,此任务无法自动执行或缩减为算法,否则将会有一个工具来预览重构的更改。你在开始编写代码越好,任务就越容易。

让我解释一下如何找到答案:隔离是关键。将所有内容映射到对象属性可以帮助您自动进行审核。

我可以举个例子。如果您能设法将您的具体案例映射到下面,它将挽救您的生命。

OR / M变化模式

与Hibernate或Entity Framework一样......

可以通过分析哪些代码使用某个对象的属性来简单地预览对数据库列的更改。由于所有数据库列都映射到对象属性并且假设没有代码使用纯SQL ,因此您可以进行估算

这是一个非常简单的变更管理模式。

为了将文件系统/网络或数据文件问题减少到上述模式,您需要实施其他软件模式。我的意思是,如果你可以将复杂的场景减少到对象的变化。属性,您可以利用IDE来检测更改,包括需要稍微修改才能编译或需要重写的代码。

  • 如果您想在最初编写软件时管理远程服务中的更改,将该服务包装在界面中。所以你只需要修改它的实现
  • 如果要管理数据文件格式的可能更改(例如位置格式的字段更改长度,列重新排序),请编写将该文件映射到对象的服务(如使用BeanIO解析器)
  • 如果要管理文件系统路径中的可能更改,请将应用程序设计为使用更多运行时变量
  • 如果您想管理加密算法的可能变更,请将它们包装在服务中(例如HashService,CryptoService,SignService)

如果您执行上述操作,则手动要求审核将更加轻松。因为整体任务是手动的,但可以使用自动化工具辅助。您可以尝试更改类的属性名称,并在编译器中查看其副作用

最坏情况

显然,如果您需要更改软件中数据库中特定列的名称,类型和长度,并且在代码周围的多个位置使用纯SQL进行硬编码和破坏,更糟糕的是许多表提供类似的列命名,加上没有项目总共10000多个课程的文档(我写的是最差情况,对吗?),除了依赖之外,除了手动探索项目之外别无他法。在他们身上。

如果您没有测试计划,这是您希望从中发起软件测试套件的文档,那么将是时候了制作一个。

答案 2 :(得分:0)

加我2美分。我假设您在生产环境中工作,因此必须进行某种形式的单元测试,集成测试和系统测试。

如果是,那么验证更改的一个好方法是再次运行所有这些测试并创建可能需要的任何新测试。

并且说明显而易见的是,在不运行这些测试的情况下,不要将代码更改集成到主生产代码库中。

然而,在测试环境中工作正常的更改可能无法在生产环境中起作用。 有一些形式的源代码配置管理系统,如Subversion,GitHub,CVS等。 这使您可以回滚更改