Scala 通用同步设计

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

我们正在使用双向json请求和同步来构建一些同步功能。一切都很好,我们已经在原型模式下运行。现在我正在尝试泛化代码,因为我们将同步应用程序中的几个表。能够将一个类定义为extensedsynctable,并通过一些专门化/覆盖来获得额外的属性和同步处理方法,这将是很酷的。我已经做到了这一点:

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