Kotlinで、この複雑な場合-else文の保守可能にする方法

J.アダム:

私はrequestparamsに基づいてデータベースから情報を取得する機能を書きました。次のif-else文は大きな問題です。我々は複数のフィルタを追加し続けるならば、我々はすべての可能なパスのステートメントを追加し続ける必要があります。

    fun getMessages(name: String, pageable: Pageable, locale: String?, subject: String?,
                              recipient: String?): Page<MessageDTO>? {

        val messagePageable= if (!locale.isNullOrEmpty() && !subject.isNullOrEmpty() && !recipient.isNullOrEmpty()) {
            messageRepository.findAll(where(hasMessageName(name).and(hasLocale(locale!!)
            .and(hasSubject(subject!!).and(hasRecipient(recipient!!))))), pageable)
        } else if (!locale.isNullOrEmpty()) {
            messageRepository.findAll(where(hasMessageName(name).and(hasLocale(locale!!))), pageable)
        } else if (!subject.isNullOrEmpty()) {
            messageRepository.findAll(where(hasMessageName(name).and(hasSubject(subject!!))), pageable)
        } else {
            messageRepository.findAll(where(hasMessageName(name)), pageable)
        }
        return messagePageable.map { messageMapper.toMessageDTO(it) }.takeIf { it.content.isNotEmpty() }
}

これを足すのより良い方法があるはずです。私はあなたの助けに感謝します。

半神半人:

私はわからないんだけど、おそらくいくつかのリファクタリングが役立ちます。あなたが何らかの使用しているように例えば、そうですrequestデシベルへのパラメータに従って満たされた場合、ので、多分それはこのように管理することができ、。

fun getMessages(name: String, pageable: Pageable, locale: String?, subject: String?,
                          recipient: String?): Page<MessageDTO>? {
    val request = where(hasMessageName(name))
    locale?.let{ request.and(hasLocale(it)) }
    subject?.let{ request.and(hasSubject(it)) }
    recipient?.let{ request.and(hasRecipient(it))}

    return messageRepository.findAll(request, pageable)
                            .map { messageMapper.toMessageDTO(it) }
                            .takeIf { it.content.isNotEmpty() }
}

ここで、私はどのようにわからない.and()方法での作品は、ので、多分それは次のようにする必要があります:request = request.and(...)

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=230437&siteId=1
おすすめ