如何在没有文档的情况下重构一个 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 单元? 的相关文章

  • FireMonkey iOS RAD Studio XE2 - 在从 URL 加载的表单上显示图像

    是否可以将 TImage 放置在 iOS 的 FMX 表单上 并将图像 jpg 从 URL 加载到此 TImage 中以在 iOS 应用程序中显示 我尝试过但没有成功 任何正确方向的提示或指出都会受到赞赏 将 TButton TImageC
  • 使用 Delphi 读取 Excel 电子表格

    我需要使用 Delphi 2010 读取和写入 Excel 电子表格 没什么花哨的 只需读取和写入不同工作表上特定单元格和范围的值 需要在没有安装 Excel 的情况下工作并支持 Excel 2007 我看过的一些东西 我尝试过使用ADO
  • MainFormOnTaskbar + 工具提示导致焦点窃取

    我使用 Delphi XE2 构建了下面的代码 它创建 Form1 Form1 立即创建 Form2 的实例 当我按下 Form2 上的按钮时 会创建第二个 Form2 现在 如果我将鼠标悬停在第二个 最上面的 Form2 上的按钮上 并等
  • D2010编译行数差异

    构建项目时 有两个地方会报告源代码行数 在编译进度对话框中 项目下 信息 在 Delphi 2007 中 对于我们正在构建的项目 这两个数字是相同的 在 Delphi 2010 中 这两个数字截然不同 1st 计数多出 100 万行或 40
  • 对于大型简单数据库,SQLite 和 DISQLite 有何比较?

    两者有什么区别SQLite http www sqlite org and DISQLite http www yunqa de delphi doku php products sqlite3 index为什么我要选择其中一个而不是另一个
  • 在 Delphi 中将对象转换为 OleVariant

    有没有办法在 OleVariant 中传递包装并解开 TObject 后代 我正在尝试跨自动化对象传递 TObject 我知道这不是一个好主意 但我没有更好的选择 该对象将在来自同一自动化 dll 的对象之间传递 如果这有什么区别的话 像这
  • 帮助重构这个讨厌的 Ruby if/else 语句

    所以我有这个大而多毛的 if else 语句 我将跟踪号码传递给它 然后它确定它是什么类型的跟踪号码 我怎样才能简化这件事 具体来说就是想减少代码行数 if num length lt 8 tracking service false el
  • 这种双重实例是否有害,或者根本没有必要?

    在仔细阅读遗留资源时 我发现了这一点 DataSet myUPC new DataSet myUPC dbconn getDataSet dynSQL Resharper 正确地将其中的 new Dataset 部分 灰显 并建议 删除多余
  • 新编译的应用程序需要 UAC/elevation?

    我有一个系统 我将其设置为普通的 UAC 并在我的 delphi 环境中编译名为 ka exe 的项目 并为其创建一个 installshield 项目 设置完毕 一切顺利 但每当我开始我的程序时 它都需要提升 而我不知道为什么 为了确保
  • 如何检查文件是否有备用数据流?

    Delphi 有没有办法检查文件是否有任何备用数据流 看一下 Win32 APIFindFirstStreamW https msdn microsoft com en us library windows desktop aa364424
  • 在 ADO 查询 (mysql/MyConnector) 中使用参数

    今天我下载并安装了 MyConnector 这样我就可以通过 ADO 使用 Mysql 一切都安装好了 我可以与 ODBC 连接并从我的 delphi 环境进行连接 当我在运行时构建查询时 我收到一条错误消息 项目 Project1 exe
  • Vista 中的文本转语音

    我通过在 2000 NT XP 中使用 Delphi 创建 OLE 对象来做到这一点 如下所示 Voice CreateOLEObject SAPI SpVoice Voice speak 但这在 Vista 中不起作用 我怎样才能让我的程
  • 什么是代码页 0?

    我正在使用Delphi函数 StringCodePage 我在 COM 函数 Acrobat Annotation getContents 请参阅我的其他帖子 返回的字符串上调用它 它返回 0 0是什么 安西 代码页 0 是 CP ACP
  • Delphi:如何计算大文件的 SHA 哈希值

    您好 我需要生成 5 Gig 文件的 SHA 您知道有一个非基于字符串的 Delphi 库可以做到这一点吗 你应该使用DCPcrypt v2 http www cityinthesky co uk cryptography html读取缓冲
  • 在 tlistbox 中绘制缩略图

    在 DelphiXE 中 我使用 tFileOpenDialog 选择一个文件夹 然后在 tListBox 中列出该文件夹中的所有 jpg 文件 我允许将列表项拖放到列表中进行自定义排序 以便稍后按顺序显示它们 我希望能够在文件名旁边绘制图
  • 构建机器是否需要单独的 Delphi XE4 许可证?

    用于通过以下方式构建应用程序dcc32在构建服务器上我可以使用 Delphi Trial 这种方法的许可证没有任何问题 现在 我将通过以下方式在 TeamCity 上构建 Delphi XE4 应用程序msbuild 我是否需要拥有构建机器
  • 使用 IOmniTaskControl/TOmniWorker 时等待 Invoke 完成

    我使用 TOmniWorker 创建了 IOmniTaskControl 以便我可以定期在特定线程上运行代码块 因此 我将根据需要在此 IOmniTaskControl 上调用 Invoke 当我这样做时 有时需要等待与该工作相关的执行完成
  • 扩展为输入标签助手的部分

    这本书专业版 ASP NET Core 3有下面的代码 https github com Apress pro asp net core 3 blob master 27 20 20Using 20the 20Forms 20Tag 20H
  • SSL 错误 1409442E 使用 TIdHTTP 通过 HTTPS 下载文件 [重复]

    这个问题在这里已经有答案了 我正在使用德尔福10 3 3 下面的代码曾经有效 但现在尝试通过 HTTPS 下载文件时遇到错误 连接 SSL 错误错误 1409442E SSL 例程 SSL3 READ BYTES tlsv1 警报协议版本
  • 有没有其他方法可以在delphi上观看youtube视频?

    我看到http www delphiflash com demo youtube video http www delphiflash com demo youtube video关于如何在 delphi 上加载 flash 视频 但它不是

随机推荐

  • 在 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 行代码 没有文档 大量的复制和粘贴代码 有很多用复制和粘贴制作的方法可以重构 无论如何 我迷失在所有这些行中 我有界面部分 我可以在其中 找到我的路 但总的来说 你建议如何处理此类任