我们在交付新版本时的政策是在我们的VCS中创建一个分支并将其处理给我们的QA团队.当后者发出绿灯时,我们会标记并发布我们的产品.分支保持接收(仅)错误修复,以便我们可以创建技术版本.这些错误修复随后合并在主干上.
在此期间,主干会看到主要的开发工作,并且可能会受到重构更改.
问题是需要有一个稳定的主干之间存在紧张关系(以便错误修复的合并成功 - 如果代码已被提取到另一个方法,或者移动到另一个类,通常不能)在引入新功能时需要重构它.
我们的政策是在经过足够的时间之前不进行任何重构,并且分支足够稳定.在这种情况下,可以开始对主干进行重构更改,并在主干和分支上手动提交错误修复.
但这意味着开发人员必须等待一段时间才能在主干上进行任何重构更改,因为这可能会破坏从分支到主干的后续合并.并且必须手动将分支中的错误移植到主干上是很痛苦的.在我看来,这妨碍了发展......
你怎么处理这种紧张局势?
谢谢.
我的一位同事重构了这段代码:
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)
如果它只使用一次,你就不需要创建一个变量.
我的回答是,制作曾经使用过的变量是很好的做法,因为它:
反对这种方式的论据"更多代码行","不必要的变量"是使编译器的生活更容易但没有显着的速度或资源节省的参数.
任何人都可以想到一个不应该创建曾经使用过的变量名的情况吗?
我知道@VisibleForTesting是不可取的,因为它只是为了测试目的而改变了类的接口.理想情况下,我们应该测试我们实际使用的接口.但什么是一个好的选择?
有没有关于在Eclipse中实现新重构的好文档?具体来说,我想访问Java类的Java,进行一些非平凡的更改,并将结果保存回源文件.
到目前为止,我发现的唯一文档是(1)现有重构的源代码和(2)关于LTK和Java AST的一些文章:
我应该阅读其他任何文章或教程吗?
我有一个自由Web应用程序项目,客户端每两周左右请求一次新功能.我无法预测即将推出的功能的要求.因此,当客户端请求新功能时,可能会发生以下几种情况之一:
我轻松实现该功能,因为它与现有平台兼容
我很难实现这个功能,因为我必须重写该平台的重要部分
客户撤回请求,因为在现有平台上实施成本太高
在项目开始时,大约六个月,所有功能请求都归入类别1),因为系统很小且敏捷.但在过去的六个月中,大多数功能实现属于第2类).系统已经成熟,每次我想添加新模块时都迫使我进行重构和测试.另外,我发现自己破坏了用来工作和修复它的东西(我没有得到报酬).
客户开始对我实施新功能的时间和成本感到沮丧.对他们来说,许多功能请求的规模与六个月前他们要求的功能相同.例如,客户会问,"如果去年建立一个票务系统需要1周时间,为什么今天要建立一个事件登记系统需要1个月?事件登记系统比票务系统简单得多.它应该只需要你一个星期!" 由于这种情况,我担心功能请求很快就会出现在类别3)中.事实上,我自己已经花了很多钱,因为我自愿花了很多时间来支持这个项目.
当我诚实地告诉他做某事所花费的时间时,客户经常感到震惊.客户总是将我的估算值与项目的前几个月进行比较.我认为他们没有为开发,维护和支持成熟的Web应用程序所花费的成本做好准备.
在为一家全职公司工作时,管理人员更愿意接受我的估计,甚至鼓励我填写我的数据以应对意外情况.有没有办法让我的客户以同样的方式思考?
任何人都可以提供关于我如何继续在这个网络项目上工作而不需要花费太多费用的建议吗?
附加信息 - 我只有1年的全职自由职业生涯.我还没有高端客户,但我慢慢到那里.随着时间的推移,我的客户越来越好.
我面临的情况是,我们有很多非常长的方法,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 ++手动编写)
我即将开始计划我们的代码库的重大重构,我想得到一些问题的一些意见和答案(我已经看到很多关于类似主题的讨论,例如/sf/ 108141/how-do-do-do-working-very-messy-legacy-code, 用于大规模重构的策略,但我有一些具体的问题(在底部):
我们开发了一个复杂的应用 有大约25名开发人员在使用代码库.到目前为止,该产品的总人数约为150年.目前的代码库是一个用ant构建的单一项目.我正在着手的项目的高级目标是将代码库模块化为其各种基础架构和应用程序组件.目前各种逻辑组件之间没有良好的分离,因此很明显,任何模块化工作都需要包含一些API定义并进行严格的解决以实现分离.质量标准很低 - 几乎没有测试,并且绝对没有测试作为构建过程的一部分运行.
另一个非常重要的一点是,该项目需要与活跃的产品开发和发送给客户的版本并行进行.
项目目标:
我的想法和问题:
我目前的演出中没有ReSharper,我想念"Extract Variable"重构.我知道可以在VS中编写自己的重构"片段".有没有人这样做?
我的seeds.rb文件变得非常大.重构文件中数据的最佳方法是什么?
我可以将数据放入文件require中的各种文件中seeds.rb吗?
对于其中一个java项目,我们最近开始使用SonarLint.代码分析的输出显示太多关键代码气味警报.
Critical code smell: Refactor this method to reduce its Cognitive Complexity.
Run Code Online (Sandbox Code Playgroud)
我听说过Cyclomatic Complexity而不是认知复杂性.我对小组的问题:
我已经通过这个链接,但无法得到我所有问题的答案.
提前致谢.