加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

使用Scala案例类作为事实上的地图

发布时间:2020-12-16 08:56:08 所属栏目:安全 来源:网络整理
导读:这是一个设计问题而不是其他任何问题…… 我非常喜欢Scala的案例类并经常使用它们.但是,我发现我经常在Options(或者更确切地说,Lift’s Boxes)中包含我的参数并设置默认值以允许灵活性并且考虑到用户可能并不总是指定所有参数.我想我采用了这种做法. 我的问
这是一个设计问题而不是其他任何问题……

我非常喜欢Scala的案例类并经常使用它们.但是,我发现我经常在Options(或者更确切地说,Lift’s Boxes)中包含我的参数并设置默认值以允许灵活性并且考虑到用户可能并不总是指定所有参数.我想我采用了这种做法.

我的问题是,这是一种合理的方法吗?鉴于一切都可以是可选的,可以有很多样板和检查,到目前为止我是否想知道我是不是只是使用我的案例类如Map [String,Any]并且想知道我是否会更好只是使用地图.

让我举个实例.我在这里建模汇款:

case class Amount(amount: Double,currency: Box[Currency] = Empty)
trait TransactionSide
case class From(amount: Box[Amount] = Empty,currency: Box[Currency] = Empty,country: Box[Country] = Empty) extends TransactionSide
case class To(amount: Box[Amount] = Empty,country: Box[Country] = Empty) extends TransactionSide
case class Transaction(from: From,to: To)

我认为比较容易理解.在这个最简单的我们可能会声明一个这样的事务:

val t = Transaction(From(amount=Full(Amount(100.0)),To(country=Full(US)))

我已经可以想象你认为它很冗长.如果我们指定一切:

val t2 = Transaction(From(Full(Amount(100.0,Full(EUR))),Full(EUR),Full(Netherlands)),To(Full(Amount(150.0,Full(USD))),Full(USD),Full(US)))

另一方面,尽管不得不在各处抛出Full,你仍然可以做一些不错的模式匹配:

t2 match {
  case Transaction(From(Full(Amount(amount_from,Full(currency_from1))),Full(currency_from2),Full(country_from)),To(Full(Amount(amount_to,Full(currency_to1))),Full(currency_to2),Full(country_to))) if country_from == country_to => Failure("You're trying to transfer to the same country!")
  case Transaction(From(Full(Amount(amount_from,Full(US)),Full(North_Korea))) => Failure("Transfers from the US to North Korea are not allowed!")
  case Transaction(From(Full(Amount(amount_from,Full(country_to))) => Full([something])
  case _ => Empty
}

这是一种合理的方法吗?使用地图会更好吗?或者我应该以不同的方式使用案例类?也许使用整个层次结构的案例类来表示具有不同信息量的交易?

解决方法

使用案例类的灵活性不如地图,因为您只能分配/访问预定义的字段.您需要事先构建完整的案例类层次结构.

另一方面,case类提供了一种“编译时验证”,因为所有类型都是明确定义的(与Map [String,Any]相反),并且你不能错误地分配/访问非指定字段.案例类也应该更快,因为您不需要遍历地图哈希表来查找您要查找的内容.

“冗长”问题来自案例类的不可变方面,但是对于不可变映射你会遇到完全相同的问题.解决方案似乎是镜头.这里有一个非常好的话题:

http://www.youtube.com/watch?v=efv0SQNde5Q&list=PLEDE5BE0C69AF6CCE

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读