有没有人可以推荐以下策略?
有一个大型组织,它通过id或引用来引用客户,例如' 1234A '(四个数字和一个字母)。这些id几乎无处不在,数据库查询和主键,大约40个Java应用程序,许多外部接口,有Visual Basic,电子表格,应有尽有。他们需要将其从' 1234A '更改为' 1234AB '格式(四个数字和两个字母)。所以,一个简单的改变会产生很大的影响。
我开始考虑什么可能是一个好方法。有人知道什么推荐的策略或模式吗?
我已经注意到相关的帖子-大规模重构策略
谢谢!
通常的建议是"手动查找/更改所有代码"。如您所见,当代码库变大时,这就会成为一个问题。
我注意到你的问题很像千年年问题,我将其描述为"领域扩展"的特殊情况(发生在电话号码,车牌,条形码,大规模股票交易系统中的交易id,将发生在社会安全号码上)。
理想情况下需要的是一种能够识别问题数据的所有实例的工具,并且对于每个实例,确定需要在那里进行哪些代码更改。对于千年虫问题,人们必须找到具有2位数年份的日期字段,并且对于代码中每次出现此类数据,修补该代码(例如,扩展数据声明以包含2个数字,删除"19"+字符串连接,从2位数日期生成4位数日期,等等)。
查找数据本身可能很困难。如何知道某个东西是日期(或者在您的例子中是扩展id)?从根本上说,您需要识别这些数据的来源或接收(例如,屏幕上的日期字段,对get_current_year的调用,与其他已知的日期进行比较,等等)并跟踪数据的流向(调用中的参数,副本的分配,打印,....)[Y2K的家伙也使用X mod 100 == 0作为一个年份的暗示,因为这个计算可能是一个闰年检查,因此所涉及的数据必须是一年]。
然后,对于数据的每个使用,您需要决定如何处理该使用:不管它(日期副本如果在扩展时工作就不会出错),修复它(例如,删除添加的世纪前缀等)。对于扩展id,这里重要的是可以对扩展id执行哪些操作?它们能被分成数字部分和字母数字部分吗?第一个字母本身有什么含义吗?基于对这些问题的回答,通常可以很明显地看出在代码的每个使用点应该做什么。事实上,你可以手工完成上面的所有工作,这至少比"交给程序员,让他们做他们想做的事"更有条理。
但事实上,就像千年虫的冒险一样,你可以得到工具(比千年虫工具好得多)来自动化大部分工作。这些工具必须能够用编译器级别的语义分析(例如,知道语言的数据类型)处理感兴趣的编程语言(您没有说您拥有什么),必须能够匹配数据类型的源/汇,必须能够跟踪数据流(编译器社区语言中的"流分析"),并且能够机械地应用特定于使用的转换。
能够做到这一点的工具被称为程序转换系统。这些工具中的大多数都可以像下面这样应用源到源的转换: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中的函数有名称一样),并且由分隔的源和替换模式重写为。围绕源模式和目标模式的"是meta-引号,并指示meta-引号中的文本来自在域中命名的编程语言。域元引号中的"被反斜杠的原因是允许在模式中使用特定于域/语言的引号。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内置的流分析机制),以及识别生成日期的模式,如上面所示。
使用这样的程序转换机制,您可以自动执行大部分这样的字段扩展任务。
您可以尝试一个java程序并在程序中编辑该字段。请注意为不同的文件类型提供多个读写逻辑。
此外,对于文本文件,您可以在windows中搜索包含该字段的文件,然后将所有文件添加到notepad++中,然后在notepad++中"查找并替换"所有文件。
对于excel文件和任何其他以不可读形式存储数据的格式(我的意思是非文本形式),最好使用Apache POI等通过一些java程序进行编辑
由于id被验证,因此没有这种模式。
您需要一次在一个应用程序中添加支持。这意味着应用程序应该能够处理这两种类型的id而不会崩溃。还可以添加一些配置标志,可以设置为以新的方式开始生成id(但还没有启用它)。
为每个应用程序执行此操作并进行测试。
当测试完所有应用程序后,只需更改它们的配置,以便它们开始生成新的id。