标签: refactoring

你如何处理重构与合并需求之间的紧张关系?

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

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

问题是需要有一个稳定的主干之间存在紧张关系(以便错误修复的合并成功 - 如果代码已被提取到另一个方法,或者移动到另一个类,通常不能)在引入新功能时需要重构它.

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

但这意味着开发人员必须等待一段时间才能在主干上进行任何重构更改,因为这可能会破坏从分支到主干的后续合并.并且必须手动将分支中的错误移植到主干上是很痛苦的.在我看来,这妨碍了发展......

你怎么处理这种紧张局势?

谢谢.

version-control merge refactoring branch release

22
推荐指数
2
解决办法
1246
查看次数

创建一次使用的变量是一种好习惯吗?

我的一位同事重构了这段代码:

private void btnGeneral_Click(object sender, RoutedEventArgs e)
{
    Button button = (Button)e.OriginalSource;
    Type type = this.GetType();
    Assembly assembly = type.Assembly;
    string userControlFullName = String.Format("{0}.{1}", type.Namespace, button.Name);
    UserControl userControl = (UserControl)assembly.CreateInstance(userControlFullName);
}
Run Code Online (Sandbox Code Playgroud)

这段代码:

private void btnGeneral_Click(object sender, RoutedEventArgs e)
{
    Button button = (Button)e.OriginalSource;
    Type type = this.GetType();
    Assembly assembly = type.Assembly;
    UserControl userControl = (UserControl)assembly.CreateInstance(String.Format("{0}.{1}", type.Namespace, button.Name));
}
Run Code Online (Sandbox Code Playgroud)

如果它只使用一次,你就不需要创建一个变量.

我的回答是,制作曾经使用过的变量是很好的做法,因为它:

  • 作为和减少评论(很清楚"userControlFullName"是什么)
  • 使代码更容易阅读,即更多的代码"读起来像英语"
  • 通过用明确的变量名替换部分语句来避免超长语句
  • 因为你可以将鼠标悬停在变量名上,所以更容易调试,例如在没有调试器的PHP编程的情况下,更容易回显这些变量名来获取它们的值

反对这种方式的论据"更多代码行","不必要的变量"是使编译器的生活更容易但没有显着的速度或资源节省的参数.

任何人都可以想到一个不应该创建曾经使用过的变量名的情况吗?

variables refactoring coding-style

22
推荐指数
5
解决办法
1512
查看次数

@VisibleForTesting的替代品

我知道@VisibleForTesting是不可取的,因为它只是为了测试目的而改变了类的接口.理想情况下,我们应该测试我们实际使用的接口.但什么是一个好的选择?

refactoring easymock

22
推荐指数
1
解决办法
2万
查看次数

为Eclipse编写一个新的重构插件?

有没有关于在Eclipse中实现新重构的好文档?具体来说,我想访问Java类的Java,进行一些非平凡的更改,并将结果保存回源文件.

到目前为止,我发现的唯一文档是(1)现有重构的源代码和(2)关于LTK和Java AST的一些文章:

我应该阅读其他任何文章或教程吗?

java eclipse plugins refactoring

21
推荐指数
1
解决办法
4698
查看次数

如何让自由职业客户了解开发和维护成熟产品的成本?

我有一个自由Web应用程序项目,客户端每两周左右请求一次新功能.我无法预测即将推出的功能的要求.因此,当客户端请求新功能时,可能会发生以下几种情况之一:

  1. 我轻松实现该功能,因为它与现有平台兼容

  2. 我很难实现这个功能,因为我必须重写该平台的重要部分

  3. 客户撤回请求,因为在现有平台上实施成本太高

在项目开始时,大约六个月,所有功能请求都归入类别1),因为系统很小且敏捷.但在过去的六个月中,大多数功能实现属于第2类).系统已经成熟,每次我想添加新模块时都迫使我进行重构和测试.另外,我发现自己破坏了用来工作和修复它的东西(我没有得到报酬).

客户开始对我实施新功能的时间和成本感到沮丧.对他们来说,许多功能请求的规模与六个月前他们要求的功能相同.例如,客户会问,"如果去年建立一个票务系统需要1周时间,为什么今天要建立一个事件登记系统需要1个月?事件登记系统比票务系统简单得多.它应该只需要你一个星期!" 由于这种情况,我担心功能请求很快就会出现在类别3)中.事实上,我自己已经花了很多钱,因为我自愿花了很多时间来支持这个项目.

当我诚实地告诉他做某事所花费的时间时,客户经常感到震惊.客户总是将我的估算值与项目的前几个月进行比较.我认为他们没有为开发,维护和支持成熟的Web应用程序所花费的成本做好准备.

在为一家全职公司工作时,管理人员更愿意接受我的估计,甚至鼓励我填写我的数据以应对意外情况.有没有办法让我的客户以同样的方式思考?

任何人都可以提供关于我如何继续在这个网络项目上工作而不需要花费太多费用的建议吗?

附加信息 - 我只有1年的全职自由职业生涯.我还没有高端客户,但我慢慢到那里.随着时间的推移,我的客户越来越好.

refactoring time-estimation

21
推荐指数
2
解决办法
881
查看次数

很长的方法总是需要重构吗?

我面临的情况是,我们有很多非常长的方法,1000行或更多.

为了给你提供更多细节,我们有一个传入的高级命令列表,每个命令都生成一个较长(有时很大)的低级命令列表.有一个工厂为每个传入命令创建一个类的实例.每个类都有一个处理方法,其中生成所有较低级别的命令按顺序添加.正如我所说,这些命令序列及其参数经常导致处理方法达到数千行.

有很多重复.许多命令模式在不同命令之间共享,但代码反复重复.这让我觉得重构是一个非常好的主意.

相反,我们的规格与当前代码完全相同.每个传入命令的命令列表很长.当我尝试一些重构时,我开始对规格感到不舒服.我想念规范和代码之间的明显比喻,并浪费时间深入研究新创建的公共类.

那么这里的问题是:一般来说,你认为这么长的方法总是需要重构,或者在类似的情况下它是可以接受的吗?(遗憾的是,重构规范不是一种选择)


编辑:我删除了每个"生成"的引用,因为它实际上令人困惑.它不是自动生成的代码.

class InCmd001 {

  OutMsg process ( InMsg& inMsg ) {

     OutMsg outMsg = OutMsg::Create();

     OutCmd001 outCmd001 = OutCmd001::Create();
     outCmd001.SetA( param.getA() );
     outCmd001.SetB( inMsg.getB() );

     outMsg.addCmd( outCmd001 );

     OutCmd016 outCmd016 = OutCmd016::Create();
     outCmd016.SetF( param.getF() );

     outMsg.addCmd( outCmd016 );

     OutCmd007 outCmd007 = OutCmd007::Create();
     outCmd007.SetR( inMsg.getR() );

     outMsg.addCmd( outCmd007 );

     // ......

     return outMsg;
  }
}
Run Code Online (Sandbox Code Playgroud)

这里是一个传入命令类的示例(用伪c ++手动编写)

c++ refactoring

21
推荐指数
5
解决办法
1965
查看次数

如何进行大型重构项目?

我即将开始计划我们的代码库的重大重构,我想得到一些问题的一些意见和答案(我已经看到很多关于类似主题的讨论,例如/sf/ 108141/how-do-do-do-working-very-messy-legacy-code, 用于大规模重构的策略,但我有一些具体的问题(在底部):

我们开发了一个复杂的应用 有大约25名开发人员在使用代码库.到目前为止,该产品的总人数约为150年.目前的代码库是一个用ant构建的单一项目.我正在着手的项目的高级目标是将代码库模块化为其各种基础架构和应用程序组件.目前各种逻辑组件之间没有良好的分离,因此很明显,任何模块化工作都需要包含一些API定义并进行严格的解决以实现分离.质量标准很低 - 几乎没有测试,并且绝对没有测试作为构建过程的一部分运行.

另一个非常重要的一点是,该项目需要与活跃的产品开发和发送给客户的版本并行进行.

项目目标:

  • 允许跨不同项目重用组件
  • 将应用程序与基础架构分开,并允许它们独立发展
  • 提高可测试性(通过创建API)
  • 简化开发人员的开发环境(减少检出和编译的代码)

我的想法和问题:

  1. 您对该项目的目标有何看法?你会改变什么?
  2. 你有这些项目的经验吗?会有什么建议吗?
  3. 我非常关心缺乏测试 - 因此我无法控制,因为我知道重构过程并没有像我一样破坏任何东西.这是一个问题22,因为这个项目的目标之一是使我们的代码更可测试...
  4. Michael Feathers的" 有效使用遗产代码 "非常受我的影响.根据它,自下而上的方法是解决我的问题的方法 - 不要首先跳到代码库并尝试修复它,而是通过在几个月内围绕新代码添加单元测试来开始,并看看如何代码(和团队)变得更好,在某种程度上抽象将出现,API将浮出水面,基本上 - 模块化将自己开始发生.有没有人有这方面的经验?正如关于这个主题的许多其他问题所见 - 这里的主要问题是管理上的怀疑."如何按类别进行测试(并花费大量时间这样做)会让我们进入一个稳定的系统?这是一个很好的理论,它在现实生活中不起作用".出售这个的任何提示?

legacy refactoring project-management

21
推荐指数
2
解决办法
5767
查看次数

没有ReSharper的Visual Studio中的"Extract Variable"

我目前的演出中没有ReSharper,我想念"Extract Variable"重构.我知道可以在VS中编写自己的重构"片段".有没有人这样做?

refactoring visual-studio-2010 code-snippets

21
推荐指数
2
解决办法
3373
查看次数

拆分seeds.rb文件

我的seeds.rb文件变得非常大.重构文件中数据的最佳方法是什么?

我可以将数据放入文件require中的各种文件中seeds.rb吗?

ruby refactoring ruby-on-rails

21
推荐指数
2
解决办法
6605
查看次数

认知复杂性及其对代码的影响

对于其中一个java项目,我们最近开始使用SonarLint.代码分析的输出显示太多关键代码气味警报.

Critical code smell: Refactor this method to reduce its Cognitive Complexity.
Run Code Online (Sandbox Code Playgroud)

我听说过Cyclomatic Complexity而不是认知复杂性.我对小组的问题:

  • 认知复杂性是行业标准吗?
  • 除了可读性和可维护性之外,认知复杂性对代码的影响.
  • 认知复杂性是否仅适用于方法或代码的任何其他部分?
  • 认知复杂性所依赖的任何特定标准?
  • 提高代码认知复杂性的最佳实践.

我已经通过这个链接,但无法得到我所有问题的答案.

提前致谢.

java algorithm refactoring mapreduce sonarlint

21
推荐指数
1
解决办法
1万
查看次数