开发网站如何赚钱html的基本结构
web/
2025/9/28 16:32:16/
文章来源:
开发网站如何赚钱,html的基本结构,页游平台排行榜,手机网站 怎么开发我曾经听说过#xff0c;过去人们为使方法具有单个出口点而奋斗。 我知道这是一种过时的方法#xff0c;从未认为它特别值得注意。 但是最近#xff0c;我与一些仍坚持该想法的开发人员进行了联系#xff08;最后一次是在这里 #xff09;#xff0c;这让我开始思考。 因… 我曾经听说过过去人们为使方法具有单个出口点而奋斗。 我知道这是一种过时的方法从未认为它特别值得注意。 但是最近我与一些仍坚持该想法的开发人员进行了联系最后一次是在这里 这让我开始思考。 因此我第一次真正坐下来比较了这两种方法。 总览 文章的第一部分将针对多个return语句重复参数。 它还将确定干净代码在评估这些论点中的关键作用。 第二部分将对得益于早日返回的情况进行分类。 为了不总是写“带有多个return语句的方法”我将这种方法称为通过模式构造方法的方法。 尽管这可能有些过头但肯定会更简洁。 讨论 我正在讨论一个方法是否应该始终运行到最后一行从那里返回结果还是可以有多个return语句并“尽早返回”。 这当然不是新的讨论。 参见例如Wikipedia Hacker Chick或StackOverflow 。 结构化程序设计 单个return语句是可取的想法源于1960年代开发的结构化编程范式。 关于子例程它提倡它们具有单个入口和单个出口点。 尽管现代编程语言可以保证前者但出于某些原因后者有些过时了。 单个出口点解决的主要问题是内存或资源泄漏。 当方法内部某处的return语句阻止执行位于其末尾的某些清除代码时就会发生这种情况。 如今其中大部分由语言运行时处理例如垃圾回收并且可以使用try-catch-finally编写显式清除块。 因此现在的讨论主要围绕可读性。 可读性 坚持单个return语句可能导致嵌套增加并需要其他变量例如中断循环。 另一方面使方法从多个点返回可能会导致其控制流程混乱从而使其难以维护。 重要的是要注意这两个方面在代码的整体质量方面有很大的不同。 考虑一种遵循简洁的编码准则的方法它简短且具有明确的名称和意图揭示结构。 通过引入更多的嵌套和更多的变量在可读性方面的相对损失非常明显并且可能使干净的结构混乱。 但是由于该方法的简洁性和形式使其易于理解因此忽略任何返回声明的风险不大。 因此即使存在不止一个控制流程仍然显而易见。 与较长的方法可能是复杂或优化算法的一部分进行对比。 现在情况逆转了。 该方法已经包含许多变量并且可能包含一些嵌套级别。 引入更多内容在可读性方面几乎没有相对成本。 但是忽视多个回报之一从而误解控制流程的风险是非常现实的。 因此问题在于方法是否简短易读。 如果是这样通常使用多个return语句是一种改进。 如果不是则最好使用单个return语句。 其他因素 但是可读性可能不是唯一的因素。 讨论的另一方面可以是日志记录。 如果要记录返回值但不求助于面向方面的编程则必须在方法的出口点手动插入记录语句。 使用多个return语句执行此操作很繁琐而忘记一个则很容易。 同样如果要在从方法返回之前声明结果的某些属性则可能希望使用单个退出点。 多个退货报表的情况 在几种情况下一种方法可以从多个返回语句中获利。 我试图在这里对它们进行分类但没有声称有完整的列表。 如果您遇到另一种重复出现的情况请发表评论我将在此附上。 每种情况都会附带一个代码示例。 请注意缩短了这些内容可以使观点更清楚并且可以通过多种方式进行改进。 由JDHancock在CC-BY 2.0下发布 警卫条款 保护子句位于方法的开头。 他们检查其参数并在某些特殊情况下立即返回结果。 防范条款无效或空集合 private SetT intersection(CollectionT first, CollectionT 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中equals或compareTo的常规实现。 它们通常还包含一系列检查其中每个检查都可以确定方法的结果。 如果是则立即返回该值否则该方法将继续进行下一个检查。 与单个return语句相比此模式不需要您跳过箍以防止更深的缩进。 它还使直接添加新的检查和在检查并返回块之前放置注释成为可能。 与分支一样多个return语句应仅应用于短而几乎没有其他作用的方法。 级联检查应该是它们的主要内容或者更好的是它们的唯一内容除了输入验证之外。 如果检查或返回值的计算需要两到三行以上则应将其重构为单独的方法。 正在搜寻 在存在数据结构的地方可以找到具有特殊条件的项目。 搜索它们的方法通常看起来很相似。 如果这种方法遇到了要搜索的项目则通常最容易立即返回它。 立即返回找到的元素 private T T findFirstIncreaseElement(IterableT 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
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/83427.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!