Ich habe ein paar Funktionen mit einem gleichen Codierungsmuster:Funktion als Parameter
def updateFooValidationStatus(fooId: Long, user: String, valid: Boolean): Option[Foo] = {
val fooMaybe = fooDao.getFooById(activityId)
fooMaybe match {
case Some(foo) => {
fooDao.update(foo.copy(updatedBy = Some(user),
validationStatus = if (valid) Some(DataEntryValidationStatus.Valid) else Some(DataEntryValidationStatus.Invalid))
)
}
case None =>
throw new DomainException(s"Foo with ID: '$fooId' doesn't exist")
}
}
Um meinen Code weniger wiederholt zu machen, habe ich eine neue private Funktion als
private def updateDomainObjectValidationStatus(f1: Long => Option[DomainObject],
parameter1: Long,
f2: DomainObject => Option[DomainObject],
paramter2: String,
valid: Boolean): Option[DomainObject] ={
val somethingMaybe = f1(parameter1)
somethingMaybe match {
case Some(something) =>
f2(
something.copyMe(updatedBy = Some(paramter2),
validationStatus = if(valid) Some(DataEntryValidationStatus.Valid) else Some(DataEntryValidationStatus.Invalid))
)
case None =>
throw new DomainException(s"Object with ID: '$parameter1' doesn't exist")
}
}
wo
schreibentrait DomainObject { ... }
case class Foo(...) extends DomainObject { ... }
Mit den obigen Änderungen kann ich updateDomainObjectValidationStatus innerhalb von updateFooValidationStatus wegen a nicht aufrufen n Fehler auf einen Parameter
type mismatch, expected (DomainObject) => Option[DomainObject], actual (Foo) => Option[Foo]
Interessanterweise beschwert sich nicht den ersten Parameter
(Long) => Option[DomainObject]
die
nimmt(Long) => Option[Foo]
Was wird ein Code-Design in der Scala sein idiomatisch Mode Machen Sie den obigen Code funktioniert?
'Def' sind keine Funktionen, sie sind Methoden – pedrofurla