Design patterns 推荐一个策略?(基本上,对于大规模的重新分解)

Design patterns 推荐一个策略?(基本上,对于大规模的重新分解),design-patterns,architecture,refactoring,analysis,Design Patterns,Architecture,Refactoring,Analysis,有没有人能为以下方面推荐一种策略 有一个大型组织通过id或类似“1234A”(四个数字和一个字母)的引用来引用客户。这些id几乎无处不在,数据库查询和主键,大约40个Java应用程序,许多外部接口,还有VisualBasic、电子表格等等。 他们需要将其从“1234A”更改为“1234AB”格式(四个数字和两个字母)。所以,一个简单的改变会产生很大的影响 我开始考虑什么可能是一个好方法。有谁知道推荐的策略或模式等吗 我注意到相关的帖子- 谢谢 您可以尝试一个java程序并编辑程序中的字段。请注

有没有人能为以下方面推荐一种策略

有一个大型组织通过id或类似“1234A”(四个数字和一个字母)的引用来引用客户。这些id几乎无处不在,数据库查询和主键,大约40个Java应用程序,许多外部接口,还有VisualBasic、电子表格等等。 他们需要将其从“1234A”更改为“1234AB”格式(四个数字和两个字母)。所以,一个简单的改变会产生很大的影响

我开始考虑什么可能是一个好方法。有谁知道推荐的策略或模式等吗

我注意到相关的帖子-


谢谢

您可以尝试一个java程序并编辑程序中的字段。请注意,对于多个文件类型,要有多个读写逻辑

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


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

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

您需要一次在一个应用程序中添加支持。这意味着应用程序应该能够处理这两种ID而不会出现故障。还添加了一些配置标志,可以将其设置为以新的方式开始生成ID(但暂时不要启用)

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


测试完所有应用程序后,只需更改它们的配置,以便它们开始生成新ID。

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

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

理想情况下需要的是一个工具,该工具可以识别问题数据的所有实例,并针对每个实例确定需要进行哪些代码更改。对于Y2K问题,必须找到具有2位数年份的日期字段,并且对于代码中每次出现的此类数据,修补该代码(例如,扩展数据声明以包含更多的2位数,删除从2位数日期生成4位数日期的字符串连接,等等)

查找数据本身可能很困难。您如何知道某个数据是日期(或者在您的情况下是扩展id)?基本上,您需要识别此类数据的源或汇(例如,屏幕上的日期字段、获取当前年份的调用、与其他已知的日期进行比较等),并跟踪数据流向(对于调用中的参数、副本分配、打印,…[Y2K人员还使用X mod 100==0作为某个年份的提示,因为此计算可能是闰年检查,因此涉及的数据必须是一年]

然后,对于数据的每次使用,您需要决定如何处理该使用:别管它(如果扩展时数据副本可以正常工作,则日期副本不会出错),修复它(例如,删除添加的世纪前缀等)。对于您的扩展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  " ;
[这里的示例格式是针对我们的]。我们假设2位日期表示为字符串,我们希望查找/修复这些字符串。规则有一个名称(因此人类可以命名感兴趣的特定规则,就像C中的函数有名称一样)由分隔的源和替换模式重写为。围绕源和目标模式的是元引号,表示元引号内的文本来自域中命名的编程语言。\”域内的元引号是反斜杠,允许在模式内使用特定于域/语言的引号。\s表示子表达式,该子表达式是连接表达式的一部分。模式定义允许匹配可能的日期源。]

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

DMS确实提供了一种能力,至少对于C、Java和COBOL来说是这样的,可以进行非常严肃的数据流跟踪
rule remove_century_prefix(s: sum): expression -> expression
   "  \"19\"+\s "
   rewrites to
   "   \s  " if is_date(s);