静态/强类型和重构

2024-05-17

在我看来,静态/强类型编程语言最宝贵的一点是它有助于重构:如果/当你更改任何 API 时,编译器会告诉你该更改破坏了哪些内容。

我可以想象用运行时/弱类型语言编写代码……但我无法想象没有编译器帮助的重构,我无法想象在没有重构的情况下编写数万行代码。

这是真的?


我认为您将检查类型的时间与检查类型的方式混为一谈。运行时类型不一定很弱。

静态类型的主要优点正如你所说:它们是详尽的。只需让编译器执行该操作,您就可以确信所有调用站点都符合该类型。

静态类型的主要限制是它们可以表达的约束受到限制。这因语言而异,大多数语言具有相对简单的类型系统(c、java),而其他语言则具有极其强大的类型系统(haskell、cayenne)。

由于这种限制,类型本身是不够的。例如,在 java 中,类型或多或少仅限于检查类型名称匹配。这意味着您想要检查的任何约束的含义都必须编码到某种命名方案中,因此 Java 代码中存在大量的间接和样板。 C++ 稍微好一点,因为模板允许更多的表达能力,但与依赖类型可以做的事情还有些差距。我不确定更强大的类型系统的缺点是什么,但显然肯定有一些或更多的人会在工业中使用它们。

即使您使用静态类型,很可能它的表现力不足以检查您关心的所有内容,因此您也需要编写测试。静态类型是否比样板文件中所需的工作量更省力,这个争论已经持续了很长时间,而且我认为没有一个适用于所有情况的简单答案。

至于你的第二个问题:

我们如何在运行时类型语言中安全地重构?

答案是测试。您的测试必须涵盖所有重要的情况。工具可以帮助您衡量测试的详尽程度。覆盖率检查工具可让您了解测试是否覆盖了代码行。测试变异工具(jester、heckle)可以让您知道您的测试在逻辑上是否不完整。验收测试让您知道您编写的内容是否符合要求,最后回归和性能测试可确保产品的每个新版本都保持上一个版本的质量。

与依赖复杂的类型间接寻址相比,进行适当的测试的好处之一是调试变得更加简单。运行测试时,您会在测试中得到特定的失败断言,这些断言清楚地表达了它们正在做什么,而不是迟钝的编译器错误语句(想想 C++ 模板错误)。

无论您使用什么工具:编写您有信心的代码都需要付出努力。它很可能需要编写大量测试。如果错误的惩罚是very高,例如航空航天或医疗控制软件,您可能需要使用形式数学方法来证明您的软件的行为,这使得此类开发极其昂贵。

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

静态/强类型和重构 的相关文章

  • Eclipse:“重构 - 重命名”完全混乱,替换文件中的任意字符

    在重构类名时 Eclipse 最近表现出非常奇怪的行为 例如 让我们看一下我们的一个课程 public class CampaignCSVPanel extends ContentPanel private FileUploadField
  • 什么是健全的编程语言?

    根据达特的网站 https www dartlang org guides language sound dart Dart 是一种声音语言 上面这句话中的 声音 是什么意思 我在其他主要编程语言中找不到任何类似的概念 谁能举出一些其他例子
  • NetBeans 重构类:java.lang.NoClassDefFoundError

    我刚刚在使用 NetBeans 时遇到了一个错误 我想发布我的发现 可能这是旧新闻 也许这会让一些人免去调试我刚刚遇到的类似问题的麻烦 我不认为我在这里滥用任何东西 堆栈溢出的 SEO 非常好 我在 NetBeans JavaFX 项目 中
  • 从需求文件中删除未使用的包

    有没有什么简单的方法可以删除不再使用的包要求 file 我为此任务编写了一个 bash 脚本 但是它没有按我的预期工作 因为 某些包未按照其 PyPI 项目名称使用 例如 dj database url 包用作 dj database ur
  • 解释重构[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 Question 我的问题是如何教授整理和重构代码的方法和重要性 背景 我最近正在为一位同事进行代码审查 他们对早已消失的同事工作做了一些
  • 我可以在 MSBuild 文件中执行循环吗?

    目前 我让他遵循以下代码MSBuild项目文件 这真的很简单 定义4变量并为每个变量调用一次我的 MSBuild 任务 求代码
  • 在 Vim 中重构 C/C++(例如像在 Eclipse 中那样提取方法)

    Vim 中是否有任何插件或内置方法可以对 C 或 C 代码进行重构 类似于 Eclipse 中的重构工具 我特别热衷于 Eclipse 中的提取方法重构工具 它将确定新方法的参数 并且通常还会猜测用作返回值的变量 不 虽然 Vim 是一个很
  • 在 WinForms 中保留对控件的全局引用以访问 GUI 线程

    这个问题有一点历史 请耐心听我说 In this https stackoverflow com questions 192980 boiler plate code replacement is there anything bad ab
  • Common Lisp 类型声明未按预期工作

    当我在 Common Lisp 中定义一个函数时 如下所示 defun foo n declare type fixnum n n 42 我期待一个像这样的电话 foo a 立即失败 但在调用时失败 是个declareform 不保证静态类
  • 在 IntelliJ 中重新排序 Java 类方法的简单方法?

    在 IntelliJ 中 是否有比手动剪切和粘贴代码更简单的方法来重新排序类源文件中的方法 现在我在重构遗留代码时经常需要这个 例如将源代码中的相关方法移至彼此靠近的位置 在 Eclipse AFAIK 中 有一个类似于 IntelliJ
  • 在哪里可以找到有关重构的资源? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 重构是改进现有系统设计而不改变其行为的过程 除了马丁 福勒的开创性著作 重构 改进现有代码的设计 ht
  • 你如何处理冗余代码?

    我有一个类 它是代码库项目的一部分 该项目是为不再需要的特定目的而编写的 所以问题是你如何处理这样的代码 您是否简单地删除它 或者您是否记住它 未来的开发人员可能会遇到它 但没有意识到他们可以忽略它 或者您是否有某种存档系统 是否存在公认的
  • 使用 vim 重构目录中的类/方法/字符串的有效方法

    到目前为止 我一直在使用查找和替换操作手动重构代码 s stringiwanttoreplace newstring g in vim 但这是一个缓慢而费力的过程 如果我有的话字符串我想更换在特定目录内的许多文件中 我当前 典型的缓慢而费力
  • TFrame继承重构

    我提出的另一个 TFrame IDE 注册组件问题 感谢各位程序员的帮助 尝试 Darrian 的 TFrame 继承建议here https stackoverflow com questions 382562 delphi visual
  • 对于 Scala,“无全局类型推断”是什么意思?

    我读过 Scala 的类型推断不是全局的 因此人们必须在方法上放置类型注释 这会是 本地 类型推断吗 我只知道一点点 原因是它面向对象的本质 但我不清楚 是否有 全局类型推断 的解释以及为什么 Scala 不能让初学者可以理解 The pr
  • Powershell强类型环境变量

    我想设置一个强类型环境变量 当我使用 env 时它似乎 丢失 了它的类型 在原始函数中它工作正常 function Create ThisCrap Microsoft ApplicationInsights TelemetryClient
  • 扩展为输入标签助手的部分

    这本书专业版 ASP NET Core 3有下面的代码 https github com Apress pro asp net core 3 blob master 27 20 20Using 20the 20Forms 20Tag 20H
  • 淹没在空无的海洋中

    我继承的一个应用程序跟踪对材料样品执行的实验室测试结果 数据存储在单个表 tblSampleData 中 其主键为 SampleID 并有 235 列代表潜在的测试结果 问题是每个样本仅执行少量测试 因此每行包含超过 200 个空值 实际上
  • 检测重复代码的工具(Java)[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我在一个项目中 以前的程序员一直在到处复制粘贴代码 这些代码实际上是相同的 或非常相似 并且可以将它们重构为一个 我花了无数的时间手动重构
  • @VisibleForTesting 的替代方案

    我知道 VisibleForTesting 是不可取的 因为它只是为了测试目的而更改类的接口 理想情况下 我们应该测试我们实际使用的接口 但什么是一个好的替代方案呢 You use VisibleForTesting正如您所说 当您想要测试

随机推荐

  • RStudio 如何确定控制台宽度,为什么它似乎总是出错?

    我刚刚发现wid lt options width在 RStudio 中 它似乎是我日常控制台使用中令人烦恼的根源 或者更确切地说 更接近根源 我应该先说一下 我目前使用的是 R 3 2 2 RStudio 0 99 491 Linux M
  • useParams 钩子在 React 功能组件中返回未定义

    该应用程序显示所有照片
  • ProxyPassMatch 与 ProxyPassReverse

    各位 我们正在尝试为以下场景设置 Apache 反向代理 传入请求采用以下形式http foo com APP v1 main html 对于某些服务器 URL 将引用不同的版本 例如 http foo com APP v2 main ht
  • 我可以将 MAMP (MySQL) 或 XAMPP (MySQL) 与 Ruby on Rails 3 一起使用吗?

    我可以将 MAMP MySQL 或 XAMPP MySQL 与 Ruby on Rails 3 一起使用吗 我从 MYSQL com 安装了 MySQL 但遇到了很多麻烦 所以我喜欢使用 MAMP XAMPP Mysql 有人这样做吗 另外
  • 覆盖内网兼容模式IE8

    默认情况下 IE8 强制 Intranet 网站进入兼容模式 我尝试将元标头更改为 IE8 但它不承认元标头 仅使用浏览器设置 有谁知道如何禁用此功能 可以覆盖内网中的兼容模式 对于 IIS 只需将以下代码添加到 web config 中
  • 无法从 Sourcetree 拉取 Git 远程存储库

    我生成了 ssh 密钥并配置了我的 git 和 SourceTree 我可以 git pull 并从 Git bash 执行其他操作 注意 我在 bashrc 中添加了以下内容以使其正常工作 eval ssh agent ssh add 然
  • Phantom-node模块无法加载外部资源

    我正在开发一个nodejs服务器 它将发布的html呈现为pdf png或jpg https github com svenhornberg pagetox https github com svenhornberg pagetox ser
  • 如何绘制堆积比例图?

    我有一个数据框 x lt data frame id letters 1 3 val0 1 3 val1 4 6 val2 7 9 id val0 val1 val2 1 a 1 4 7 2 b 2 5 8 3 c 3 6 9 我想绘制一个
  • mozilla pdf.js 没有全视图

    我喜欢这个 pdf 查看器https github com mozilla pdf js https github com mozilla pdf js Demo http mozilla github com pdf js web vie
  • 在 Bootstrap 中使单击的选项卡处于活动状态

    我正在使用 Django 并将 Bootstrap 与 Django 集成 这是我的导航栏 HTML 代码 div class navbar navbar default navbar fixed top div class contain
  • Android:无法发送http post

    我一直在绞尽脑汁试图弄清楚如何在 Android 中发送 post 方法 这就是我的代码的样子 public class HomeActivity extends Activity implements OnClickListener pr
  • 什么是大O表示法?你用它吗? [复制]

    这个问题在这里已经有答案了 什么是大O表示法 你用它吗 我想我错过了这门大学课程 D 有人使用过它并给出一些现实生活中使用它的例子吗 也可以看看 八岁孩子的大O https stackoverflow com questions 10716
  • gdb查找行号的内存地址

    假设我已将 gdb 附加到一个进程 并且在其内存布局中有一个文件和行号 我想要其内存地址 如何获取文件x中第n行的内存地址 这是在 Linux x86 上 gdb info line test c 56 Line 56 of test c
  • 如何检测 C# 中该字典键是否存在?

    我正在使用 Exchange Web 服务托管 API 和联系人数据 我有以下代码 即功能性的 但并不理想 foreach Contact c in contactList string openItemUrl https service
  • 使用按钮作为列表的渲染器

    我想使用一个更复杂的渲染器 其中包含列表的多个组件 更准确地说 类似于this https stackoverflow com questions 10840498 java swing 1 6 textinput like firefox
  • JavaScript:测试与执行

    我想知道检查字符串 例如邮件 密码等 的最佳方法是什么 i exec a vs i test a exec返回值 test true test 1 way var mail req body mail if check mail exec
  • 为什么 PHP 中不允许“传统”类型提示?

    刚刚发现类型提示 http php net manual en language oop5 typehinting phpPHP 中允许 但不适用于整数 字符串 布尔值或浮点数 为什么 PHP 不允许对整数 字符串等类型进行类型提示 从 P
  • 从节点服务器访问 Google Calendar API

    由于某种原因 我很难访问 Google 日历 我希望能够在 Node js 服务器的日历中添加和删除事件 我从文件中发现了非常矛盾的信息 我跟着 https developers google com identity protocols
  • mysqli bind_param 中的 NULL 是什么类型?

    我正在尝试将参数绑定到 INSERT INTO MySQLi 准备好的语句 如果该变量存在 否则插入 null 然后我知道 type variable i corresponding variable has type integer d
  • 静态/强类型和重构

    在我看来 静态 强类型编程语言最宝贵的一点是它有助于重构 如果 当你更改任何 API 时 编译器会告诉你该更改破坏了哪些内容 我可以想象用运行时 弱类型语言编写代码 但我无法想象没有编译器帮助的重构 我无法想象在没有重构的情况下编写数万行代