2013-10-21 37 views
1

我們正在使用雙向json請求和this algorithm構建一些同步功能。一切都很好,我們有它在原型模式下運行。現在我試圖對代碼進行泛化,因爲我們將在應用程序中同步多個表。能夠將一個類定義爲「extends Synchable」並通過一些專門化/覆蓋獲得附加屬性和同步處理方法將會很酷。我有這麼遠:通用同步設計

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 

我是新來的斯卡拉,知道我可能會錯過的東西 - WIP!

任何關於這種方法的指針或建議將不勝感激。

回答

0

一些快速的:

那些_參數傳遞中,然後立即分配給val S:爲什麼不這樣做的一重擊?例如

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

它爲您節省了一條線,並且意圖更清晰,我想。

我不確定你的字符串是否默認爲「」 - 除非有很好的理由(並且經常有),我認爲使用類似ruid:Option[String] = None的東西更加明確,可以讓你做各種不錯的monad-y之類的東西foldmapflatMap

尋找很酷,否則 - 你可能想要做的唯一的另一件事是加強與有點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) 

然後改變通過子漣漪下來,縮小如果我嘗試上述更新操作,編譯器將省略(相對清晰)的錯誤。

+0

感謝您的堅實建議 - 我已經將它們與編輯結合起來。我現在在驗證時遇到問題。 'validator'現在的類型是'Reads [Synchable.this.T]',但是當我用'implicit val validator:Reads [Teacher] ...'實現它時,教師擴展了Synable,我得到一個不兼容類型的錯誤, 「重寫類型爲play.api.libs.json.Reads [Teacher.this.T]的類Synable中的值驗證器;值驗證器具有不兼容類型」,這是我不明白的。當然'Teacher.this.T'與它的超類型'Synchable.this.T'兼容? – wwkudu

+0

當我爲上述定義具體類時,似乎我遇到的問題是因爲它是一個F-界多態的例子(參見[這裏](http://twitter.github.io/scala_school/advanced-types)。 html),[here](http://stackoverflow.com/questions/16256965/f-bound-polymorphism-with-abstract-types-instead-of-parameter-types)和[here](http:// stackoverflow例如)/ 14067406/f-bounded-polymorphism-in-scala)。因此,將簽名更改爲'abstract class Synchable [T <:Synchable [T]]',具體定義爲'class Foo extends Synchable [Foo]'等。再次感謝。 – wwkudu