gpt4 book ai didi

Scala - 简单的契约设计

转载 作者:行者123 更新时间:2023-12-04 13:41:01 25 4
gpt4 key购买 nike

我厌倦了 Java 的冗长,所以我将 Scala 作为个人项目来学习。我喜欢我看到的很多东西,但想知道是否有办法 高效在方法上实现一些简单的契约。我不是(必然)在完整的 DbC 之后,但有没有办法: -

  • 指示参数或类字段是必需的,即不能为空。如果存在 OPTIONAL 值,Option 的东西似乎清楚地表明了,但我想指定类不变量(需要 x),并且还要简洁地指定需要一个参数。我知道我可以做“如果”抛出某种异常,但我想要这个非常常见的用例的语言功能。我喜欢我的接口(interface)紧凑,我不喜欢防御性编程。
  • 是否可以定义简洁高效(运行时性能)的范围类型,例如“NonNegativeInt” - 我想说一个参数> = 0。或者在一个范围内。 PASCAL 有这些类型,我发现它们非常适合传达意图。这是 C、C++、Java 等的一大缺点。当我说 时简洁 我的意思是我想像普通 int 一样轻松地声明这种类型的变量,而不必在堆上新建每个实例。
  • 最佳答案

    对于第 (1) 点,Option确实应该够了。这是因为虽然 scala 支持 null 值,但它主要是为了与 Java 兼容。 Scala 代码不应该包含 null 值,并且它应该被限制在非常本地化的地方,并尽快转换为一个选项(好的 scala 代码永远不会让 null 值传播)。
    所以在惯用的scala中,如果一个字段或参数是不是 类型 Option这确实意味着它是必需的。

    现在,还有(实验性的,据我所知从未完全支持)NotNull特征。见 How does the NotNull trait work in 2.8 and does anyone actually use it?

    对于第 (2) 点,scala 2.10 引入了 value classes .使用它们,您可以定义自己的类来包装 Int没有运行时开销,并按照您认为合适的方式实现其运算符。唯一需要运行时检查的地方是从正常的 Int 转换时。给您的NonNegativeInt (如果 int 为负,则抛出异常)。请注意,每次创建新的 NonNegativeInt 时都会执行此检查。 ,这也意味着每次执行操作时,都会产生非空运行时影响。但是 Pascal 处于同样的情况(范围检查是在 Pascal 中在运行时执行的)所以我想你可以接受。

    更新 : 这是 NonNegativeInt 的示例实现(此处重命名为 UInt ):

    object UInt {
    def apply( i: Int ): UInt = {
    require( i >= 0 )
    new UInt( i )
    }
    }
    class UInt private ( val i: Int ) extends AnyVal {
    override def toString = i.toString
    def +( other: UInt ) = UInt( i + other.i)
    def -( other: UInt ) = UInt( i - other.i)
    def *( other: UInt ) = UInt( i * other.i)
    def /( other: UInt ) = UInt( i / other.i)
    def <( other: UInt ) = i < other.i
    // ... and so on
    }

    以及 REPL 中的一些示例用法:
    scala> UInt(123)
    res40: UInt = 123

    scala> UInt(123) * UInt(2)
    res41: UInt = 246

    scala> UInt(5) - UInt(8)
    java.lang.IllegalArgumentException: requirement failed
    at scala.Predef$.require(Predef.scala:221)
    at UInt$.apply(<console>:15)
    ...

    关于Scala - 简单的契约设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15205495/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com