2016-02-22 33 views
1

最近,我需要对更改广泛使用的表(如PRODUCT,USER等)的DB列定义进行影响分析。我觉得这是一个非常耗时,无聊和困难的任务。我想问问是否有已知的方法这样做?如何快速分析程序变更的影响?

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

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

对不起,我英文很差。

+0

是的,关系**必须**被记录。它主要取决于你或你的前任如何设计应用程序。试着从软件架构师的角度来看问题,而不是来自编码器 –

回答

1

最终这个任务无法实现自动化或减少到一个算法,否则将是一个工具预览重构的更改。你一开始写代码越好,任务就越简单。

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

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

的OR/M的变化模式

像Hibernate或者实体框架......

的变化到数据库列可通过分析哪些代码使用某个对象的属性进行简单预览。由于所有的数据库列映射到对象属性,并假设没有代码使用纯SQL,你是好去为你估计


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

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

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

如果你这样做,你的manua l要求审查会更容易。由于整个任务是手动的,但可以通过自动化工具进行辅助。您可以尝试在编译

最坏的情况下更改类的属性的名称,并看到其副作用

显然,如果你需要在更改特定列的名称,类型和长度在数据库使用普通SQL进行硬编码并在代码周围多处破碎的软件,更糟糕的是许多表格呈现类似的列名称,另外还没有项目文档(我是否写过最差的情况,对吧?)总共有10000多个班级,除了手动探索您的项目,您使用查找工具,而不是使用依靠上的其他方式。

如果你没有一个测试计划,这是你可以希望发起软件测试套件的文件,这将是一次使一个。

2

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

方法:查找源代码中的所有SQL代码元素。确定哪些人触及相关专栏。 (小心:SELECT ALL可能会触及您的列,因此您需要知道该模式)。确定哪些变量读取或写入该列。遵循这些变量,并确定它们影响的代码和变量;也请遵循所有这些变量。 (这相当于计算正向切片)。同样,找到用于填充列的变量的来源;跟随他们回到他们的代码和来源,并且也遵循这些变量。 (这相当于计算一个反向切片)。

切片的所有元素都可能受到变化的影响/影响。切片选择的代码中可能存在明显超出新用例所期望条件的条件,并且您可以从代码中删除该代码。您可能已经检查/修改以进行更改的所有其他切片。

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

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

手动这在一个大的代码库中并不容易,它肯定不是很快。对于C和C++代码有一些自动化的功能,但对于其他语言来说并不多。

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

0

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

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

为了说明这一点,不要将您的代码更改集成到主生产代码库中,而不运行这些测试。

又一次在测试环境中正常工作的更改可能无法在生产环境中使用。 有某种形式的源代码配置管理系统,如颠覆,GitHub上,CVS等 的这使您可以回滚所做的更改