标签: refactoring

您是否应该将您采用的第三方库包装到项目中?

我今天和同事讨论过.

他声称每当你使用第三方库时,你应该总是为它写一个包装器.因此,您可以随时更改内容并根据具体用途调整内容.

总是不同意这个词,关于log4j的讨论已经出现了,我声称log4j经过了很好的测试和经过时间验证的API和实现,所有可以想象的都可以后验配置,你不应该包装.即使你想要包装,也有经过验证的包装器,如commons-logging和log5j.

我们讨论的另一个例子是Hibernate.我声称它有一个非常大的API被包装.此外,它还有一个分层API,可让您根据需要调整其内部.我的朋友声称他仍然相信它应该被包装但是他没有这样做因为API的大小(这个同事在我们当前的项目中比我更老练).

我声称这个,并且应该在特定情况下进行包装:

  • 您不确定图书馆如何满足您的需求
  • 您将只使用一小部分库(在这种情况下,您可能只暴露其API的一部分).
  • 您不确定库的API或实现的质量.

我还坚持认为,有时你可以包装代码而不是库.例如,将与数据库相关的代码放在DAO层中,而不是抢先包装所有的hibernate.

嗯,最后这不是一个真正的问题,但您的见解,经验和意见都受到高度赞赏.

refactoring

44
推荐指数
6
解决办法
6463
查看次数

在VS2008中使用Curly Braces {}包围代码块的任何方法?

我总是发现自己需要在花括号{}中包含一段代码,但不幸的是,它不包含在C#环绕声代码片段中,这似乎是一种疏忽.我也找不到任何建立你自己的环绕片段的东西(只是其他类型的片段).

我实际上也在运行Resharper,但它似乎也没有这个功能(或者我还没想过如何激活它).

我们拥有包括编码标准的代码,甚至单行的之后,如果还是别人的大括号,所以如果我可以只让ReSharper的做自动重构会更加美好!

c# resharper refactoring visual-studio-2008 code-snippets

44
推荐指数
3
解决办法
2万
查看次数

如何使用emacs重构C++源代码?

我主要对C++和方法/类名/签名自动更改感兴趣.

c++ emacs refactoring

43
推荐指数
6
解决办法
2万
查看次数

我应该如何在JS中将方法标记为"过时"?

我正在重构一个相当大的JS文件,其中包含许多不相关的方法,根据它们的用法将这些方法重新组合在一起,并根据需要重命名其中一些(以防止误导名称).

但是,实际使用此代码的大多数网页分布在不同的代码分支中,阻止我进行简单的查找和替换.我可以在所有不同的分支中执行此操作,但这需要同时在30多个分支中进行维护,或者可能忘记在其他分支(由我或其他团队成员)合并更改后执行重命名.

如果这是C#,我可以用[Obsolete]标记方法,它会根据需要标记必要的更改,所以我正在寻找一些相当的东西.我仍然会通过将调用重定向到新方法来提供旧接口的功能一段时间,但我想"迫使"人们因为其他原因在页面上工作时切换到新界面.

有没有其他方法可以做类似的事情,除了debugger; 为每个方法添加一个语句和一个详细的注释,以便它在开发时而不是在生产中中断?

javascript refactoring

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

将C源转换为C++

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

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

我想到了一个总体战略:

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

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

注1:程序是一个编译器,可能数以百万计的其他程序依赖于它的行为不会改变,所以批量重写几乎不是一个选择.

注2:来源近20年,每年可能有30%的代码流失(线路修改+增加/以前的总线路).换句话说,它被大量维护和扩展.因此,其中一个目标是增加可持续性.

[为了这个问题,假设转换为C++是强制性的,而将它留在C中则不是一种选择.添加这个条件的重点是清除"留在C中"的答案.]

c c++ legacy refactoring program-transformation

41
推荐指数
4
解决办法
3万
查看次数

如何在Android Studio中重命名文件

有没有办法在Android Studio项目中更改文件名?我来自Visual Studio并尝试选择 - 更改文件名.我已经尝试过F2那个键盘快捷键.

refactoring android file-rename android-studio

41
推荐指数
2
解决办法
5万
查看次数

任何与Xcode相同的ReSharper?

我是一个完整的Xcode /的Objective-C /可可新手,但我学得很快,真正开始享受得到认真处理一个新的语言,平台和模式.

有一件事是,虽然,使用Visual Studio有R#已经这么久了,我有种被宠坏的编码工具,如重构和完成等,并据我可以告诉Xcode中有一些相当有限的内置支持,这东西.

关于这一点,没有人知道如果任何加载项或任何可用于Xcode的环境,增加编码助手,如从一个类的接口定义等,自动生成实施骷髅?

我怀疑没有,但我想它无能为力.

macos xcode refactoring objective-c

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

你如何重构一个庞大的混乱代码库?

我的代码很乱.不可否认,我自己写了一年 - 一年前.它没有得到很好的评论,但它也不是很复杂,所以我可以理解它 - 只是不足以知道从哪里开始重构它.

我违反了过去一年中我读过的所有规则.有些职责有多个职责,有间接访问(我忘记了这个术语 - 类似的东西foo.bar.doSomething()),就像我说的那样评论不好.最重要的是,它是游戏的开始,所以图形与数据耦合,或者我试图解耦图形和数据的地方,我制作数据public以便图形能够访问数据需要...

这是一个巨大的混乱!我从哪里开始?你会如何开始这样的事情?

我目前的方法是获取变量并将它们切换为私有,然后重构破坏的碎片,但这似乎不够.请建议其他策略来浏览这个烂摊子并把它变成干净的东西,以便我可以继续我离开的地方!


两天后更新:我一直在绘制类似UML的图表,并沿途捕捉一些"低挂水果".我甚至发现了一些代码是新功能的开始,但是当我试图减少一切时,我已经能够删除这些位并使项目感觉更清洁.在绑定我的测试用例之前,我可能会尽可能地进行重构(当然,只有那些100%肯定不影响功能的东西!),所以我不必重构测试用例.改变功能.(你认为我做得对吗,或者你认为,我更容易吸吮它并先写下测试吗?)

请投票选出最佳答案,以便我公平地标记!您也可以随意添加自己的答案,还有空间给您!我会再给它一天左右,然后可能将最高投票的答案标记为已接受.

感谢迄今为止做出回应的所有人!


2010年6月25日:我发现了一篇博文,它直接回答了那个似乎对编程有很好掌握的人的问题:(或者,如果你读了他的文章,可能不会:))

为此,当我需要重构代码时,我做了四件事:

  1. 确定代码的用途是什么
  2. 绘制所涉及的类的UML和动作图
  3. 四处寻找合适的设计模式
  4. 确定当前类和方法的更清晰的名称

language-agnostic oop refactoring

40
推荐指数
5
解决办法
6096
查看次数

您如何处理对提高质量影响最大的遗留代码库?

当您在遗留代码库中工作时,随着时间的推移会产生哪些影响,从而提高代码库的质量?

  • 删除未使用的代码
  • 删除重复的代码
  • 添加单元测试以改善覆盖率低的测试覆盖率
  • 跨文件创建一致的格式
  • 更新第三方软件
  • 减少静态分析工具(即.Findbugs)生成的警告

代码库是由许多开发人员编写的,他们多年来具有不同的专业知识水平,许多领域未经测试,有些领域不可测试,而且没有花费大量时间编写测试.

legacy refactoring legacy-code

39
推荐指数
4
解决办法
3657
查看次数

是否有一个重构SQL的工具,有点像ReSharper for SQL

我现在追求的那种东西是非常基本的:

  • 自动格式化
  • 检测未使用的变量
  • 变量命名约定检查

如果有一个工具可以处理更复杂的重构(例如重构数据库中的重构),我不会感到惊讶,但我很欣赏当前数据库结构和数据状态引入的额外复杂性可能会阻止其中的许多重构.

我想我是在追求ReSQLer

sql sql-server refactoring

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