在代码审查期间,我和另一个开发人员就处理多次返回的正确或正确方式进行了一次小辩论,如果将指针分配为null,然后进行设置,则与单纯返回值相比,会产生任何差异。稍后返回null。
return Object.create(this, {
users: { value: filtered }
});
vs
return Object.create(this, {
users: {
value: filtered,
enumerable: true,
writable: true
}
});
从功能上来说,它们似乎是相同的,但我们不知道我的一个是否比另一个更正确。尽管我担心这可能只是制表符与空格的争论。
答案 0 :(得分:0)
我会遵循@khelwood的建议。如果您不想按@ControlAltDel
的指示在函数调用之外处理引发的异常,请使用Optional
private Optional<ServiceParam> getRequestServiceParam(SlingHttpServletRequest request) {
try {
return Optional.of(new ServiceParam(IOUtils.toString(request.getReader())));
} catch (IOException e) {
LOGGER.error("IOException", e);
return Optional.empty();
}
}
如果您必须使用null
,我希望使用第二种方法
private ServiceParam getRequestServiceParam(SlingHttpServletRequest request) {
try {
return new ServiceParam(IOUtils.toString(request.getReader()));
} catch (IOException e) {
LOGGER.error("IOException", e);
return null;
}
}
因为我不必三思而后行地陈述一切。因此,不需要不必要的变量声明,也无需记住其中的内容。 (对于Optional方法,此参数也适用。)
更新1 :对于单个方法中的两个(可能是三个)返回语句,这是正确的,如果有多个return语句,则必须考虑其他解决方案。
更新2 :还有一个声纳规则squid:S1142
恕我直言
答案 1 :(得分:0)
从一个方法返回不止一个是否可以接受是一个问题。但是,这里有一些折衷之处,可以讨论某些解决方案在哪些方面比其他解决方案更好。 Sonarqube的投诉是一个很好的起点,但是存在更大的问题。
有些人认为拥有不止一个回报是不好的,并且无论如何他们都希望遵循结构化的编程规则。结构化编程比使用goto更好,并且确实会生成外观一致的代码。
其他人指出,强制执行一个返回值会使控制语句的嵌套更深,从而导致难以阅读的代码。在第一个示例的情况下,我发现自己在该方法中上下扫描,以查找局部变量在何处获得为其分配的值,我认为这很烦人。
(顺便说一句,Sonarqube不能正确地计算出圈复杂度,顺便说一句。因此,如果您为了避免这种做法而烦恼,也许那里存在一种利己主义;这是在告诉您,不要去编写代码我们很难弄清楚。)
此外,这没有任何性能影响。这只是笨拙的编码和不理想的异常处理问题。当您返回null时,会为调用代码创造一个机会,以使它无法检查引用是否为null,最好抛出该异常。
除非在将内容链接在一起并使用flatMap为我处理Optional空情况的单子上下文中使用,否则我不会使用Optional。否则,必须将其包装和拆开是很烦人的,这比返回null更好,只是因为它会强制调用代码考虑空情况。
在这种情况下,实际的尴尬是由读取httprequest引起的,这是引发IOException的原因。您可以在方法中添加throws IOException
并引发异常。但是最好将代码移至正在获取httprequest的任何servlet或Web控制器,并通过与处理servlet或控制器的其他方法相同的方式来处理它,从而引发任何IOException异常。
一旦移动了该请求读取代码,就根本没有令人信服的理由使这种方法存在。删除不必要的代码是一件好事。
答案 2 :(得分:-1)
涉及代码维护时,多个返回易于出错。多重收益并非最容易阅读。
当涉及到这样的选择时,我总是选择那些不写它的人更容易阅读的代码。
一年后,当其他人阅读它时,他们可能会着急处理紧急情况,并且他们希望一眼就能完全理解代码。
我努力编写易于阅读的代码,即对他人进行重构的风险较小。
答案 3 :(得分:-1)
总是最好避免使用局部变量,以提高性能。如果您过于担心可读性,请选择选项1,否则请选择选项2。有关返回之前将结果分配给局部变量的详细信息,请查看此documentation。