问题标签 [type-safety]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1587 浏览

c++ - 什么是 C++ 中可变参数函数的良好类型安全替代方案?

结合这个问题。我无法为以下看似基本的问题提出一个好的类型安全解决方案。我有一个音乐播放列表类,其中包含应该播放的歌曲列表。看起来很简单,只需制作队列中所有歌曲的 std::list ,并将其提供给用户即可。然而,音频解码和音频渲染在不同的线程上发生是不必要的。所以列表需要互斥保护。使用我的库的其他程序员经常忘记互斥锁。这显然导致了“奇怪”的问题。

所以一开始我只是为这个类写了setter。

这导致了如下的用户代码......

虽然这有效并且非常明确。打字非常繁琐,而且由于实际工作中的所有杂乱无章,它很容易出错。为了证明这一点,我实际上故意在上面的代码中添加了一个错误,这样的东西很容易制作,并且可能会通过代码审查原封不动,而歌曲 4 从未在播放列表 2 中播放。

从那里我去研究可变参数函数。

这将导致用户代码如下...

现在更容易查看是否添加了两次歌曲或未包含歌曲。但是在解决方案 A 中,如果 NULL 不在列表的末尾,并且不是跨平台的,它将崩溃。在解决方案 B 中,您必须计算可能导致几个错误的参数数量。此外,没有一个解决方案是类型安全的,用户可以传入不相关的类型并在运行时等待崩溃。这似乎不是一个可持续的解决方案。然后我遇到了std::initializer_list。不能使用它我开发的几个编译器还不支持它。所以我试着模仿它。我在下面得到了这个解决方案。

这种“,”运算符的使用是否被认为是错误的形式?

这将导致用户代码看起来像这样......

这种语法不会让我们的小测试组感到困惑。但是,我非常担心如此严重地滥用操作员超载。所以我发布了上面的问题。我想看看在我们的测试组中比较专家的程序员是怎么想的。很多程序员不喜欢它,但它似乎比上述解决方案更好,因为它会在编译时而不是在运行时捕获大多数错误。然而,汤姆发布了一个有趣的反例,这会导致意外行为。

这让我对那个解决方案感到厌烦。那么您对更好的解决方案有什么想法吗?

PS 上面的代码都没有被编译,它们只是为了示例目的。

0 投票
3 回答
643 浏览

java - Java 类型安全警告

我正在尝试制作这样的向量数组:

但是 Java 警告我“new Vector[29]”违反了类型安全。如何摆脱警告?

更新:我试过了:

当然,但这会产生错误:Cannot create a generic array of Vector

0 投票
6 回答
88246 浏览

c++ - 新关键字“auto”;什么时候应该使用它来声明变量类型?

可能重复:
C++0x 自动关键字多少是太多了

我们(作为一个社区)是否有足够的经验来确定汽车何时和/或是否被滥用?

我真正在寻找的是最佳实践指南

  • 何时使用自动
  • 什么时候应该避免

在 80% 的情况下可以快速遵循的简单经验法则。

作为上下文,这个问题是由我在这里的回答引发的

0 投票
3 回答
609 浏览

c# - 这种模式有名字吗?(具有不同类型的“参数”参数的 C# 编译时类型安全)

这种模式有名字吗?

假设您要创建一个方法,该方法采用可变数量的参数,每个参数都必须是一组固定类型中的一个(以任何顺序或组合),其中一些类型您无法控制。一种常见的方法是让您的方法采用 Object 类型的参数,并在运行时验证类型:

但是,假设您像我一样痴迷于编译时类型安全,并且希望能够在编译时验证您的方法的参数类型。这是我想出的一种方法:

隐式转换允许您将有效类型的参数直接传递给您的例程,而无需显式转换或包装它们。如果您尝试传递不可接受类型的值,则会在编译时捕获错误。

我确定其他人已经使用过这种方法,所以我想知道这种模式是否有名称。

0 投票
5 回答
1200 浏览

c# - 通过自定义结构对原始 .NET 值类型进行类型验证:值得付出努力吗?

我正在考虑通过将原始 .NET 值类型包装在 custom 中来使它们更加类型安全和更加“自我记录” struct。但是,我想知道它是否真的值得在现实世界的软件中付出努力。

(这种“努力”可以在下面看到:必须一次又一次地应用相同的代码模式。我们声明structs ,因此不能使用继承来删除代码重复;并且由于必须声明重载运算符static,因此必须定义它们分别为每种类型。)

以这个(诚然微不足道的)示例为例:

两者AreaLength基本上都是一个double,但用特定的含义对其进行扩充。如果您定义了一个方法,例如……

......不可能直接通过Area意外。到目前为止,一切都很好。

但是:您可以轻松地回避这种明显提高的类型安全性,只需将 a 强制转换Areadouble,或将 a 临时存储Areadouble变量中,然后将其传递给Length预期 a 的方法:

问题:struct这里有没有人有在现实世界/生产软件中广泛使用这种自定义类型的经验?如果是这样:

  • 在 custom 中包装原始值类型struct是否曾经直接导致更少的错误,或者更易于维护的代码,或者具有任何其他主要优势?

  • 还是 customstruct的好处太小而无法在实践中使用?


PS:我问这个问题已经过去了大约5年。我将自那时以来的一些经验作为单独的答案发布。

0 投票
8 回答
8522 浏览

javascript - 类型安全的 Javascript

有没有办法在 JavaScript 中强制执行类型?我正在考虑一个预处理器,它接受一个用 ActionScript 3 或 Java 编写的输入文件并将其转换为 JS。

我不需要大型的运行时设备,我只需要在我的工作流程中引入编译时的概念,并对我的代码进行简单的编译时检查(并使用接口)。我不需要来自 Java 或 Flex 的 API,只需要语法。

也可以对照 IDL 定义检查标准浏览器功能,但这不是必须的。

0 投票
3 回答
653 浏览

oop - 没有类型转换的语言

我的问题几乎就是标题所说的:是否有可能拥有一种不允许显式类型转换的编程语言?

为了澄清我的意思,假设我们正在使用一些类似 C# 的语言,有一个父Base类和一个子Derived类。显然,这样的代码是安全的:

由于向上继承层次结构是安全的,但是

不能保证安全,因为下去是不安全的。

但是,不管安全性如何,这种向下转换在许多语言(如 Java 或 C#)中都是有效的 - 代码将编译,如果类型不正确,它将在运行时失败。所以从技术上讲,代码仍然是安全的,但是通过运行时检查而不是编译时检查(顺便说一句,我不喜欢运行时检查)。

我个人会发现完整的编译时类型安全非常重要,至少从理论角度来看,最多从可靠代码的角度来看。编译时类型安全的一个结果是不再需要强制转换(我认为这很好,因为无论如何它们都很丑)。任何类似强制转换的行为都可以通过隐式转换运算符或构造函数来实现。

所以我想知道,目前是否有任何 OO 语言在编译时提供如此严格的类型安全,以至于强制转换已过时?即,他们不允许任何不安全的转换操作?或者有什么原因这不起作用?

感谢您的任何意见。

编辑

如果我可以举例说明,这就是我如此讨厌沮丧的主要原因。

假设我有以下内容(大致基于 C# 的集合):

现在假设有人决定编写如下代码:

请注意最后一行的演员表是如何必要的。但它有效吗?一般不会。List<T>.Filter当然,实现将返回另一个是有道理的List<T>,但这不是保证(它可以是 的任何子类型IEnumerable<T>)。即使它在某个时间点运行,以后的版本也可能会改变这一点,暴露出代码的脆弱性。

几乎所有我认为需要向下转换的情况都可以归结为像这个例子这样的东西——一个方法具有某个类或接口的返回类型,但是由于我们知道一些实现细节,我们有信心向下转换结果。但这是反 OOP 的,因为 OOP 实际上鼓励从实现细节中抽象出来。那么我们为什么要这样做,即使是纯粹的 OOP 语言呢?

0 投票
4 回答
1220 浏览

java - 泛型参数作为变量 - Java

构造函数 NotePanel(itemClass) 指的是缺少的类型 itemClass 我有一个类NotePanel<T extends AbstractNoteItem> extends JPanel,以及一个单独的类中的方法,该方法返回一个NotePanel应该在方法期间创建的:

返回 new 的行上有一个错误NotePanel:“构造函数 NotePanel(itemClass) 引用了缺少的类型 itemClass。” 有人可以告诉我如何进行这项工作吗?

如果这还不够代码,我很乐意提供更多。我所有的进口都井井有条(谢谢,组织进口!)。我没有看到任何明显的问题,但我也是使用泛型的新手。

提前致谢!

0 投票
3 回答
687 浏览

c# - 用类型安全的泛型方法替换非类型安全的方法

我正在寻找一种方法来替换以下内容:

使用类型安全的东西。目的是有一个对象,我可以在其中添加许多不同类型的对象。目前,在检索对象时必须进行检查以确定它们是否属于正确的类型/是否以正确的顺序。

目前我有以下内容:

依此类推,将新类添加到我合理预期的最大数量参数。有没有更好的方法来实现这一目标?

0 投票
2 回答
5195 浏览

java - How parametrize generic singleton in java

I have next problem. I have an interface:

and singleton implementation of this interface:

My question is, can I get the singleton instance by this way:

is still type-safe? when not, how can I use generic in singleton instance to by type-safe?