我有以下代码:
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
)。我不喜欢这种建筑吗?有人知道如何简化它吗?
答案 0 :(得分:2)
反转avatarsService.avatar(logged, userId).get()
的输出,因此它有一个error
字段而不是成功。该字段的值为NOT_FOUND
和INTERNAL_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();
}
}
这里有两个优点:
闭包之间没有else
。
根据传递的参数关闭(通过委托),删除一些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)
}
为了便于阅读,我将准备方法重命名为error
和success
。我还将方法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]]()
有些事情可以改进。