gpt4 book ai didi

scala - 带有逻辑的案例类的惯用方式是什么

转载 作者:行者123 更新时间:2023-12-02 09:09:18 25 4
gpt4 key购买 nike

FP的惯用方式是什么:假设我有这个

trait Name

object Name{
def apply(name: String): Name = {
if (name.trim.isEmpty || name.trim.length < 3)
InvalidName
else
ValidName(name.trim)
}
}

case object InvalidName extends Name
case class ValidName(name:String) extends AnyVal with Name

现在我有一些辅助功能,例如
def split = name.splitAt(" ")
//some more functions

哪种方法更惯用:
  • 将它们自己放在case类中,但是有些方法使case类包含一些逻辑,但是我可以这样做:
    val n = ValidName("john smith")val (first, last) = n.split
  • 将它们放在专用对象中,但是方法看起来像
    def split(n: ValidName) = n.name.splitAt(" ")
  • 使用隐式类创建一个对象,该对象将接受Name并将调用
  • 方法

    你怎么看 ?

    最佳答案

    case class添加逻辑没有大问题,尤其是当它只是以另一种格式提取数据时。 (当您将数据成员添加到case class时,这将成为问题)。

    所以我会做选项1而不用担心!

    为了回应这些评论,case class实际上只是创建带有一堆有用的预实现方法的类的快捷方式。特别地,unapply方法允许将case class用于模式匹配,并且equals对两个实例的字段进行逐元素比较。

    还有许多其他方法以不同的方式从case class中提取数据。最明显的是toStringcopy,但还有其他类似hashCode的东西,以及从Product继承的所有东西,例如productIterator

    由于case class已经具有以有用方式提取数据的方法,因此我不反对添加split方法作为从case class提取数据的另一种方法。

    关于scala - 带有逻辑的案例类的惯用方式是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54446740/

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