1

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

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!

对此方法的任何指示或建议将不胜感激。

4

1 回答 1

0

一些快速的:

你传入的那些_参数,然后立即分配给vals:为什么不一键完成呢?例如

abstract class Synchable( val ruid: String = "", val lastSyncTime: String = "",  val isDeleted: Int = 0) {

我认为这可以为您节省一条线并且意图更清晰。

我不确定您是否将字符串默认为 "" - 除非有充分的理由(而且经常有),我认为使用类似ruid:Option[String] = None的东西更明确,并且可以让您做各种不错的 monad-y 事情,例如fold,等.mapflatMap

否则看起来很酷 - 你可能想做的唯一另一件事是用一点this.type魔法来加强打字,这样你就可以防止在编译时不正确的使用。使用您当前的抽象类,没有什么能阻止我做:

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)

然后更改通过子类向下波动,缩小类型,如果我尝试上述更新操作,编译器将省略(相对清晰的)错误。

于 2013-10-22T05:47:09.197 回答