Groovy代码简化和'如果'消除

时间:2014-06-04 09:55:13

标签: if-statement groovy

我有以下代码:

    def avatar = avatarsService.avatar(logged, userId).get()

    def result

    if (avatar.success) {
        def url = avatar.content.avatarUrl

        if (url) {
            def content = contentForAvatar(url)
            result = content ? prepareAvatarSuccessResponse(content, avatar.content.fileType) : prepareAvatarErrorResponse(INTERNAL_SERVER_ERROR)
        } else {
            result = prepareAvatarErrorResponse(NOT_FOUND)
        }
    } else {
        result = prepareAvatarErrorResponse(INTERNAL_SERVER_ERROR)
    }

    result

首先,我需要从userService获取头像描述,然后处理内容,如果它有效(success)。我不喜欢这种建筑吗?有人知道如何简化它吗?

4 个答案:

答案 0 :(得分:2)

反转avatarsService.avatar(logged, userId).get()的输出,因此它有一个error字段而不是成功。该字段的值为NOT_FOUNDINTERNAL_SERVER_ERROR

def avatar = avatarsService.avatar(logged, userId).get()

def result = avatar.error ? prepareAvatarErrorResponse( avatar.error ) : 
                            prepareAvatarSuccessResponse(content, avatar.content.fileType)

答案 1 :(得分:2)

您似乎想要改变您的编程范例:它是

逻辑编程。

无论如何,我们可以基于强大的闭包:

ifElse(success){
    ifElse(avatar.content.avatarUrl){
         //thanks to delegate , "it" equals now to avatar.content.avatarUrl
         def content = contentForAvatar(it)
         result=content?prepareAvatarSuccessResponse(content, avatar.content.fileType) : prepareAvatarErrorResponse(INTERNAL_SERVER_ERROR)
    }{
         result = prepareAvatarErrorResponse(NOT_FOUND)
    }
}{
      result = prepareAvatarErrorResponse(INTERNAL_SERVER_ERROR)
}

帮助方法:

def ifElse(def test,Closure c,Closure ifnot={}){
     if(test){
          c.delegate=test;
          c();
        }else{
         ifnot.delegate=test;
         ifnot();

    }
}

DEMO

  • 这里有两个优点:

    1. 闭包之间没有else

    2. 根据传递的参数关闭(通过委托),删除一些var声明(def url)。

答案 2 :(得分:2)

一种选择是使用Groovy switch

def avatar = avatarsService.avatar(logged, userId)
switch(avatar) {
    case {!it.success}:           return error(INTERNAL_SERVER_ERROR)
    case {!it.content.url}:       return error(NOT_FOUND)
    case {!it.retrieveContent()}: return error(INTERNAL_SERVER_ERROR)
    default:                      return success(avatar.retrieveContent(), avatar.content.fileType)
}

为了便于阅读,我将准备方法重命名为errorsuccess。我还将方法retrieveContent添加到了头像中。如果以这种方式使用,请注意不要两次读取内容。

答案 3 :(得分:1)

我根据创建回复的操作地图创建了解决方案:

def avatar = avatarsService.avatar(logged, userId).get()
if (!avatar.success) {
        return prepareAvatarErrorResponse(INTERNAL_SERVER_ERROR)
}
def map = [
        [true, true] : {prepareAvatarSuccessResponse(content, avatar.content.fileType)},
        [true, false] : {prepareAvatarErrorResponse(INTERNAL_SERVER_ERROR)}].withDefault {prepareAvatarErrorResponse(NOT_FOUND)}
return map[[ (url = avatar.content.avatarUrl) as boolean, contentForAvatar(url) as boolean]]()

有些事情可以改进。