2017-12-02 7 views
1

Wie würden Sie den folgenden Code kotlinischer schreiben?Wann sollte ich {} verwenden und wann nur einfach! = Null?

var returnValue = ... 
val s3data = presignedUrl.body() 
if (s3data != null) { 
    val uploadImage = api.uploadImage(s3data.bucketUrl, s3data.awsAccessKeyId, s3data.policy, s3data.key, s3data.signature, body).execute() 
    if (!uploadImage.isSuccessful) { 
     crashReporterService.sendIssue("Failed uploading file", "Failed uploading file ${uploadImage.raw()}") 
     returnValue = Result.FAILURE 
    } else { 
     returnValue = Result.SUCCESS 
    } 
} else { 
    crashReporterService.sendIssue("Failed uploading image", "Error - ${presignedUrl.raw()}") 
    returnValue = Result.FAILURE 
} 

return returnValue 

lasse ich verwenden können, aber ich glaube, es der Code komplizierter macht

+0

ein Hinweis auf Ihren Code: die Rückkehr so ​​schnell wie möglich ist eine gute Praxis afaik, reduziert den Umfang und vereinfacht die Logik – DPM

Antwort

4
  • Gemeinsame geteilt - In diesem Fall kann die Fehlermeldung und Rückgabe mit Fehlerergebnis - in eine local function konsolidiert werden.
  • Nullität, die eine Rückgabe verursacht (in diesem Fall s3data ist Nullable) kann in der Regel durch eine zurückgehende ?: elvis operator ersetzt werden.
  • Wenn Sie die gleiche Variable immer wieder eingeben (in diesem Fall auf s3data zugreifen), ist ein run Block geeignet. Wenn verwirrt, siehe What is a "receiver" in Kotlin?
  • Wie bereits in einer anderen Antwort angegeben, wenn/else Blöcke sind ein Ausdruck in Kotlin.

Daher möchte ich die folgende Umsetzung meisten ideomatic vorbehaltlich richtige Benennung der Parameter für die lokale Funktion finden:

fun foo() { 
    fun failure(p0: String, p1: String) = crashReporterService.sendIssue(p0, p1).let { Result.FAILURE } 
    val s3data = presignedUrl.body() ?: return failure("Failed uploading image", "Error - ${presignedUrl.raw()}") 
    val uploadImage = s3data.run { api.uploadImage(bucketUrl, awsAccessKeyId, policy, key, signature, body).execute() } 

    return if (uploadImage.isSuccessful) { 
     Result.SUCCESS 
    } else { 
     failure("Failed uploading file", "Failed uploading file ${uploadImage.raw()}") 
    } 
} 

Ihre Frage grenzt an Code-Review, so dass Sie wahrscheinlich auch glücklich sein zu wissen, gibt es eine dedicated Stack Exchange network just for that. Lesen Sie vorher A guide to Code Review for Stack Overflow users, aber.

4

if/else is an expression in Kotlin, zu verstehen, so dass die folgende ist sicherlich mehr Kotlinesque: Code

val s3data = presignedUrl.body() 
return if (s3data != null) { 
    val uploadImage = api.uploadImage(s3data.bucketUrl, s3data.awsAccessKeyId, s3data.policy, s3data.key, s3data.signature, body).execute() 
    if (!uploadImage.isSuccessful) { 
     crashReporterService.sendIssue("Failed uploading file", "Failed uploading file ${uploadImage.raw()}") 
     Result.FAILURE 
    } else { 
     Result.SUCCESS 
    } 
} else { 
    crashReporterService.sendIssue("Failed uploading image", "Error - ${presignedUrl.raw()}") 
    Result.FAILURE 
} 
Verwandte Themen