如何在没有文档的情况下重构一个 10000 行的 Delphi 单元?

2024-04-25

我被分配了重构 Delphi 单元的任务。哇。 10000 行代码,没有文档,大量的复制和粘贴代码。

有很多用复制和粘贴制作的方法可以重构,无论如何,我迷失在所有这些行中,我有界面部分,我可以在其中“找到我的路”,但总的来说,你建议如何处理此类任务?

Thanks.


  1. 为自己获取一份副本有效地处理遗留代码作者:迈克尔·费瑟斯。它具有各种安全重构代码以使其在测试框架下运行的技术。示例大多是 Java 和 C++ 语言,但应该很容易理解。
  2. 安装第三方重构工具(或多个),例如 CodeRush for Delphi(遗憾的是不再开发)、Castalia 或 ModelMaker Code Explorer。 Delphi 内置了一些重构支持,但根据我的经验,它太有限了,并且往往会在非常大的代码库上窒息。
  3. 买一本《Simian》。它不直接支持 Object Pascal,但其纯文本解析器工作得足够好。如果有足够多的人请求支持 Object Pascal,我相信他们会添加它。我还没有发现任何其他代码重复检测工具像 Simian 一样强大。

我还建议添加书签http://www.refactoring.com/catalog/ http://www.refactoring.com/catalog/ and http://www.indusciallogic.com/xp/refactoring/catalog.html http://www.industriallogic.com/xp/refactoring/catalog.html.

获得一份副本也不会有什么坏处干净的代码:敏捷软件工艺手册作者:罗伯特·“鲍勃叔叔”·马丁等人识别坏代码很容易。知道你何时编写出好的代码要困难得多。

警告:专注于重构您需要处理的代码。很容易从兔子洞开始,最终花费数月时间重构与手头任务不直接相关的代码。

并为自己省去一些麻烦。不要尝试同时“修复”代码并重构它。重构first,然后修复错误或添加新功能。记住,重构是在不改变外部行为的情况下进行修改.

抵制尝试完全重写的冲动。我经历了惨痛的教训才知道,满足用户需求的蹩脚代码比不满足用户需求的干净代码更可取。蹩脚的代码总是可以逐步改进,直到成为值得骄傲的东西。

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

如何在没有文档的情况下重构一个 10000 行的 Delphi 单元? 的相关文章

  • Delphi 远程调试器冻结

    我有运行 Delphi 2007 应用程序的 Windows Server 2008 R2 计算机 Update 当前无法切换 Delphi 版本 我有 Delphi XE 但在进行任何切换之前需要检查超过 300 000 行代码 我遇到了
  • Delphi预定义环境变量

    谁能告诉我在哪里可以找到 RAD Studio 中可用的 伪 环境变量列表 例如 Platform Config 等 具体来说 我想要一个能够为我提供 RTL 版本的版本 以便我可以将编译单元 dcu 放入正确的目录中 即 XE为D15 X
  • 有没有办法获取正在运行或新打开的资源管理器窗口的 IExplorerBrowser 接口以供后续 BrowseToXXX 调用?

    这么问是因为在上一个问题 https stackoverflow com questions 6220899 answer 6221898我是指向 IExplorerBrowser 的指针 但是它创建了一个子窗口 而我想模拟资源管理器的 查
  • Delphi:平滑折叠/展开形式

    需要你的帮助 我一直在寻找 我在德尔福西雅图 试图平滑调整表单底部的大小 就我而言 调整大小 只是有点折叠 展开 如下所示 我怎样才能意识到这一点 我尝试过使用 TTimer procedure TForm1 Timer1Timer Sen
  • 是否可以确定 dbEdit 中的文本是否比可见文本长?

    在某些表单上 我的 dbEdits 有时不够宽 无法显示其字段可能包含的所有文本 对于他们我有以下代码 procedure Tgm12edLots dbeLotNameMouseEnter Sender TObject begin with
  • 如何在 Delphi 中更改 TabControl 中活动 TAB 的颜色

    如何更改 TabControl 在 FireMonkey 上 中活动 TAB 的颜色 如下所示 有两种方法可以实现这一点 1 第一个选项是您可以创建定制风格 for 选项卡控件 from T样本 风格设计师 然后您可以添加您想要在自定义设计
  • 构建多线程 TCP/IP 服务器

    我想构建一个可供最多 100 个并发客户端使用的 TCP IP 服务器 但仍不确定如何开始 至少我需要服务器 监听客户端 并将它们全部存储在数组或列表中 对于每个客户端 它需要根据其客户端状态接收和发送数据 当有人连接或断开连接时 服务器应
  • 将 TPopupMenu 与窗体的右侧对齐?

    TPopupMenu 如何与窗体的右侧对齐 问题是 在调用之前似乎没有办法获取弹出菜单的宽度Popup X Y Integer 我正在尝试获得与 Chrome 中的系统菜单类似的行为 你也可以只设置Alignment http docwik
  • 开发 Delphi Windows 7 应用程序的规则 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 在哪里可以找到开发适用于 Windows 7 的 Delphi 应用程序时应遵循的最佳规则集 Marco 最近发表了 2 篇关于此主题的帖
  • Delphi 窗体在显示时总是会触发 OnResize 吗?

    如果我创建一个新的 Delphi 表单 挂钩其 OnResize 事件并运行该应用程序 则在显示窗口之前会触发 OnResize 我不知道对于任何窗口来说 这种情况是否总是会发生 对于熟悉 Windows API 的人来说 我已将其追溯到
  • ASP.NET MVC 中的魔术字符串

    我有桌面软件开发背景 并且正在开始学习 ASP NET MVC 在我的默认 HomeController 中 我有 Index 操作 其代码如下所示 if Request IsAuthenticated return RedirectToA
  • 桌面 Delphi 应用程序是否可以通过 Windows 8 认证(使用 Windows 应用程序认证套件)?

    显然 Delphi 任何版本 不支持安全异常处理程序 https forums embarcadero com thread jspa messageID 473469 Visual Studio 中的 SAFESEH 开关 在 Windo
  • 可以在delphi数据集中创建一个假数据字段吗?

    我想在 DataSet 不是 ClientDataSet 中创建一个 假 数据字段 该字段不应存储在数据库中 它不是计算字段 应允许用户输入输入数据 该字段具有业务逻辑含义 因此用户更新其值后应该更新其他字段 使用 OnFieldChang
  • 启动时系统托盘图标不出现

    我在 FormCreate 事件处理程序中使用以下代码来创建系统托盘图标 当我运行程序时 系统托盘图标显示正常 我将应用程序设置为在 Windows 启动时自动启动 当我重新启动计算机时 我的应用程序进程已启动 但系统托盘图标从未出现 我认
  • TControlState.csDesignerHide 与 TControlStyle.csNoDesignVisible

    VCL 似乎提供了两种向表单设计者隐藏控件的机制 TControlState csDesignerHide and TControlStyle csNoDesignVisible 就 IDE 而言 它们之间有什么区别 什么时候应该使用哪个
  • 调用泛型类型的方法?

    为什么下面的代码在 Delphi XE 中会产生错误 unit UTest interface type TTest class public procedure Foo
  • 能否从 Vista Shell 获取 48x48 或 64x64 图标?

    如果 Vista Shell 中存在 48x48 或 64x64 图标 如何使用 SHGetFileInfo 获取在 TImage 中显示图标的句柄 我想从图像列表中选择一个代表文件夹路径的图标 并在 Timage 中显示 48x48 或
  • 使用 StretchDIBits 使用 Delphi 6 处理条形码图像 - 输出中缺少条形线

    我的应用程序是在 Delphi 6 中开发的 由于后台处理和大量数据 它消耗大约 60MB 120MB 物理内存 这是一个资源密集型应用程序 该应用程序的功能之一是在进行某些处理后创建条形码图像 如果用户继续生成条形码 那么至少十分之一的条
  • 获取字符、整数和日期字段的字段 oldValue 和 newValue

    我试图只保留表更改的历史记录 所以我想获取一个字段在更改为oldValue之前的值 然后获取它更改为newValue的值 两个值都应转换为字符串 因此 这是该表的一个示例 PartNumber Description 12345 Test
  • Delphi - 相当于C#的三元运算符? [复制]

    这个问题在这里已经有答案了 可能的重复 Delphi 中是否存在或者将来是否存在条件运算符 https stackoverflow com questions 2108609 is there or is there ever going

随机推荐

  • 在 React 中使用 document.execCommand 将文本从 div 复制到剪贴板

    我正在尝试从divURL被缩短后 我已经放置了一个ref值在div这将呈现缩短的 URL 但是 我收到错误 类型错误 inputArea input select 不是函数 我不知道如何引用 div 中的文本 import useCallb
  • 使用 onclick 从输入中获取值

    如何使用 vanilla javascript 获取点击时输入的值 function getvalue console log this val
  • ModuleNotFoundError:Python 3.6 中没有名为“openpyxl”的模块

    我已经通过pip安装了openpyxl openpyxl 包位于以下路径中 AppData Local Programs Python Python36 32 Lib site packages 我正在使用pycharm 在我的代码中 如果
  • Rails 4.0 与 Devise。嵌套属性 不允许的参数

    我正在使用 Devise 和 Rails 4 开发一个网络应用程序 我有一个User我用 2 个额外的表单字段扩展了该模型 这样当用户注册时 他还可以提交他的名字 姓氏 基于http blog 12spokes com web design
  • Python二维数组-更改元素[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我有这个 7x7 二维数组 l 1 1 1 1 1 1 1 1 0 2 0 0 0 1 1 0 0 0 0 0 1 1 0 0 0
  • 类型衰减——它是什么以及为什么会出现?

    我很惊讶类型衰减在 SO 或其他地方没有得到很好的解释 也许我没有使用正确的术语进行搜索 或者也许我没有正确理解整个事情 我的问题是 它是什么 它是如何 为什么 到达那里的 它的规则是什么 如果你想知道我为什么问 下面是我的哭泣型腐烂故事
  • Kinect 启用流时出错

    这是我第一次尝试制作一个使用 Kinect 的程序 我不知道为什么我总是得到一个null错误 也许更了解 KinectSDK 的人可以提供帮助 public ProjKinect InitializeComponent updateSens
  • 使用 GCC 为 Linux 设备驱动程序编译 Intel AVX 内联

    我在 corei7 上的 ubuntu 上运行 gcc 版本 4 8 2 从谷歌搜索中找到了有关 AVX 内在函数的信息 但我不确定这组内在函数是否可以用于 Linux 设备驱动程序并进行编译 如果可以的话 这里的任何人都可以告诉我 mak
  • 将列添加到 CSV Windows PowerShell

    我有一个相当标准的 csv 文件 其中包含标题 我想添加一个新列并将所有行设置为相同的数据 原来的 column1 column2 1 b 2 c 3 5 After column1 column2 column3 1 b setvalue
  • 如何在vim中每隔几行添加一行

    我想使用 vim 编辑器在文件 大约 1000 行 中每 3 行添加一行 有人可以帮我吗 谢谢 艾丽莎 有一个 vim 特定的正则表达式可以做到这一点 s n n n 0 r g s 是 vim ex 命令来替换整个文件 n 是包含行尾的一
  • 使用 AWS CodeDeploy 的环境变量

    我有一个 Web 应用程序 它利用环境变量进行某些配置 数据库凭据 API 密钥等 我目前正在使用 Elastic Beanstalk 进行部署 并且可以在 AWS 中轻松设置这些 这很棒 因为我的代码库中没有这些敏感数据 不过 我正在考虑
  • 指南针手表编译一次,无法注意到进一步的变化

    我在 Windows 7 上使用 SASS Compass 我最近将 SASS 从 3 2 10 升级到 3 4 2 将 Compass 从 0 12 2 升级到 1 0 1 我通过卸载旧版本并在命令提示符中使用 gem uninstall
  • 使用状态模式设计在Java中实现通信协议

    如果在其他地方回答了这个问题 我们深表歉意 找不到足够的信息来说服自己最好的方法来做到这一点 我还意识到这是一个冗长的解释 没有代码 但是让我知道我是否应该编写一些示例代码来帮助演示我正在做的事情 基本上 使用 System in out
  • 在 Windows 上忽略 Git 存储库中的目录

    如何在 Windows 上使用 msysgit 忽略 Git 中的目录或文件夹 创建一个名为 gitignore在您的项目目录中 通过在文件中输入目录名称 附加斜杠 来忽略目录 dir to ignore 更多信息是here http gi
  • 如何使 std::cin 读取空格? [复制]

    这个问题在这里已经有答案了 我知道这个问题之前已经在这个网站上被问过 但我似乎无法掌握如何让它与我的特定程序一起工作 本质上 我正在创建一种小型 MadLibs 类型的游戏 玩家必须输入某些内容才能将其融入故事中 现在 如果用户输入中没有空
  • 保存 PDF 时的 matplotlib 线宽

    我有一个具有一些对线宽敏感的相当微妙的特征的图形 我想将此图保存为可以轻松打印的 PDF 即接收器端无需缩放 只需 Command P 即可 不幸的是 当我设置 Figsize 8 5 11 以便正确调整 PDF 的打印大小时 matplo
  • 在 CodeIgniter 中上传多个文件

    在我的 CodeIgniter 项目中 我在项目创建期间上传文件 这是上传功能 function uploadFiles this gt load gt library upload error 0 projectName POST pro
  • data.table::fread 中的 dec 参数

    我在用fread from data table加载 csv 文件 但是我的 csv 文件使用dec 作为小数点分隔符 1 23将1 23 与在read csv看起来dec不是允许的参数 R args fread function inpu
  • 获取所有当前(活动)订阅

    是否可以获取所有 活动 订阅而不手动存储它们 我想unsubscribe所有 活动 订阅 并且不想在数组或变量中引用它们中的每一个 我取决于你使用的是Subject还是Observable 但可能没有办法 自动 做到这一点 观测值 我不认为
  • 如何在没有文档的情况下重构一个 10000 行的 Delphi 单元?

    我被分配了重构 Delphi 单元的任务 哇 10000 行代码 没有文档 大量的复制和粘贴代码 有很多用复制和粘贴制作的方法可以重构 无论如何 我迷失在所有这些行中 我有界面部分 我可以在其中 找到我的路 但总的来说 你建议如何处理此类任