域名续费做网站/热门网站排名

域名续费做网站,热门网站排名,手机优化怎样解除,网站开发视频下载sap寄售退货单我曾经听说过,过去人们一直在努力使方法具有单个出口点。 我知道这是一种过时的方法,从未认为它特别值得注意。 但是最近我与一些仍坚持该想法的开发人员联系(最后一次是在这里 ),这让我开始思考。 因此…

sap寄售退货单

我曾经听说过,过去人们一直在努力使方法具有单个出口点。 我知道这是一种过时的方法,从未认为它特别值得注意。 但是最近我与一些仍坚持该想法的开发人员联系(最后一次是在这里 ),这让我开始思考。

因此,我第一次真正坐下来比较了这两种方法。

总览

文章的第一部分将针对多个return语句重复参数。 它还将确定干净代码在评估这些论点中的关键作用。 第二部分将对得益于早日返回的情况进行分类。

为了不总是写“带有多个return语句的方法”,我将这种方法称为通过模式构造方法的方法。 虽然这可能有点过头,但肯定会更简洁。

讨论

我正在讨论一个方法是应该始终运行到最后一行,从那里返回结果,还是可以有多个return语句并“尽早返回”。

这当然不是新的讨论。 参见,例如Wikipedia , Hacker Chick或StackOverflow 。

结构化程序设计

单个return语句是可取的想法源于1960年代开发的结构化编程范式。 关于子例程,它促进它们具有单个入口和单个出口点。 尽管现代编程语言可以保证前者,但出于某些原因,后者有些过时了。

单个出口点解决的主要问题是内存或资源泄漏。 当方法内部某处的return语句阻止执行位于其末尾的某些清除代码时,就会发生这种情况。 如今,其中大部分由语言运行时处理(例如,垃圾回收),并且可以使用try-catch-finally编写显式清除块。 因此,现在的讨论主要围绕可读性。

可读性

坚持单个return语句可能导致嵌套增加,并需要其他变量(例如,中断循环)。 另一方面,使方法从多个点返回可能导致其控制流程混乱,从而使其难以维护。 重要的是要注意,这两个方面在代码的整体质量方面有很大的不同。

考虑一种遵循简洁的编码准则的方法:它简短且具有明确的名称和意图揭示结构。 通过引入更多的嵌套和更多的变量,在可读性方面的相对损失非常明显,并且可能使干净的结构混乱。 但是由于该方法的简洁性和形式使其易于理解,因此忽略任何返回声明的风险不大。 因此,即使存在不止一个,控制流程仍然显而易见。

将此与较长的方法(可能是复杂或优化算法的一部分)进行对比。 现在情况逆转了。 该方法已经包含许多变量,并且可能包含一些嵌套级别。 引入更多内容在可读性方面几乎没有相对成本。 但是,忽视多个回报之一从而误解控制流程的风险是非常现实的。

因此,问题在于方法是否简短易读。 如果是这样,通常使用多个return语句是一种改进。 如果不是,则最好使用单个return语句。

其他因素

但是,可读性可能不是唯一的因素。

讨论的另一方面可以是日志记录。 如果要记录返回值但不求助于面向方面的编程,则必须在方法的出口点手动插入记录语句。 使用多个return语句执行此操作很繁琐,而忘记一个则很容易。

同样,如果要在从方法返回之前声明结果的某些属性,则可能希望使用单个退出点。

多个退货报表的情况

在几种情况下,一种方法可以从多个返回语句中获利。 我试图在这里对它们进行分类,但没有声称有完整的列表。 (如果您遇到另一种重复出现的情况,请发表评论,我将在此附上。)

每种情况都会附带一个代码示例。 请注意,缩短这些内容可以使观点更清楚,并且可以通过多种方式进行改进。

由JDHancock在CC-BY 2.0下发布

由JDHancock在CC-BY 2.0下发布

警卫条款

保护子句位于方法的开头。 他们检查其参数,并在某些特殊情况下立即返回结果。

防范条款无效或空集合

private Set<T> intersection(Collection<T> first, Collection<T> second) {// intersection with an empty collection is emptyif (isNullOrEmpty(first) || isNullOrEmpty(second))return new HashSet<>();return first.stream().filter(second::contains).collect(Collectors.toSet());
}

从一开始就排除边缘情况有几个优点:

  • 它将特殊情况和常规情况的处理完全分开,从而提高了可读性
  • 它提供了用于其他检查的默认位置,从而保持了可读性
  • 这使得实施常规案例的错误更少
  • 它可能会提高那些特殊情况下的性能(尽管这很少相关)

基本上,适用于该模式的所有方法都将从其使用中受益。

值得一提的是后卫条款的支持者是马丁·福勒(Martin Fowler),尽管我会在分支的边缘考虑他的例子 (见下文)。

分枝

某些方法的职责要求分支到几个通常专用的子例程之一。 通常最好将这些子例程本身实现为方法。 然后,原始方法仅负责评估某些条件并调用正确的例程。

委托专门方法

public Offer makeOffer(Customer customer) {boolean isSucker = isSucker(customer);boolean canAffordLawSuit = customer.canAfford(legalDepartment.estimateLawSuitCost());if (isSucker) {if (canAffordLawSuit)return getBigBucksButStayLegal(customer);elsereturn takeToTheCleaners(customer);} else {if (canAffordLawSuit)return getRid(customer);elsereturn getSomeMoney(customer);}
}

(我知道我可以省略所有else行。有一天,我可能会写一篇帖子解释为什么在这种情况下我不这样做。)

与结果变量和单个返回相比,使用多个return语句具有多个优点:

  • 该方法更清楚地表达了其打算跳转到子例程并仅返回其结果的意图
  • 在任何理智的语言中,如果分支不能涵盖所有可能性,则该方法不会编译(在Java中,如果未将变量初始化为默认值,也可以通过一次返回来实现)
  • 结果没有额外的变量,几乎可以覆盖整个方法
  • 被调用方法的结果在返回之前是无法操纵的(在Java中,如果变量是final并且其类是不可变的,也可以通过单次返回来实现;但是,这对于读者而言并不明显)
  • 如果将switch语句用于具有穿透性的语言(例如Java),则立即返回语句可按情况节省一行,因为不需要break ,这减少了样板并提高了可读性

此模式仅应应用于除分支以外无所作为的方法。 分支机构涵盖所有可能性尤其重要。 这意味着分支语句下面没有代码。 如果有的话,将需要花费更多的精力来推理通过该方法的所有路径。 如果一种方法满足这些条件,那么它将很小且具有凝聚力,这很容易理解。

级联检查

有时,一种方法的行为主要由多个检查组成,其中每个检查的结果可能使进一步检查变得不必要。 在这种情况下,最好尽快返回(也许在每次检查之后)。

在寻找锚定父级时进行级联检查

private Element getAnchorAncestor(Node node) {// if there is no node, there can be no anchor,// so return nullif (node == null)return null;// only elements can be anchors,// so if the node is no element, recurse to its parentboolean nodeIsNoElement = !(node instanceof Element);if (nodeIsNoElement)return getAnchorAncestor(node.getParentNode());// since the node is an element, it might be an anchorElement element = (Element) node;boolean isAnchor = element.getTagName().equalsIgnoreCase("a");if (isAnchor)return element;// if the element is no anchor, recurse to its parentreturn getAnchorAncestor(element.getParentNode());
}

其他示例是Java中equalscompareTo的常规实现。 它们通常还包括一系列检查,其中每个检查都可以确定方法的结果。 如果是这样,则立即返回该值,否则该方法将继续进行下一个检查。

与单个return语句相比,此模式不需要您跳过箍以防止更深的缩进。 它还使直接添加新的检查和在检查并返回块之前放置注释成为可能。

与分支一样,多个return语句应仅应用于短而几乎没有其他作用的方法。 级联检查应该是它们的中心,或者更好的是它们的唯一内容(除了输入验证之外)。 如果检查或返回值的计算需要两到三行以上,则应将其重构为单独的方法。

正在搜寻

在具有数据结构的地方,可以找到具有特殊条件的项目。 搜索它们的方法通常看起来很相似。 如果这种方法遇到了要搜索的项目,则通常最容易立即返回它。

立即返回找到的元素

private <T> T findFirstIncreaseElement(Iterable<T> items, Comparator<? super T> comparator) {T lastItem = null;for (T currentItem : items) {boolean increase = increase(lastItem, currentItem, comparator);lastItem = currentItem;if (increase) {return currentItem;}}return null;
}

与单个return语句相比,这使我们免于寻找摆脱循环的方法。 这具有以下优点:

  • 没有其他布尔变量可以打破循环
  • 循环没有其他条件,它很容易被忽略(尤其是在for循环中),因此会滋生错误
  • 最后两点使循环更容易理解
  • 结果很可能没有其他变量,几乎涵盖了整个方法

像大多数使用多个return语句的模式一样,这也需要干净的代码。 该方法应该很小,除了搜索外别无其他责任。 非平凡的检查和结果计算应具有自己的方法。

反射

我们已经看到了支持和反对多个return语句的参数,以及干净代码所起的关键作用。 分类应有助于识别重复出现的情况,在这种情况下,一种方法将从早期返回中受益。

翻译自: https://www.javacodegeeks.com/2015/01/multiple-return-statements.html

sap寄售退货单

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/338908.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

课堂经验值管理小程序_微信小程序怎么管理门店?

微信门店小程序是一种不用注册下载就能使用的购物平台&#xff0c;近年来很是流行&#xff0c;而且它操作简单&#xff0c;能让用户快速找到自己需要的产品&#xff0c;然后进行购买&#xff0c;深得用户喜爱&#xff0c;有用户的地方就会有商家&#xff0c;商家想拥有自己的微…

C语言 | 直接插入排序

解题思路&#xff1a;直接插入排序是一种最简单的排序方法&#xff0c;其基本操作是将一条记录插入到已排好的有序表中&#xff0c;从而得到一个新的、记录数量增1的有序表。C语言源代码演示&#xff1a;#include//头文件 int main()//主函数 {void insort(int post[],int n)…

mysql+after+commit_Spring事务aftercommit原理及实践

来道题CREATE TABLE goods (id bigint(20) NOT NULL AUTO_INCREMENT,good_id varchar(20) DEFAULT NULL,num int(11) DEFAULT NULL,PRIMARY KEY (id),KEY goods_good_id_index (good_id)) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COLLATEutf8mb4_0900_ai_ciClass.forName("c…

序列化和反序列化的概念_序列化的概念

序列化和反序列化的概念讨论了为什么Optional不可序列化以及如何处理&#xff08;即将推出&#xff09;之后&#xff0c;让我们仔细看看序列化。 总览 这篇文章介绍了序列化的一些关键概念。 它尝试精简地执行此操作&#xff0c;而不会涉及太多细节&#xff0c;包括将建议降至…

C语言必学的12个排序算法:基数排序

# 基本思想基数排序(radix sort)&#xff0c;同样时一种非比较的内部排序算法&#xff0c;主要基于多关键字排序的思想进行排序&#xff0c;它将单个关键字按照基数分成“多个关键字”进行排序。例如整数789是一个关键字&#xff0c;可以按照十进制位划分多关键字&#xff08;十…

有没有code能改xml内容_Spring源码解析-applicationContext.xml加载和bean的注册

applicationContext文件加载和bean注册流程​ Spring对于从事Java开发的boy来说&#xff0c;再熟悉不过了&#xff0c;对于我们这个牛逼的框架的介绍就不在这里复述了&#xff0c;Spring这个大杂烩&#xff0c;怎么去使用怎么去配置&#xff0c;各种百度谷歌都能查到很多大牛教…

C语言数据类型转换

首先变量的数据类型是可以转换的。转换的方法有两种&#xff0c;一种是自动转换&#xff0c;另一种是强制转换。自动转换即当不同类型的数据进行混合运算时&#xff0c;编译系统将按照一定的规则自动完成。而强制类型转换是由程序员通过编程强制转换数据的类型。自动转换的规则…

java 类持久化_Java 持久化之 -- IO 全面整理(看了绝不后悔)

目录&#xff1a;一、java io 概述什么是IO&#xff1f;IO包括输入流和输出流&#xff0c;输入流指的是将数据以字符或者字节形式读取到内存 分为字符输入流和字符输入流输入流指的是从内存读取到外界 &#xff0c;分为字符输入流和字节输出流Java IO即Java 输入输出系统。不管…

idea 找不到或无法加载主类_解决IDEA中Groovy项目no Groovy library is defined的问题

实验环境IDEA2019.1.2Groovy-2.5.8错误重现新建了一个Groovy工程&#xff0c;指定了groovy版本&#xff0c;如图新建了一个简单的Groovy Class&#xff0c;运行&#xff0c;出现如下错误错误的尝试(以下是试错过程&#xff0c;并不能解决问题&#xff0c;读者可以不要跟着操作&…

C语言标识符、关键字和注释

这一节主要讲解C语言中的几个基本概念。标识符定义变量时&#xff0c;我们使用了诸如“a”“abc”“mn123”这样的名字&#xff0c;它们都是程序员自己起的&#xff0c;一般能够表达出变量的作用&#xff0c;这叫做标识符&#xff08;Identifier&#xff09;。标识符就是程序员…

java 类.class_面试官:Java反射是什么?我回答不上来!

一.概念反射就是把Java的各种成分映射成相应的Java类。Class类的构造方法是private&#xff0c;由JVM创建。反射是java语言的一个特性&#xff0c;它允程序在运行时(注意不是编译的时候)来进行自我检查并且对内部的成员进行操作。例如它允许一个java的类获取他所有的成员变量和…

巧解C语言运算符的优先级和结合性

本篇文章我们从一个例子入手讲解&#xff0c;请看下面的代码&#xff1a;#include int main(){ int a 16, b 4, c 2; int d a b * c; int e a / b * c; printf( "d%d, e%d\n", d, e); return 0; }运行结果&#xff1a;d24, e81) 对于表达式a b * c&#xff0…

jms mdb_MDB!= JMS,反之亦然

jms mdb基本 消息驱动Bean&#xff08;又称为MDB&#xff09;只是另一个EJB&#xff0c;例如无状态&#xff0c;有状态或单例。 使用MessageDriven批注指定。 MDB用于异步消息处理 它们与无状态EJB 相似 &#xff0c;因为它们都是由EJB容器池化的 但是&#xff0c;它们与无状…

C语言中的三目运算符是啥?有何用处?

一般来说&#xff0c;C语言中的三目运算符为a?b:c即有三个参与运算的量。由条件运算符组成条件表达式的一般形式为&#xff1a;表达式1? 表达式2&#xff1a;表达式3求值规则为&#xff1a;如果表达式1的值为真&#xff0c;则以表达式2 的值作为条件表达式的值&#xff0c;否…

status_code想要得到302却得到200_中考200天倒计时!教你高效规划!抓紧抢报预留座位!...

教育点击右上方蓝字关注金石教育金石教育青岛站推送青岛教育资讯&#xff0c;关注孩子成长关注教育主讲人——段莲1、金石教育首席学习规划师&#xff1a;在中考规划行业&#xff0c;段莲老师已经深入研究多年&#xff0c;了解最新的中考数据&#xff0c;并且能够把握住每个数据…

gui jfr_Java飞行记录器(JFR)

gui jfrJFR是一个Java分析器&#xff0c;它使您可以研究代码的运行时特征。 通常&#xff0c;您将使用探查器来确定代码的哪些部分导致大量内存分配或导致消耗过多的CPU。 有很多产品在那里。 过去&#xff0c;我使用过YourKit&#xff0c;OptimizeIt&#xff0c;JProfiler&am…

java 命名内部类_如何把java SWT程序中的匿名内部类改写成命名内部类?

展开全部//请看最后一个e69da5e6ba9062616964757a686964616f31333363386134private class ,其实命名内部类跟普通的java程序一样写&#xff0c;只要知道你自己的监听器要继承于哪个类&#xff0c;实现什么方法public class Level4Class extends ViewPart {private TableViewer …

C语言 | 递增运算符

如何灵活使用C语言递增运算符。 解题思路&#xff1a;自增运算符 使操作数的值加1&#xff0c;其操作数必须为可变左值&#xff08;可简单地理解为变量&#xff09;。对于自增就是加1这一点&#xff0c;读者应该不会有什么疑问。难点在于&#xff1a; 可以置于操作数前面&#…

数据结构实验之图论四:迷宫探索_迷宫搜索类的双向bfs问题(例题详解)

前言文章若有疏忽还请指正&#xff01;更多精彩还请关注公众号&#xff1a;bigsai头条号&#xff1a;一直码农一直爽在搜索问题中&#xff0c;以迷宫问题最具有代表性&#xff0c;无论是八皇后的回溯问题&#xff0c;还是dfs找出口&#xff0c;bfs找最短次数等等题目的问题。在…

ngrok服务器搭建_利用暴露在外的API,无法检测的Linux恶意软件将矛头指向Docker服务器...

K8s已经成为一线大厂分布式平台的标配技术。你是不是还在惆怅怎么掌握它&#xff1f;来这里&#xff0c;大型互联网公司一线工程师亲授&#xff0c;不来虚的&#xff0c;直接上手实战&#xff0c;3天时间带你搭建K8s平台&#xff0c;快速学会K8s&#xff0c;点击下方图片可了解…