比方說,我有一個下列情況下類:類型安全時,可選字段是保證是目前
case class Product(name: String, categoryId: Option[Long]/*, other fields....*/)
在這裏你可以看到,categoryId
是可選的。
現在讓我們說我有一個下面的方法在我的DAO層:
getCategoryProducts(): List[Product] = {
// query products that have categoryId defined
}
你看,這個方法返回的產品,是guaranteed
已用的categoryId一定的價值定義。
我想要做的是這樣的:
trait HasCategory {
def categoryId_!: Long
}
// and then specify in method signature
getCategoryProducts(): List[Product with HasCategory]
這是可行的,但後來這樣的產品將會有兩個方法:categoryId_!
和categoryId
這味道不好。
另一種方法是:
sealed trait Product {
def name: String
/*other fields*/
}
case class SimpleProduct(name: String, /*, other fields....*/) extends Product
case class ProductWithCategory(name: String, categoryId: Long/*, other fields....*/) extends Product
def getCategoryProducts: List[ProductWithCategory] = ...
這種方法有助於避免重複的方法的categoryId和categoryId_!但它需要你創建兩個case類和特質複製所有的領域,這也氣味。
我的問題:我如何使用Scala類型系統來聲明這個沒有這些字段重複的特定情況?
首先....有什麼問題'Option [Long]'?但是如果你想要的話,你可以定義一個隱式TypeClass'ProductWithAssuredCategoryId'。用這個提供額外的方法。 –
如果你還不瞭解TypeClass,你可以要求一個例子。 –
DAO的調用者希望產品具有categoryId,如果它是None,他們沒有任何意義。但它也聞到,如果他們只是'product.categoryId.get' –