2017-12-02 15 views
1

次のコードはどのように書くのですか?いつlet {}を使うべきですか?単なる普通!= 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 

私が聞かせて使用することができますが、以下は、確かに多くのKotlinesqueあるので、私は、それがより複雑なコードが

+0

あなたのコードに注意してください:asapはafaikの良い練習であり、スコープを減らし、ロジックを単純化します。 – DPM

答えて

4
  • - この場合、エラー報告と失敗結果の返却 - をlocal functionに統合することができます。
  • 戻り値を返すNULL可能性(この場合、s3dataはnull可)は、通常、返される?: elvis operatorに置き換えられます。
  • 同じ変数を何度も繰り返し入力すると(この場合はs3dataにアクセス)、runブロックが適切です。混乱している場合は、What is a "receiver" in Kotlin?
  • を参照してください。別の答えですでに述べたように、/ elseブロックがKotlinの式である場合。

従って私はローカル関数のパラメータの適切な命名を受け、次の実装が最もideomatic見つけるだろう:

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()}") 
    } 
} 

あなたの質問はコードレビューを境されているので、あなたはおそらくもご満足いただけることでしょうしかし、dedicated Stack Exchange network just for that.があることを知るには前にA guide to Code Review for Stack Overflow usersを読んでください。

4

if/else is an expression in Kotlinを理解することができます感じ:共通の共有コード

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 
} 
関連する問題