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

Validation 在Scala 2.10中验证和扩展构造函数参数的最佳方法,validation,scala,scala-2.10,Validation,Scala,Scala 2.10,我希望有一个类有许多字段,如字符串、布尔值等,当构建该类时,我希望有一个与每个字段相关联的字段名,并验证该字段(使用正则表达式表示字符串)。理想情况下,我只想在构造函数中指定参数需要满足某些标准 下面是一些示例代码: case类数据(val名称:String…,val文件名:String…){ name.verify //访问与name参数关联的fieldName。 println(name.fieldName)/“name” println(fileName.fieldName)/“文件名”

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

下面是一些示例代码:

case类数据(val名称:String…,val文件名:String…){
name.verify
//访问与name参数关联的fieldName。
println(name.fieldName)/“name”
println(fileName.fieldName)/“文件名”
}
val x=数据(“测试名”、“测试文件”)
//将名称视为数据中的字符串字段
x、 名称//为字符串类型,不公开字段名等
有没有一个优雅的方法来实现这一点

编辑: 我想我还没能清楚地理解我在追求什么。 我有一个具有许多字符串参数的类。这些参数中的每一个都需要以特定的方式进行验证,我还希望每个参数都有一个字符串字段名。但是,我仍然希望能够将参数视为普通字符串(参见示例)

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

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

通常,这种创造性模式最好由一个或多个工厂方法或某种建设者提供

对于一个基本工厂,只需定义一个与您想要的工厂方法配套的方法。如果您想要相同的简写构造符号(
new
-free),您可以重载预定义的
apply
(尽管您不能替换签名与
案例类
构造函数完全匹配的符号)

如果您想避免客户端代码在验证失败时处理异常的混乱,您可以返回
选项[Data]
或[ErrorIndication,Data]
。或者你可以使用ScalaZ的
验证
,我会任意声明它超出了这个答案的范围('因为我对它不够熟悉…)


但是,实例所呈现的属性不能不同。甚至子类也不能从公共API中减去。如果您需要能够做到这一点,您将需要一个更复杂的构造,例如公共部分需要一个
trait
,变体和/或扩展需要一个单独的
case类。

您写的“不公开字段名”是打字错误吗?我更新了代码示例以使其更清晰。我想给每个构造函数参数附加一个参数fieldName,但我不想让它暴露在外面。好的,但是。。。这个
fieldName
来自哪里?如果足够的话,您可以在
案例类
的主体中添加
private val
。这就是我想知道的。我希望能够围绕参数逻辑来验证参数以及存储有关参数的信息。我的问题是,Scala中有没有一种惯用的方法可以做到这一点。很抱歉,我不明白您想做什么。您的意思是在异常情况下不应该在构造函数中抛出异常吗?在构造函数中使用
require
断言怎么样?我现在试图避免异常(将它们限制在尽可能接近其他代码可能生成它们的位置),我发现构造函数中的异常特别混乱。是的,包括
需要
断言
。我指的是我所说的情况,由于一个bug或其他原因,发生了一些意想不到的事情。通常,你希望你的程序崩溃,因为你不知道该怎么做。如果预计会出现“异常”情况(如用户输入格式错误),则-是-不要使用异常,否则?当然。首先,一般来说,你无法阻止它。但我避免故意抛出(公开地或用
断言
/
要求
)。YMMV(正如我们过去常说的…)。嗨,Randall,我原则上同意你关于例外的看法。不幸的是,代码的其余部分是使用异常编写的,由Scala和Java混合组成。我很高兴验证代码存在于构造函数之外的工厂应用方法中。但是,我需要能够访问已分配给实际类内参数的字段名。我会编辑这个问题,让它更清楚。