首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何为重写应用程序的胶水做准备

如何为重写应用程序的胶水做准备
EN

Software Engineering用户
提问于 2014-02-27 11:14:57
回答 3查看 1.5K关注 0票数 5

假设您有一个项目(在您看来)编写得很好,模块化,等等,并且您希望保留它的大部分功能。然而,这个项目的一个重要部分没有很好的设计,而且很难用小的改动来修复。修复它的唯一方法是删除大量代码;它并不是那么糟糕,您需要(或应该)从头开始,但它非常普遍。

假设代码大约是20,000行非空格、非单一的大括号、不注释的Java、C++、C#、PHP或Ruby代码。您估计大约2000-3000行需要抛出或更改。在类似于Java或C#的情况下,您的包/名称空间可能会完全从头开始重写,而且对这些类的许多引用都会发生变化。

下面是具有挑战性的部分:需要更改的代码是系统中的粘合剂。这里有一张非常简单的图片,总结了这个问题:

这就是我所处的情况,导致了这个问题:当我在提交之间等待太久时,我该怎么办?

正如您所看到的,不仅仅是代码的各个部分在执行内部处理,还包括与系统其他部分通信的部分。API和内部数据结构都是不够的。试图使这两组API都可以用于增量更改,这将是令人遗憾的冗余。

当然,我在做任何事情之前都做了分支,但是我所做的每一次改变都产生了一个根本不起作用的产品。在许多情况下,我创建了编译错误。这导致我不断推迟提交,因为我想“是的,我把这些片段连接起来,但是我仍然需要实现这个新的接口,编写这个基本的功能,等等。”这导致了我没有检查任何东西的罪过,如果我再次陷入这种情况,我宁愿不要重复这个错误。我的所有API都是内部的,除了我必须遵守外部世界和第三方模块的API之外,这一点得到了缓解,但是我对这些部分的包装正在改变。

一个明显的替代解决方案是接受这样一个事实,即每一次更改都会导致整个产品的损坏,但是既然您正在签入一个分支,就可以了。特别是因为我是处理这段代码并使用这些API的唯一开发人员。所以也许这是正确的做法。或者,也许正确的做法是尝试首先将API重构到新的API,而不实际更改功能(如果可能的话),即使某些参数是虚拟的,或者最终会被删除,然后增量的更改就会更自我包含。还是有更好的办法呢?

EN

回答 3

Software Engineering用户

发布于 2014-02-27 14:14:36

简单地说:不要把海洋煮沸

换句话说,切断一些小的、可管理的块,而不是一次完成整个任务。在一个分支里。没有定期检查。

我一直喜欢这篇文章发表在Joel on上软件。它给出了非常好的具体例子,说明了可以针对代码库进行的小更改,以使代码逐渐变得更干净。

决定一个概念上相似的更改块,并为此创建一个分支。一个示例可能是将所有SQL代码移动到类中。在该分支中,您的工作流程如下所示:

  • 删除一条SQL语句
  • 做测试
  • 签入您的代码
  • 重复

一旦完成了这些更改,就将其合并到主分支中,并启动一个新的块。

这是假设你有测试。如果没有,您应该在开始之前创建它们(包括单元、回归和集成测试)。再说一遍,不是一次全部。如果您想重构一个没有测试的函数,那么编写测试,重构代码并运行测试,直到测试通过为止。这正是这些测试的目的所在。确保你在利用它们。

票数 8
EN

Software Engineering用户

发布于 2014-02-27 14:13:50

重要的是要知道您的产品是否已经发布,以及您想要接触的API是否以任何方式公开给单独发布的其他实体(模块、项目、产品、文档等)。如果其中任何一个答案都是“是”,则必须在过渡阶段保持API兼容性。与其取代旧的API,不如扩展它。在第二步中,您可以淘汰旧的API并给受影响的实体一个更新的机会。如果可以验证所有相关实体都已停止使用旧API,则只有这样才能将其从您的侧移除。(即使您没有外部依赖项,它仍然可以帮助您使用相同的方法进行重写)。

尽管如此,进行重大重写的一个好方法是尽可能多地将工作划分为较小的独立步骤。

很容易陷入同时处理多个目的的陷阱,但通常会以这样或那样的方式纠缠您的提交--最好的情况是,您必须跟踪多个分支和进展中的特性,这些特性需要在某个时候合并;最糟糕的情况是,所有新特性都是相互交织开发的,防止您对属于单个特性的提交进行清理,甚至阻止您进行任何提交,因为您始终拥有一半工作或不编译的特性。它还将“帮助”您介绍各种模糊的交互错误,在试图找到引入bug的确切位置时会给您带来很多麻烦。

这在很大程度上是一种心理训练,而且有不止一种方法。您可以从突出新API并记录预期用途和API细节开始。一旦完成,您就有了一个稳定的提交点。然后,您可以着手实现单个特性和单元测试(并且可以在此过程中多次提交)。最后,修改调用新API的模块,并完成所有“胶水”工作。此命令将帮助您在不破坏构建的情况下拥有可以提交的停止点。

再说一次,这只是一种方式,而不是唯一的方法。您的目的是模块化重写和最小化更改之间的交互。

票数 2
EN

Software Engineering用户

发布于 2014-02-27 14:40:50

我参与过不止一次有针对性的重写。在开始编写更多代码之前,您需要做一些分析:

  • 设计得好和设计不好的零件有什么不同?
  • 设计糟糕的代码是否可以与好代码的设计结构相匹配?
  • 识别设计不良的代码的所有触点。即调用什么方法,如何调用它们(即对象实例或单例,等等)
  • 这些触点中有多少是你能安全消除的?
  • 确定您可以用来将坏代码与好代码隔离开来的任何接口。

从所有的原始数据来看,你的最终结果应该是什么样的呢?您需要知道什么时候完成,或者什么时候重写足够好给您一个高质量的产品,而不需要放弃每一行代码。

  • 把工作分解成任务,你可以一次完成一个任务。
  • 估计每项任务需要多长时间。如果你真的不能给出一个好的估计,那么这个任务可能需要更多的细分。包括用于自动化和/或单元测试的时间。
  • 把你认为要完成的每一项任务的时间加起来,并把它增加三倍。我是认真的。会有隐藏的后果,你的重新设计,你没有办法在这一点上预期。
  • 将您的活动限制在目标重写范围内。您没有时间使用新特性,也没有时间处理代码的其他部分。
  • 一次只执行一个任务。在继续工作之前,确保每个任务都已完成并经过测试。

我可以说,经过我的有针对性的重写经验,很多次,最终的产品是更好和更容易维护,但时间表是最大的问题。如果你有有限的时间来完成这项工作,重写会使你的项目比你最初想象的要晚很多。

票数 2
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/230666

复制
相关文章
【JQuery】JQuery入门——JQuery 插件-validation
validate 是 jQuery 插件,及必须在 jQuery 的基础上进行运行。我们将导入 jQuery 库、 validate
陶然同学
2023/02/27
12.7K0
【JQuery】JQuery入门——JQuery 插件-validation
jQuery 插件
​ jQuery 功能比较有限,想要更复杂的特效效果,可以借助于 jQuery 插件完成。 这些插件也是依赖于jQuery来完成的,所以必须要先引入
梨涡浅笑
2022/05/08
7.2K0
jQuery 插件
jQuery 插件
jQuery 功能比较有限,想要更复杂的特效效果,可以借助于 jQuery 插件完成。
星辰_大海
2020/10/09
6.8K0
jQuery 插件
jQuery 插件
jQuery 功能比较有限,想要更复杂的特效效果,可以借助于 jQuery 插件完成。 这些插件也是依赖于jQuery来完成的,所以必须要先引入
清出于兰
2020/10/26
7.1K0
jQuery 插件
jQuery——插件
        简单来说:“jQuery是一个快速、简洁的JavaScript框架,是继Prototype之后又一个优秀的JavaScript代码库(框架)于2006年1月由John Resig发布。jQuery设计的宗旨是“write Less,Do More”,即倡导写更少的代码,做更多的事情。它封装JavaScript常用的功能代码,提供一种简便的JavaScript设计模式,优化HTML文档操作、事件处理、动画设计和Ajax交互
用户10196776
2022/11/22
15K0
JQuery插件
1.页面 @{ ViewBag.Title = "Index"; Layout = "~/Views/Shared/_Layout.cshtml"; } <ul id="ul"> <li>第一行</li> <li>第二行</li> <li>第三行</li> <li>第四行</li> <li>第五行</li> <li>第六行</li> </ul> <ul id="ul2"> <li>第一行</li> <li>第二行</li>
用户1055830
2018/01/18
4.1K0
RxJS 之于异步,就像 JQuery 之于 dom
记得当年我刚学 JavaScript 的时候,是从原生的 dom api 学起的,用原生的 dom api 完成一些增删改的功能,之后就会学习 JQuery。
神说要有光zxg
2022/03/03
1.8K0
jQuery插件 -- Form表单插件jquery.form.js
jQuery Form插件是一个优秀的Ajax表单插件,可以非常容易地、无侵入地升级HTML表单以支持Ajax。jQuery Form有两个核心方法 -- ajaxForm() 和 ajaxSubmit(), 它们集合了从控制表单元素到决定如何管理提交进程的功能。另外,插件还包括其他的一些方法: formToArray()、formSerialize()、fieldSerialize()、fieldValue()、clearForm()、clearFields() 和 resetForm()等。 下载地址:
joshua317
2018/04/10
13.8K0
Python jquery标签云
很多知名博主都喜欢弄个标签云。今天特地看了下源码。把标签云的方法单独扣了出来。这里做一下记录
py3study
2020/01/09
1.5K0
Python jquery标签云
jQuery基础--插件
官方API:http://api.jqueryui.com/category/all/
eadela
2019/09/29
3.5K0
jQuery Cookie 插件
Query 可以通过 jquery.cookie.js 插件来操作 Cookie。
陈不成i
2021/07/22
6K0
jQuery插件jQueryUI
jQuery UI是一个功能丰富的jQuery插件集合,提供了一系列用户界面组件和效果,可用于创建交互性强、视觉效果丰富的网页应用程序。
堕落飞鸟
2023/05/18
2.8K0
jquery 滚轮插件 jquery.mousewheel.js
jquery中没有鼠标滚轮事件,那么可以使用jquery的滚轮事件插件jquery.mousewheel.js。
Devops海洋的渔夫
2019/05/31
5K0
jQuery常用插件
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
奋飛
2019/08/15
3.3K0
jquery ajaxform插件
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html> <head> <title></title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <script src="../../scripts/jquery.js" type="text/javascript"></script> <script src="lib/jquery.form.js" type="text/javascript"></script> <script type="text/javascript"> // json
用户5760343
2019/10/10
8.4K0
jquery ajaxform插件
jQuery插件jQueryValidate
jQuery Validate是一个流行的jQuery表单验证插件,用于验证用户输入的表单数据。它提供了一组简单且强大的验证规则和选项,使开发人员能够轻松地实现客户端表单验证功能。
堕落飞鸟
2023/05/18
2.4K0
The jQuery UI CSS Framework
jQuery UI是 jquery官方推出的配合jquery使用的用户界面组件集合!包含了许多的界面操作功能,如我们常用的表格排序,拖拽,TAB选项卡,滚动条,相册浏 览,日历控件,对话框等 JS插件~~可以很方便的开发用户界面上的功能,使得您的开发工作事半功倍~~不用写繁琐的JS代码。 jQuery UI提供了一个强大的CSS Framework,为用户定义使用jQuery widgets。其中的ThemeRoller更是让你随心所欲地操作设计不同风格的网页界面。 jQuery UI是一套基于jquery
张善友
2018/01/19
2.4K0
jQuery Verbose Calendar:显示整年的 jQuery 日历插件
jQuery Verbose Calendar 是一个可以把整年的日历显示在一个页面上的 jQuery 插件,加载之后,它会自动滚到今天的日期处,当你鼠标移动到日期上,可以显示今天星期几。并且这个日历插件支持 Callback 函数,当你点击某个日期的时候,你可以执行一些自定义行为,或者插入任意的 HTML 元素。
Denis
2023/04/15
2K0
教你开发jQuery插件(转) 教你开发jQuery插件(转)
原文:http://www.cnblogs.com/Wayou/p/jquery_plugin_tutorial.html
用户1518699
2018/09/12
3.4K0
教你开发jQuery插件(转)
		教你开发jQuery插件(转)
jquery弹窗插件dialog_jquery进度条插件
网页顶部进度条插件的有四五种,基本原理就是动态地创建一个元素,然后通过设置它的width来实现动画效果,width增长到达指定位置时,将其去掉。 来看看nanobar.js作者jacoborus是怎么做到的吧!
全栈程序员站长
2022/08/04
4K0

相似问题

有没有不需要jQuery.UI的jQuery可排序插件

20

有没有可以替代html select标签的jQuery插件?

40

jQuery对话框插件就像广告一样

10

有没有jQuery投票插件?

27

有没有jquery的滚动插件?

30
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档