Powiedzmy, że decydujemy sie na error handling przez Kotlinowy sealed class
, czyli mocno upraszczajac, mamy taka strukture, ktora oczywiscie moze miec wiecej implementacji.
sealed class OperationAResult {
data class Success(val data: String): OperationAResult()
data class Failure(val reason: String): OperationAResult()
}
sealed class OperationBResult {
data class Success(val data: String): OperationBResult()
data class Failure(val reason: String): OperationBResult()
}
Idąc dalej, mamy funkcje ktora operuje na sukcesach z 1 i 2
fun doSomething(a: OperationAResult.Success, b: OperationBResult.Success): String {
return a.data + b.data
}
Ale wczesniej musimy oczywiscie zawolac inne serwisy i zebrac wyniki z OperationA
i OperationB
, najprostszy (brzydki) przyklad wygladac moze tak
fun something(): String {
val operationAResult = when(val result = executeOperationA()) {
is OperationAResult.Success -> result
is OperationAResult.Failure -> throw RuntimeException("")
}
val operationBResult = when(val result = executeOperationB()) {
is OperationBResult.Success -> result
is OperationBResult.Failure -> throw RuntimeException("")
}
return doSomething(operationAResult, operationBResult)
}
No i pojawia sie problem - jak to ladnie (reuzywalnie) zapisac? Nie chce rzucac wyjatkow, ale czy to oznacza ze w kazdym miejscu w ktorym bede wolac operationA()
bede musial robic obsluge wszystkich przypadkow? Co jezeli uzywam tego w 10 miejscach? Co jezeli mam 5 operacji? Teoretycznie prosta funkcja tego typu robi sie strasznie dluga i zawila