我们正在使用双向json请求和this algorithm构建一些同步功能。一切顺利,我们让它在原型模式下运行。现在我正在尝试泛化代码,因为我们将同步应用程序中的几个表。如果能够将类定义为"extends“,并获得附加属性和同步处理方法,只需几个专门化/重写,那就太酷了。我已经走了这么远:
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!
如能就这一办法提出任何建议或建议,将不胜感激。
发布于 2013-10-22 05:47:09
一些快速的:
您传入的那些_参数,然后立即分配给vals:为什么不一击就这么做呢?例如:
abstract class Synchable( val ruid: String = "", val lastSyncTime: String = "", val isDeleted: Int = 0) {这为你节省了一条线,而且意图也更加清晰,我想。
我不确定你把字符串默认为"“--除非有一个很好的理由(而且经常是这样),我认为使用像ruid:Option[String] = None这样的东西更明确,可以让你做各种简单的事情,比如fold,map,flatMap等等。
否则看起来很酷--你可能想做的其他事情就是用一点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)然后,更改会在子类中向下扩展,缩小类型,如果我尝试以上的更新操作,编译器将省略一个(相对明确的)错误。
https://stackoverflow.com/questions/19486289
复制相似问题