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

时间:2011-10-10 10:22:57

标签: design-patterns architecture refactoring analysis

任何人都可以推荐以下策略吗?

有一个大型组织通过id引用客户,或引用像'1234A'(四个数字和一个字母)。这些id几乎无处不在,数据库查询和主键,大约40个Java应用程序,许多外部接口,Visual Basic,电子表格,你可以命名。 他们需要将其从'1234A'改为允许格式'1234AB'(四个数字和两个字母)。因此,一个简单的变化具有非常大的影响。

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

我注意到相关的帖子 - Strategy for large scale refactoring

谢谢!

4 个答案:

答案 0 :(得分:1)

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

我会注意到你的问题很像Y2K问题,我将其描述为“现场扩展”的特殊情况(在大规模股票交易系统中发生过电话号码,车牌,条形码,交易ID) ,将与社会安全号码一起发生。)

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

查找数据本身可能很难。你怎么知道某事是约会(或者你的情况下,是一个扩展的身份证)?从根本上说,您需要识别此类数据的来源或接收(例如,屏幕上的日期字段,对get_current_year的调用,与已知的日期等其他事物进行比较等)并跟踪数据流向何处(到调用中的参数,分配)副本,打印,.... [Y2K的家伙也使用 X mod 100 == 0 作为暗示,事情是一年,因为这个计算可能是一个leapyear检查因此涉及的数据必须是一年]。

然后,对于数据的每个使用,您需要决定如何处理该用途:不管它(日期副本如果在扩展时工作则没有错误),修复它(例如,删除世纪前缀的添加等)。对于扩展ID,重要的是扩展ID可以做些什么?他们可以分成数字部分和字母数字部分吗?第一个alpha字母是否表示某种东西?根据这些问题的答案,通常很明显在代码中的每个使用点都要做什么。

现在事实上,你可以手工完成上述所有工作,而且至少比“给程序员并让他们按照自己的意愿去做”更有条理。

但实际上,就像Y2K冒险一样,你可以获得工具(比Y2K工具好得多)来自动化大部分工具。这些工具必须能够使用编译器级语义分析(例如,知道语言数据类型)来处理感兴趣的编程语言(您没有说过您所拥有的语言),必须能够匹配数据的源/接收器类型,必须能够遵循数据流(编译器社区的语言中的“流分析”),并能够机械地应用特定于使用的转换。

可以执行此操作的工具称为program transformation系统。大多数这些工具都可以应用源代码转换,如下所示:

domain Java.

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

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

[此示例格式适用于我们的DMS Software Reengineering Toolkit]。我们假设2位数的日期表示为字符串,我们想要找到/修复它们。 规则具有名称(因此人类可以命名感兴趣的特定规则,就像C中的函数具有名称一样)以及由分隔的源和替换模式重写为。围绕源和目标模式的 meta -quotes,并指示元引号内的文本来自域中命名的编程语言。原因<域名metaquotes里面的强> \“是反向的,是允许模式内的域/语言特定引号。 \ 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的内置flow analysis machinery),以及识别如上所示生成日期的模式。

使用此类程序转换机制,您可以自动执行大部分此类字段扩展任务。

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

自从验证了ID以来,没有这种模式。

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

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

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

答案 3 :(得分:0)

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