Web applications 推荐的完整重构活动产品的策略是什么?

Web applications 推荐的完整重构活动产品的策略是什么?,web-applications,refactoring,Web Applications,Refactoring,假设您有“System_A”,它是一个web应用程序。系统有3层:用户界面层、业务层和数据层 现在,您希望对System_a(仅限于UI和BusinessLayer)进行广泛的重构,同时将其作为一个实时产品使用 重构System_A并在经过良好测试(我们称之为“RF_SystemA”)后发布重构产品的最安全策略应该是什么?这样,即使在出现意外错误的情况下(不强制用户更改URL),也可以将其转换为System_A,您应该有足够的单元测试来覆盖代码的关键部分。(如果UI和业务逻辑没有很好地分离,使得

假设您有“System_A”,它是一个web应用程序。系统有3层:用户界面层、业务层和数据层

现在,您希望对System_a(仅限于UI和BusinessLayer)进行广泛的重构,同时将其作为一个实时产品使用


重构System_A并在经过良好测试(我们称之为“RF_SystemA”)后发布重构产品的最安全策略应该是什么?这样,即使在出现意外错误的情况下(不强制用户更改URL),也可以将其转换为System_A,您应该有足够的单元测试来覆盖代码的关键部分。(如果UI和业务逻辑没有很好地分离,使得逻辑难以测试,那么您可能需要更多地依靠功能/集成测试,直到您将层分离到足以使业务逻辑单元可测试为止。)

除了生产服务器之外,您还应该有测试/登台服务器,测试人员和用户可以在其中验证新代码是否正常工作

然后您可以一步一步地对代码进行小的更改,在每个步骤之后验证所有单元测试是否仍然通过

在主要里程碑之后,将重构后的应用程序部署到测试/暂存服务器,并运行更大规模的集成/功能/性能/任何其他测试

如果在所有测试之后,您对代码仍能按预期工作感到满意和自信,那么您可以在生产中部署它


如果在所有这些之后出现错误,您可以轻松地返回到生产中的最新安全版本。(在那之后,您可以开始调查bug是如何漏掉的,以及如何避免再次发生……)

首先,您应该有足够的单元测试来覆盖代码的关键部分。(如果UI和业务逻辑没有很好地分离,使得逻辑难以测试,那么您可能需要更多地依靠功能/集成测试,直到您将层分离到足以使业务逻辑单元可测试为止。)

除了生产服务器之外,您还应该有测试/登台服务器,测试人员和用户可以在其中验证新代码是否正常工作

然后您可以一步一步地对代码进行小的更改,在每个步骤之后验证所有单元测试是否仍然通过

在主要里程碑之后,将重构后的应用程序部署到测试/暂存服务器,并运行更大规模的集成/功能/性能/任何其他测试

如果在所有测试之后,您对代码仍能按预期工作感到满意和自信,那么您可以在生产中部署它


如果在所有这些之后出现错误,您可以轻松地返回到生产中的最新安全版本。(之后,您可以开始调查bug是如何漏掉的,以及如何避免再次发生……

我与Web开发没有太多关系,但我有一个想法:

您可以先编写/生成重定向层,如下所示:

假设您在System_A中有三个功能,如下所示:

System_A.Call1(...)
System_A.Call2(...)
System_A.Call3(...)
System_A:Call1(...) { Old_System_A.Call1(...); }
System_A:Call2(...) { Old_System_A.Call2(...); }
System_A:Call3(...) { Old_System_A.Call3(...); }
然后你可以像这样重命名这些电话

System_A.Call1(...) -> Old_System_A.Call1(...)
System_A.Call1(...) -> Old_System_A.Call2(...)
System_A.Call1(...) -> Old_System_A.Call3(...)
…并创建一个临时重定向系统,如下所示:

System_A.Call1(...)
System_A.Call2(...)
System_A.Call3(...)
System_A:Call1(...) { Old_System_A.Call1(...); }
System_A:Call2(...) { Old_System_A.Call2(...); }
System_A:Call3(...) { Old_System_A.Call3(...); }
这个系统可以立即投入使用

然后您可以一点一点地创建重构类,对它们进行测试,只需更改重定向调用。 重构完成后,删除重定向调用,只使用重新分解的系统

重定向的粒度应该与重构的粒度相对应。因此,如果重构单个函数,且函数签名保持不变,则可以使用上述方法。 如果完全重新设计系统的整个部分,则可以重定向整个部分

网站示例: 您有index.php,它主要调用3个函数:header()、body()和footer()

您可以将调用重定向到header、body和footer(如果签名保持不变),也可以重定向整个过程,只从index.php调用一个函数,如“currentIndexPhp()”

然后currentIndexHP()将首先调用页眉、正文和页脚


如果您相应地组织文件夹和文件,您应该能够很好地控制重构。

我与Web开发没有太多关系,但我有一个想法:

您可以先编写/生成重定向层,如下所示:

假设您在System_A中有三个功能,如下所示:

System_A.Call1(...)
System_A.Call2(...)
System_A.Call3(...)
System_A:Call1(...) { Old_System_A.Call1(...); }
System_A:Call2(...) { Old_System_A.Call2(...); }
System_A:Call3(...) { Old_System_A.Call3(...); }
然后你可以像这样重命名这些电话

System_A.Call1(...) -> Old_System_A.Call1(...)
System_A.Call1(...) -> Old_System_A.Call2(...)
System_A.Call1(...) -> Old_System_A.Call3(...)
…并创建一个临时重定向系统,如下所示:

System_A.Call1(...)
System_A.Call2(...)
System_A.Call3(...)
System_A:Call1(...) { Old_System_A.Call1(...); }
System_A:Call2(...) { Old_System_A.Call2(...); }
System_A:Call3(...) { Old_System_A.Call3(...); }
这个系统可以立即投入使用

然后您可以一点一点地创建重构类,对它们进行测试,只需更改重定向调用。 重构完成后,删除重定向调用,只使用重新分解的系统

重定向的粒度应该与重构的粒度相对应。因此,如果重构单个函数,且函数签名保持不变,则可以使用上述方法。 如果完全重新设计系统的整个部分,则可以重定向整个部分

网站示例: 您有index.php,它主要调用3个函数:header()、body()和footer()

您可以将调用重定向到header、body和footer(如果签名保持不变),也可以重定向整个过程,只从index.php调用一个函数,如“currentIndexPhp()”

然后currentIndexHP()将首先调用页眉、正文和页脚


如果您相应地组织文件夹和文件,您应该能够很好地控制重构。

谢谢PEter。问:你认为有一份系统的部件副本并对其进行所有更改是一个好主意吗。因此,您可以将重构和旧系统的代码保留一段时间,这样您就可以更容易地看到更改了什么?一段时间后,您可以删除旧系统的代码