我的应用程序有两个层次:领域和应用。每个层次都有其自己的“错误”ADT(抽象数据类型)。例如:
package com.domain.person
sealed trait DomainError
case object NoPermission extends DomainError
final case class Person(hasPermission: Boolean): Either[DomainError, ???] {
def doSomething() = {
if (!hasPermission)
Left(NoPermission)
else
...
}
}
在我的应用程序层(另一个包)中:
package com.application.person
sealed trait ApplicationError
case object PersonNotFound extends ApplicationError
case object UnexpectedFatalError extends ApplicationError
// and a function f :: Either ApplicationError Something
问题在于,由于
DomainError
存在于另一个包中,我不能简单地扩展我的ApplicationError
特征:sealed trait ApplicationError extends DomainError // compilation error
我可以创建另一个case object
来包装 DomainError
:
sealed trait ApplicationError
// n list of errors, and then:
final case class WrappedDomainError(d: DomainError) extends ApplicationError
但是最好的解决方案是次优的。
而且,如果我想在我的 doSomething()
中更加具体,并且不是返回整个DomainError
,而是返回不同的子集,该怎么办?
doSomething :: Either DoSomethingErrors ???
我需要在每个领域层的函数中考虑所有情况。
有没有一种在Scala中实现适当的sum type的方法?
谢谢