Scala 通用同步设计
我们正在使用双向json请求和同步来构建一些同步功能。一切都很好,我们已经在原型模式下运行。现在我正在尝试泛化代码,因为我们将同步应用程序中的几个表。能够将一个类定义为extensedsynctable,并通过一些专门化/覆盖来获得额外的属性和同步处理方法,这将是很酷的。我已经做到了这一点:Scala 通用同步设计,scala,playframework,synchronization,polymorphism,Scala,Playframework,Synchronization,Polymorphism,我们正在使用双向json请求和同步来构建一些同步功能。一切都很好,我们已经在原型模式下运行。现在我正在尝试泛化代码,因为我们将同步应用程序中的几个表。能够将一个类定义为extensedsynctable,并通过一些专门化/覆盖来获得额外的属性和同步处理方法,这将是很酷的。我已经做到了这一点: abstract class Synchable [T<:Synchable[T]] (val ruid: String, val lastSyncTime: String, val isDelete
abstract class Synchable [T<:Synchable[T]] (val ruid: String, val lastSyncTime: String, val isDeleted:Int) {
def contentEquals(Target: T): Boolean
def updateWith(target: T)
def insert
def selectSince(clientLastSyncTime: String): List[T]
def findByRuid(ruid: String): Option[T]
implicit val validator: Reads[T]
def process(clientLastSyncTime: String, updateRowList: List[JsObject]) = {
for (syncRow <- updateRowList) {
val validatedSyncRow = syncRow.validate[Synchable]
validatedSyncRow.fold(
valid = { result => // valid row
findByRuid(result.ruid) match { //- do we know about it?
case Some(knownRow) => knownRow.updateWith(result)
case None => result.insert
}
}... invalid, etc
我是Scala的新手,我知道我可能错过了一些东西——WIP
任何关于这一方法的建议都将不胜感激 一些快速的:
您传入并立即分配给VAL的uu参数:为什么不一次性完成?e、 g
abstract class Synchable( val ruid: String = "", val lastSyncTime: String = "", val isDeleted: Int = 0) {
这为你省去了一条线,而且我认为在意图上也更加清晰
我不确定是否将字符串默认为-除非有很好的理由,而且经常是这样,否则我认为使用ruid:Option[String]=None这样的东西更显式,可以让您执行各种很好的monad-y操作,如折叠、贴图、平面贴图等
否则看起来很酷-你唯一想做的另一件事就是用一点this.typemagic来加强键入,这样你就可以防止在编译时不正确的使用。对于您当前的抽象类,没有什么可以阻止我执行以下操作:
class SynchableCat extends Synchable { ... }
class SynchableDog extends Synchable { ... }
val cat = new SynchableCat
val dog = new SynchableDog
cat.updateWith(dog) // This won't end well
但如果您只是将抽象方法签名更改为以下内容:
def updateWith(target: this.type)
然后,更改会波及子类,缩小类型范围,如果我尝试上述更新操作,编译器将忽略一个相对明显的错误。感谢您的可靠建议-我已将它们与编辑合并在一起。我现在在验证方面遇到了问题。验证器现在是Reads[synctable.this.T]类型,但当我用say implicit val validator实现它时:Reads[Teacher]。。。在Teacher扩展synctable的地方,我得到了一个类型不兼容的错误,覆盖了类型为play.api.libs.json.Reads[Teacher.this.T]的synctable类中的值验证器;值验证器的类型不兼容,我不理解。当然,Teacher.T与它的超类型synctable是兼容的。这个.T?我在为上面定义具体类时遇到的问题似乎是因为这是一个F-有界多态的情况,例如,请参见。因此将签名更改为抽象类synctable[T