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

How to quickly analyse the impact of a program change?

最近我需要对更改广泛使用的 table(如 PRODUCT、USER 等)的数据库列定义进行影响分析。我发现这是一项非常耗时、无聊且困难的任务。请问有什么已知的方法可以做到吗?

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

我都不知道这个问题应该打什么标签,求助。

抱歉我的英语不好。

当然可以。通过确定 program slices.

,技术上至少可以知道哪些代码接触了 DB 列(读或写)

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

切片的所有元素都可能 affecting/affected 发生变化。切片选择的代码中可能存在明显超出新用例预期条件的条件,您可以从考虑中删除该代码。您可以 inspect/modify 更改切片中的所有其他内容。

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

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

在大型代码库中手动执行此操作并不容易,而且肯定不会很快。 C 和 C++ 代码可以实现一些自动化,但其他语言的自动化程度不高。

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

只需加上我的 2 美分。我假设您在生产环境中工作,因此必须已经编写了某种形式的单元测试、集成测试和系统测试。

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

明确地说,如果没有 运行这些测试,请不要将您的代码更改集成到主要生产代码库中。

再一次,在测试环境中运行良好的更改可能在生产环境中不起作用。 拥有某种形式的源代码配置管理系统,如 Subversion、GitHub、CVS 等。 这使您能够回滚更改

最终这个任务不能自动化或简化为算法,否则会有一个工具来预览重构的变化。你一开始写的代码越好,任务就越容易。

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

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

OR/M 变化模式

喜欢休眠或 Entity Framework...

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


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

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

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

如果您执行上述操作,您的手动 需求审查会更容易。因为整个任务是手动的,但可以借助自动化工具。您可以尝试更改 class 的 属性 的名称并在编译器中查看其副作用

最坏的情况

显然,如果您需要在软件中更改数据库中特定列的名称、类型和长度,SQL 会在代码周围的多个地方进行硬编码和破坏,更糟糕的是,许多表都呈现出类似的情况列命名,加上没有项目文档(我写了 worst case,对吧?)总共 10000+ classes,除了手动探索项目之外别无他法,使用查找工具但不依赖它们。

如果您没有测试计划,您可以希望从中创建软件测试套件 ], 是时候做一个了。