推荐策略? (基本上,用于大规模重构)

问题描述 投票:2回答:4

有人可能会推荐以下策略吗?

有一个大型组织,通过ID或类似“ 1234A”(四个数字和一个字母)的引用来引用客户。 这些id几乎在任何地方都可以使用,包括数据库查询和主键,大约40个Java应用程序,许多外部接口,Visual Basic,电子表格等。 他们需要将其从“ 1234A”更改为还允许使用格式“ 1234AB”(四个数字和两个字母)。 因此,一个简单的更改会产生很大的影响。

我开始考虑什么是好的方法。 可能有人知道任何推荐的策略或模式等吗?

我注意到相关的发布- 大规模重构策略

谢谢!

design-patterns architecture refactoring analysis
4个回答
1
投票

常见的建议是“手动查找/更改所有代码”。 如您所见,当代码库变大时,这将成为一个问题。

我会注意到您的问题很像Y2K问题,我将其描述为“领域扩展”的特例(在大型股票交易系统中,电话号码,车牌,条形码,交易ID都会发生)与社会安全号码)。

理想地需要一种工具,该工具可以识别问题数据的所有实例,并针对每个实例确定需要在其中进行哪些代码更改。 对于Y2K问题,必须找到具有2位数字年份的日期字段,并且对于代码中此类数据的每次出现,都要对该代码进行修补(例如,将数据声明扩展为包括另外2位数字,删除“ 19” +字符串连接)从2位数字的日期生成4位数字的日期,依此类推。

查找数据本身可能很困难。 您如何知道日期(或者您的情况是扩展ID)? 从根本上讲,您需要确定此类数据的来源或接收者(例如,屏幕上的日期字段,对get_current_year的调用,与其他已知的日期进行比较等),并跟踪数据的流向(到调用中的参数,赋值) [Y2K的人还使用X mod 100 == 0来暗示某个年份是一年,因为这种计算可能是a年检查,因此所涉及的数据必须是一年]。

然后,对于数据的每次使用 ,您都需要决定如何使用该数据:不理会它(日期副本在扩展时可以正常使用,这不是错的),对其进行修复(例如,删除世纪前缀等)。 )。 对于您的扩展ID,在这里重要的是可以对扩展ID做哪些事情? 可以将它们撕成数字部分和字母数字部分吗? 第一个字母是否本身表示某事? 基于这些问题的答案,通常很明显在代码的每个使用点都应该做什么。

现在,实际上,您可以手动完成上述所有操作,而且至少比“将其交给程序员并让他们按自己的意愿做”更具组织性。

但是实际上,就像Y2K冒险一样,您可以使用工具(比Y2K工具要好得多)来自动执行大部分操作。 此类工具必须能够通过编译器级语义分析(例如,了解语言数据类型)来处理感兴趣的编程语言(您未说过的语言),必须能够匹配数据的源/宿类型,必须能够遵循数据流(在编译器社区的语言中为“流分析”),并且能够机械地应用针对特定用途的转换。

可以执行此操作的工具称为程序转换系统。 这些工具中的大多数可以将源代码转换为源代码,如下所示:

domain Java.

pattern date_source_1():expression
  " calendar.get_year() ";

rule remove_century_prefix(s: sum): expression -> expression
   "  \"19\"+\s "
   rewrites to
   "   \s  " ;

[此示例格式适用于我们的DMS软件再造工具包 ]。 我们假设2位日期表示为字符串,我们想查找/修复这些日期。 规则具有名称 (因此,人类可以为特定的特定规则命名,就像C语言中的函数具有名称一样)以及由重写为分隔的源和替换模式。 源和目标模式周围的引号,表示元引号内的文本来自域中命名的编程语言。域元引号内的\\”被反斜杠的原因是允许域/语言模式中的特定引号。 \\ s表示子表达式,它是连接表达式的一部分。 模式定义允许匹配可能的日期来源。]

因此,规则描述了如何处理遇到的每种情况,但是必须通过使用适当数据类型的实体来限定它们。 您不希望上述规则在每个字符串连接上运行。 大多数现有的程序转换工具在这里都没有提供太多帮助。

DMS确实至少在C,Java和COBOL中提供了进行相当严格的数据流跟踪的能力。 因此,您必须修改规则:

rule remove_century_prefix(s: sum): expression -> expression
   "  \"19\"+\s "
   rewrites to
   "   \s  " if is_date(s);

is_date用于检测数据流(使用DMS内置的流分析工具 ),以及用于识别日期生成的模式,如上所示。

使用此类程序转换机制,您可以使此类现场扩展任务的大部分自动化。


0
投票

您可以尝试使用Java程序并在程序中编辑该字段。 请注意具有多种逻辑来读取和写入多种文件类型。

另外,对于文本文件,您可以在Windows中搜索包含该字段的文件,然后将所有文件添加到notepad ++中,然后“查找并替换” notepad ++中的所有文件。

对于excel文件以及以不可读形式(我的意思是非文本形式)存储数据的任何其他格式,最好使用Apache POI等通过某些Java程序进行编辑。


0
投票

由于ID已验证,因此没有模式。

您需要一次在一个应用程序中添加支持。 这意味着应用程序应该能够处理两种ID,而不会崩溃。 还添加某种配置标志,可以将其设置为以新方式开始生成ID(但尚未启用它)。

对每个应用程序执行此操作并对其进行测试。

测试完所有应用程序后,只需更改其配置,即可开始生成新的ID。


0
投票

这次没人会救你。 将ID验证移至在一个位置上管理并共享的一组组件-这样,您下次便可以快速更改格式。 如果所有或大多数应用程序都在网络上,则可以添加“加载新格式定义”功能并以这种方式为所有应用程序分发正则表达式。

© www.soinside.com 2019 - 2024. All rights reserved.