1

最近我需要对更改广泛使用的表(如 PRODUCT、USER 等)的 DB 列定义进行影响分析。我发现这是一项非常耗时、无聊和困难的任务。我想问一下是否有任何已知的方法可以做到这一点?

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

我什至不知道这个问题应该标记什么,请帮忙。

对不起我的英语不好。

4

3 回答 3

2

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

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

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

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

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

在大型代码库中手动执行此操作并不容易,而且肯定不会很快。对 C 和 C++ 代码有一些自动化操作,但对其他语言来说并不多。

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

于 2016-02-22T10:57:40.830 回答
1

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

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

我可以给你一个例子。如果您能够设法将您的具体案例映射到以下内容,它将挽救您的生命。

OR/M 变化模式

像 Hibernate 或实体框架...

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


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

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

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

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

最差的情况

显然,如果您需要在软件中更改数据库中特定列的名称、类型和长度,并且在代码周围的多个位置使用纯 SQL 硬编码和破碎,更糟糕的是,许多表呈现相似的列命名,而且没有项目文档(确实我写了最坏的情况,对吧?)总共 10000 多个类,除了手动探索项目,使用查找工具但不依赖它们,您别无他法。

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

于 2016-02-22T11:26:58.740 回答
0

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

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

并且很明显,在没有运行这些测试的情况下,不要将您的代码更改集成到主要的生产代码库中。

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

于 2016-02-22T11:08:20.267 回答