清理大型遗留 Java 项目

2023-12-27

我被指派去做一个大型Java项目的一些工作,开发人员的几次迭代的影响是显而易见的。没有标准的编码风格、格式、命名约定或类结构。当我遇到 Javadoc 类时真是美好的一天,单元测试是一个快乐的白日梦。

到目前为止,我们参与该项目的人员一直在“融入”,适应我们正在研究的任何类别的现有惯例,但现在是时候强加一些秩序和一致性了。

这是一项艰巨的挑战,我正在寻找人们对这项任务可能提出的任何建议。是否有任何特别有效的策略或需要注意的陷阱?尝试一下是个好主意吗?

编辑添加:我不想给人留下该项目很糟糕的印象 - 事实上它设计得很扎实,而且基本上写得很好。只是感觉它的年龄和维护的不可避免性......


我发现 Eclipse 对于此类操作来说是一个非常强大的工具。

很多人都非常信赖命令行工具和基于模式的文本编辑器进行编程,但使用完整的 IDE 进行重大重构具有强大的优势:

  • 自动实时编译向您显示错误发生时以及发生的任何地方。仅仅因为您进行了更改并且类中没有任何内容或立即出现包中断,并不意味着您没有在其他地方创建问题。红旗将出现在 Eclipse 中的包树中,引导您直接找到它们。
  • 基于图形的重命名和移动。重命名代码元素所产生的影响比您所知道的要大得多。 Eclipse 将向您显示相关元素的每个实例的详细信息以及重命名将如何更改它。
  • 自动导入管理使您能够省去处理确保所有进口物品井然有序的工作。 Eclipse 将在使用时自动添加导入,并用动作灯泡标记未使用的导入,以便一键删除。
  • Use 代码风格确保所有源文件对所有内容都使用相同的格式。空格、缩进、换行、括号都可以为您设置格式。这在您创建新代码以及更新现有文件时起作用。

除了 Eclipse 的工具集之外,您还可以考虑利用其他现代 Java 工具来确保您的代码始终正常运行。

  • 测试套件使您能够不断确保所做的任何更改不会对项目的功能产生负面影响。如果您要重构某个功能,请编写两个或三个测试用例来演示其工作方式。确保它们在任何更改之前和之后运行。这是在问题成为问题之前发现问题的最简单方法。
  • 使用 Maven 等工具来协助进行依赖关系、测试、编译和部署。不要浪费时间再次执行任何上述任务。专注于编写能完成工作的代码。

edit:

我个人也更喜欢 Eclipse,因为我是负责重构的人,而不是一些对我的代码几乎一无所知的自动化工具。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

清理大型遗留 Java 项目 的相关文章

  • 具有 OpenGL ES 3.1 上下文的 GLSurfaceView

    我正在使用 OpenGL 开发 Android 我知道如何使用GLSurfaceView及其自定义派生类 使用以下方法创建 OpenGL ES 2 0 上下文GLSurfaceView setEGLContextClientVersion
  • Joda Time 持续时间或间隔中的分钟数

    我有这个简单的代码 DateTime date new DateTime dateValue DateTime currentDate new DateTime System currentTimeMillis System out pri
  • 使用 PropertiesLauncher 启动的 Spring-boot(特定于配置文件)应用程序中出现覆盖应用程序属性的问题

    我在尝试使用文件系统上的覆盖文件中声明的另一个值来覆盖类路径上特定于配置文件的应用程序属性文件中声明的属性时遇到困难 我有一个自动配置的 Spring boot 应用程序 即 使用 EnableAutoconfiguration 有多个配置
  • Spring Autowire 在同一类中创建 Bean 会导致:请求的 bean 当前正在创建错误*

    我知道该错误是不言自明的 但是当我将其余模板的设置从构造函数删除为 Autowired Qualifier myRestTemplate private RestTemplate restTemplate 时 它 起作用了 只是想知道如果同
  • flink - 使用匕首注入 - 不可序列化?

    我使用 Flink 最新通过 git 从 kafka 流式传输到 cassandra 为了简化单元测试 我通过 Dagger 添加依赖注入 ObjectGraph 似乎已正确设置自身 但 内部对象 被 Flink 标记为 不可序列化 如果我
  • 在 LibGDX 中保存和检索图像文件

    如何在 LibGDX 中保存和检索图像文件 我想将图像文件保存在 AndroidApplication 类的本地存储中 并在我的 Core 项目中检索它 Libgdx 中的文件处理在libGDX 维基 https github com li
  • 使用 Sheets API v4 获取与 Google 帐户关联的所有电子表格的列表

    使用 Google Sheets API v4 我希望获取附加到我的帐户的电子表格列表 我做了很多研究 但还没有找到任何解决方案 v4 API 不提供列出电子表格的方法 您需要使用 Drive API 这从以前的 API 页面迁移 http
  • 如何在RecyclerView中实现setOnScrollListener

    当用户到达列表中可见的项目时 如何在底部显示进度栏 我已经编写了一个代码 其中我使用网络服务获取数据 现在我想填充部分记录 因为我有大约630 条记录在我的 JSON 中 这是我用来从 JSON 获取数据并填充到 RecyclerView
  • Java正则表达式以数字和固定长度开头的字符串

    我制作了一个正则表达式来检查 String 的长度 所有字符都是数字并以数字开头 例如 123 以下是我的表情 REGEX 123 d 9 但它无法检查字符串的长度 它仅验证那些长度为 9 并以 123 开头的字符串 但如果我传递字符串 1
  • 使用 Scanner 类输入

    我从过去的经历中了解到的是nextInt or nextDouble 将继续搜索 直到在同一行或下一行中找到整数或双精度数 这并不重要 同时通过扫描器类读取字符串作为输入next 考虑空格之前的那些字符串并将光标保持在同一行 其中nextL
  • 如何使用Netbeans的不确定进度条样式?

    我正在使用 Nimbus 外观和感觉编写 Java 应用程序 不幸的是 Nimbus 外观和感觉的不确定 JProgressBars 的外观是AWFUL 见下文 另一方面 我注意到 Netbeans 与 Nimbus 的外观和感觉有不同的不
  • ClassCastException:ApiVersionImpl 无法转换为 java.lang.Integer

    我有 android gradle 项目 当我尝试启动应用程序时出现以下异常 ClassCastException com android build gradle internal model ApiVersionImpl cannot
  • 从绝对路径获取名称,从最后一个斜杠获取子字符串,java android

    我想提取绝对路径的名称 如果我有一个值为 mnt sdcard Videos Videoname 的字符串 我想保存一个值为 Videoname 的字符串 字符串正在变化 我之前无法获取斜杠的数量 如何从最后一个斜杠中分割子字符串 mnt
  • AngularJS 和 Webpack 集成

    我正在寻找一些使用帮助webpack http webpack github io docs 对于大型 AngularJS 应用程序 我们使用基于功能的文件夹结构 每个功能 页面都有一个模块 并且它们有控制器 指令 我已经成功配置了 web
  • Java 应用程序中 PKIX 路径构建失败

    将应用程序从 Windows 2000 迁移到 Windows 2008 R2 Server 后 我花了将近一周的时间才让我的应用程序正常运行 步骤 安装Java JDK 1 7 0 25 设置系统环境变量JAVA HOME to C Pr
  • 使用外部属性文件执行 jar

    我有一个带有主类的 jar 可以像这样执行 java jar test jar 罐子里有类似的东西 public static void main String args throws IOException InputStream is
  • TextField“更改”事件仅在模糊时触发

    通常 Change 事件将在 TextField 失去焦点 模糊 后触发 但我需要它在字段值发生变化时立即触发 而不需要失去对该字段的关注 KeyListener 不会删除它 因为该值可能来自条形码扫描仪等 有什么办法可以做到这一点吗 提前
  • 带有 CompletableFuture 的 MDC 记录器

    我正在使用 MDC Logger 除了一种情况外 它对我来说非常适合 无论我们在代码中的何处使用 CompletableFuture 对于创建的线程 MDC 数据都不会传递到下一个线程 因此日志会失败 例如 在代码中我使用下面的代码片段来创
  • “[B”是什么样的 Java 类型?

    我正在尝试通过 Java 代码 Hibernate 从 MySQL DB 获取 MD5 加密密码 但我既得不到 Strong 也得不到任何合理的 Java 类型 我唯一收到的是这条无用的消息 java lang ClassCastExcep
  • java.library.path 中没有字体管理器

    以下代码在我的桌面上运行得很好 BufferedImage image new BufferedImage width height BufferedImage TYPE INT RGB Graphics g image getGraphi

随机推荐

  • 根据String生成唯一的Hash码

    我有以下两个字符串 var string1 MHH2016 05 20MASTECH HOLDINGS INC Financialshttp finance yahoo com q is s mhhEDGAR Online Financia
  • 将数据框折叠成单行并基于 R 行创建新列

    我有一个包含对象名称和该对象的统计矩列表的数据框 如下所示 Object Mean IQR Skew x 1 1 1 y 2 2 2 z 3 3 3 我想要的是为每一行创建带有统计矩和对象名称前缀的列 就像这样 xMean xIQR xSk
  • 如何编写递归打印程序

    Gurus 我想知道如何编写一个打印的递归函数 1 12 123 1234 例如 display 4 应该打印 1 12 123 1234 Code include
  • Redux router - 刷新后如何重放状态?

    我有一个多步骤表单应用程序 我正在努力思考如何保存我的 redux 状态并在刷新后重播它 在应用程序中后退 前进按预期工作 但浏览器刷新后 我之前的状态为空 理想情况下 我希望能够将先前的状态保存在与路径相关的会话存储中 以便稍后重播 但我
  • 在 HTML 画布中创建链接

    是否可以从 canvas 元素中呈现的文本创建 html 链接 没有简单的方法 您必须将链接文本绘制到画布上 然后检查鼠标单击情况 这是一个演示 html 页面
  • 与泛型的多重绑定

    我正在尝试创建一个Multibinder
  • ASP Classic 应用程序中的多部分/表单数据和 UTF-8

    我有一个问题我真的不明白 我正在尝试在 ASP 经典应用程序中上传文件 而不使用外部组件 我还想发布一些将存储在数据库中的文本 文件上传完美 我正在使用以下代码 问题是其他表单输入字段 我使用的是 UTF 8 但它们最终并不是 UTF 8
  • 后期绑定onclick事件

    以下是我的 javascript 的一部分 使用 jquery list a b c for var i 0 i lt list length i a click here a click function foo list i appen
  • Java中如何实现“按引用调用”?

    Java中如何实现 按引用调用 假设我们使用该术语的方式与自 1960 年代以来同行评审的计算机科学文献中使用该术语的方式相同 请参阅这个维基百科页面 https en wikipedia org wiki Evaluation strat
  • 在 MFC 应用程序中显示文本

    我需要在 MFC 应用程序中显示文本 我有一个示例文本 例如 在 mfc 应用程序中显示文本 假设我打算在其中绘制此文本的客户端窗口非常小 水平 以至于在一行中唯一可以容纳的文本是 显示文本 不显示 mfc 应用程序 字样 我的问题是 如何
  • pjsip 2.5.5 构建错误

    我正在尝试为 android 构建 pjsipNDK r13b 标准构建就像 configure android with opus home user pjsip pjproject opus dev lib工作完美 但我需要几个TARG
  • 如何使用另一个数组的长度来初始化 Rust 中的数组?

    我想初始化一个数组 其长度等于另一个数组的长度 fn foo array i32 let mut sum 0 array len 它会出错 error E0080 constant evaluation error gt test rs 2
  • Pyspark:在数据帧的不同组上应用 kmeans

    使用 Pyspark 我想将 kmeans 单独应用于数据帧组 而不是立即应用于整个数据帧 目前 我使用 for 循环对每个组进行迭代 应用 kmeans 并将结果附加到另一个表 但是有很多组会很耗时 有人可以帮我吗 多谢 for cust
  • 如何使图像在图像墙内反弹?

    我面临这个问题 在动画过程中 我希望鱼图像在背景图像 池塘 中移动 并且每当它撞到墙壁或图像边界时它就会弹开 使用svg方法和javascript方法 非常感谢任何可以提供帮助的人 再次感谢您花时间阅读并帮助解决这个问题
  • 如何将临时 MySQL 表转储到文件中?

    有没有一种方法可以创建转储 导出 保存临时 MySQL 表到磁盘上的文件中 sql 文件 类似于 mysqldump 创建的文件 抱歉 我第一次没有正确阅读这个问题 无论如何 我能想到的最好的方法就是使用SELECT INTO OUTFIL
  • mongodb 从一个值获取整个文档

    我想从单个值获取 mongodb 文档的所有值 例子 id id name name description description invite invite support server server developer develop
  • 同一行有多个命令

    我一直在尝试找到一些可以让我在 Vim 中的同一行上运行多个命令的东西 类似于在 nix 系统中使用分号来分隔命令或 在Windows中 有没有办法做到这一点 A bar 将允许你这样做 从 help bar 可用于分隔命令 因此您可以在一
  • IoC 容器的使用;特别是温莎

    我认为这个问题的答案是如此明显 以至于没有人费心写这个 但已经晚了 我真的无法理解这个问题 我一直在阅读 IoC 容器 在本例中为 Windsor 但我不知道如何从代码的各个部分与容器进行通信 我得到了 DI 我已经做了穷人 DI 空构造函
  • 在 scala 中将其别名为 self =>

    一些 Scala API 别名this to self 例如 trait Function1 T1 R extends AnyRef self gt 我知道该怎样this别名通常有效 但没有看到像 Function1 这样的特征如何从中受益
  • 清理大型遗留 Java 项目

    我被指派去做一个大型Java项目的一些工作 开发人员的几次迭代的影响是显而易见的 没有标准的编码风格 格式 命名约定或类结构 当我遇到 Javadoc 类时真是美好的一天 单元测试是一个快乐的白日梦 到目前为止 我们参与该项目的人员一直在