问题标签 [refactoring]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
36 回答
11988 浏览

c# - 您使用哪些适用于 C# 的 ReSharper 4+ 实时模板?

您使用哪些适用于C#的 ReSharper 4.0 模板?

让我们以以下格式分享这些内容:


[标题]

可选描述

快捷方式:快捷方式
适用于: [AvailabilitySetting]

宏属性(如果存在):

  • Macro1 - 值 - EditableOccurence
  • Macro2 - 值 - EditableOccurence

0 投票
7 回答
571 浏览

refactoring - make bad code good

I got myself reading a article regarding changing the existing bad code into a good one. For reference, this is the link to the article http://www.javaworld.com/jw-03-2001/jw-0323-badcode.html?page=1

It broadly talked about the following

  • Add comments

  • Re-Factoring Code

    • Break large classes into smaller classes
    • Break large functions into smaller functions
    • Change code which is difficult to understand
  • Use Layered architecture

Seems good. Any addons to this list which you all may have come across ?

0 投票
9 回答
597 浏览

refactoring - 改进非常糟糕的系统

你将如何开始改进一个非常糟糕的系统?

在你推荐创建单元测试和重构之前,让我解释一下我的意思。我可以使用这些技术,但在这种情况下那将毫无意义。

实际上,这个系统是如此的破碎,它没有做它需要做的事情。

例如,系统应该计算它发送了多少条消息。它主要工作,但在某些情况下它“忘记”增加消息计数器的值。问题是,许多其他模块都有自己的变通方法建立在这个计数器上,如果我更正计数器,整个系统会变得比现在更糟。解决方案可能是修改所有模块并删除它们自己的更正,但有 150 多个模块需要如此多的协调,我负担不起。

更糟糕的是,有些问题的解决方法不在系统本身,而在人们的脑海中。例如,系统不能在一个消息组中表示超过四个相关消息。有些服务需要将五条消息组合在一起。会计部门知道这个限制,每次他们计算这些服务的消息时,他们都会计算消息组并将其乘以 5/4 以获得正确的消息数量。绝对没有关于这些偏差的文档,也没有人知道现在系统中有多少这样的东西。

那么你将如何着手改进这个系统呢?你会遵循什么策略?

一些额外的事情:我是一个单人军队,因此雇佣足够多的人并重新设计/重构系统是不可接受的答案。在几周或几个月后,我真的应该表现出一些明显的进步,所以在几年内自己进行重构也不是一个选择。

一些技术细节:该系统是用 Java 和 PHP 编写的,但我认为这并不重要。它背后有两个数据库,一个 Oracle 和一个 PostgreSQL。除了之前提到的代码本身的缺陷之外,它的编写和文档记录也很糟糕。

附加信息:

计数器问题不是同步问题。counter++ 语句被添加到某些模块中,而不是添加到其他一些模块中。一个快速而肮脏的解决方法是将它们添加到它们丢失的地方。长期的解决方案是让它成为需要它的模块的一个方面,这样以后就不可能忘记它。我在修复这样的事情上没有任何问题,但如果我做出这个改变,我会打破 10 多个其他模块。

更新:

我接受了 Greg D 的回答。即使我更喜欢亚当·贝莱尔的作品,也不知道什么是最理想的。谢谢大家的回答。

0 投票
7 回答
17090 浏览

objective-c - Xcode 中是否有组合键来实现协议?

在 Visual Studio 中,如果我定义一个类来实现一个接口,例如

我可以右键单击 ISerializable,从上下文菜单中选择“实现接口”,然后在我的类定义中看到相应的方法。

Mac 上的 Xcode 中有类似的功能吗?我希望能够以这种方式自动实现协议。也许使用生成但注释掉的可选方法。

0 投票
2 回答
706 浏览

eclipse - 在 Eclipse 中重命名访问器/修改器方法?

当他们获取/设置的变量被重构->重命名(Eclipse 3.4)时,有什么方法可以自动重命名访问器/修改器?

0 投票
20 回答
3108 浏览

coding-style - 摆脱匈牙利符号的最佳方法?

假设您继承了一个 C# 代码库,该代码库使用一个具有 200 个静态方法的类来提供核心功能(例如数据库查找)。在那个班级的许多噩梦中,匈牙利符号(不好的那种)的大量使用。

您会重构变量名称以删除匈牙利符号,还是不理会它们?

如果您选择更改所有变量以删除匈牙利符号,您的方法是什么?

0 投票
11 回答
33716 浏览

c++ - 将 C 源代码转换为 C++

您将如何将相当大(>300K)、相当成熟的 C 代码库转换为 C++?

考虑到的 CI 被拆分为大致对应于模块的文件(即比典型的基于 OO 类的分解更细化),使用内部链接代替私有函数和数据,以及公共函数和数据的外部链接。全局变量广泛用于模块之间的通信。有一个非常广泛的集成测试套件可用,但没有单元(即模块)级别的测试。

我想到了一个总体策略:

  1. 编译 C++ 的 C 子集中的所有内容并使其正常工作。
  2. 将模块转换为巨大的类,以便所有交叉引用都由类名限定,但将所有函数和数据保留为静态成员,并使其正常工作。
  3. 使用适当的构造函数和初始化的交叉引用将大类转换为实例;酌情用间接访问替换静态成员访问;并让它工作。
  4. 现在,将项目作为一个错误因素的 OO 应用程序来处理,并在依赖项易于处理的情况下编写单元测试,并在它们不易于处理的情况下分解为单独的类;这里的目标是在每次转换时从一个工作程序转移到另一个工作程序。

显然,这将是相当多的工作。有没有关于这种翻译的案例研究/战争故事?替代策略?其他有用的建议?

注 1:该程序是一个编译器,可能有数百万其他程序依赖于它的行为不变,因此大规模重写几乎不是一种选择。

注意 2:源代码已有近 20 年的历史,每年可能有 30% 的代码流失(修改的行数 + 添加的行数/之前的总行数)。换句话说,它被大量维护和扩展。因此,目标之一是提高可维护性。

[为了这个问题,假设翻译成C++是强制性的,并且不能将其留在 C。添加此条件的目的是清除“将其保留在 C 中”的答案。]

0 投票
4 回答
799 浏览

vb.net - Visual Studio 2005 for VB 中的重构功能

有人知道 Visual Studio 2005 的一个很好的免费插件,可以在 VB 中获得重构功能吗?

0 投票
6 回答
1545 浏览

version-control - 您如何处理重构和合并需求之间的紧张关系?

我们在交付新版本时的政策是在我们的 VCS 中创建一个分支并将其处理给我们的 QA 团队。当后者开绿灯时,我们标记并发布我们的产品。该分支会保留(仅)接收错误修复,以便我们可以创建技术版本。这些错误修复随后被合并到主干上。

在此期间,主干看到主要的开发工作,并且可能会受到重构更改的影响。

问题是需要有一个稳定的主干(以便错误修复的合并成功 - 如果代码已被提取到另一个方法或移动到另一个类,通常不能)和在引入新功能时需要对其进行重构。

我们的策略是在足够的时间过去并且分支足够稳定之前不进行任何重构。在这种情况下,可以开始在主干上进行重构更改,并且在主干和分支上手动提交错误修复。

但这意味着开发人员必须等待相当长的时间才能在主干上提交任何重构更改,因为这可能会破坏从分支到主干的后续合并。不得不手动将错误从分支移植到主干是很痛苦的。在我看来,这阻碍了发展......

你如何处理这种压力?

谢谢。

0 投票
14 回答
1749 浏览

unit-testing - 你如何重构?

我想知道其他开发人员如何开始重构。你的第一步是什么?如果您重构不属于您的代码,这个过程(重构)有何不同?你在重构时写测试吗?