gpt4 book ai didi

validation - 在 Scala 2.10 中验证和扩展构造函数参数的最佳方法

转载 作者:行者123 更新时间:2023-12-04 05:11:36 25 4
gpt4 key购买 nike

我想要一个具有多个字段的类,例如字符串、 bool 值等,并且在构造该类时,我希望有一个与每个字段相关联的字段名并验证该字段(对字符串使用正则表达式)。理想情况下,我只想在构造函数中指定参数需要满足某些条件。

一些示例代码:

case class Data(val name: String ..., val fileName: String ...) {
name.verify
// Access fieldName associated with the name parameter.
println(name.fieldName) // "Name"
println(fileName.fieldName) // "File Name"
}

val x = Data("testName", "testFile")
// Treat name as if it was just a string field in Data
x.name // Is of type string, does not expose fieldName, etc

有没有一种优雅的方式来实现这一目标?

编辑:
我不认为我已经能够清楚地了解我所追求的。
我有一个带有许多字符串参数的类。这些参数中的每一个都需要以特定方式进行验证,并且我还希望有一个与每个参数关联的字符串 fieldName。但是,我仍然希望能够将参数视为普通字符串(参见示例)。

我可以将逻辑编码到 Data 中,并作为每个参数的 Data 伴随对象的应用方法,但我希望有更通用的东西。

最佳答案

将逻辑(例如参数验证)放入构造函数是可疑的。从构造函数中抛出异常是双重的。

通常这种创建模式最好使用一个或多个工厂方法或某种构建器。

对于基本工厂,只需定义一个带有您想要的工厂方法的伴侣。如果您想要相同的简写结构符号(new -free),您可以重载预定义的 apply (尽管您可能无法替换其签名与 case class 构造函数完全匹配的那个)。

如果你想让你的客户端代码在验证失败时避免处理异常的困惑,你可以返回 Option[Data]Either[ErrorIndication, Data]反而。或者您可以使用 ScalaZ 的 Validation ,我将任意声明超出此答案的范围(因为我对它不够熟悉...)

但是,您不能拥有在它们所呈现的属性上有所不同的实例。甚至子类也不能从公共(public) API 中减去。如果您需要能够做到这一点,您将需要更精细的构造,例如 trait用于公共(public)部分和单独的 case class es 用于变体和/或扩展。

关于validation - 在 Scala 2.10 中验证和扩展构造函数参数的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14865528/

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