在Python,Java和Kotlin中标记参数和重载

在多种语言之间跳来跳去可以帮助您注意到不同语言的习惯用法和最佳做法之间的某些差异。 比较有趣的差异之一与一个函数执行多项操作有关。

Python

我们先来看一下Python。 Python实际上无法重载,因为用相同的名称定义一个新的函数/方法只会覆盖前一个函数/方法。 因此,在Python中使用标志参数(布尔,枚举或“无”或“某物”参数)来表示稍微不同的行为是自然而惯用的,尤其是使用默认参数时。 默认参数使它特别有用,因为标志参数通常具有比其他参数频繁使用的值。

只有当有人调用该函数并仅传递硬编码的值时,这才真正成为问题。 这主要仅适用于布尔标志参数,但是当其名称/值不能自动显示上下文时,也可以将其应用于其他类型的标志参数。 例如,如下函数:

def lookUpPerson(id, cache_result):# looks up the person, caching the result if cache_result is Truereturn person

然后调用该函数,如下所示:

person = lookUpPerson(id, True)

当有人经过并阅读此行时,他们可能不知道或忘记了第二个参数是什么。 令人困惑。 幸运的是,在Python中,您可以使用命名参数并像下面这样调用函数:

person = lookUpPerson(id, cache_result=True)

这使得参数的目的容易得多。 他们在Python 3中做到了这一点,因此您可以制作仅称为关键字参数的参数。 这是一个好主意,因为通常应以这种方式一致地调用这些标志参数。 因此,应将函数更改为如下所示:

def lookUpPerson(id, *, cache_result):# looks up the person, caching the result if cache_result is Truereturn person

好的,现在它真的很不错,并且使用它始终会很清晰。

Java

现在,进入Java。 在Java中,使用标志参数被认为是非常糟糕的形式。 这样做有两个很好的理由:Java允许重载,但不允许命名参数。 如果没有命名参数,则先前的函数调用(现已转换为Java)将始终如下所示:

Person person = repo.lookUpPerson(id, false);

需要做一些实际工作才能使第二个参数完全清楚。 您可以在其中添加注释,也可以在名称定义名称的地方创建一个等于false的变量。 这两种方法都可以工作,但是用Java处理这种想法的标准,最佳实践方法是制作两种不同的方法:

public Person lookUpPerson(int id) {// looks up the personreturn person;
}public Person lookUpAndCachePerson(int id){// looks up and caches the personreturn person
}

可以在Python中完成,但通常不是惯用的方式。 这样做的好处是,它更清楚地说明了它的工作方式和工作方式。 不好的是,它通常会有点麻烦,尤其是当您通过添加更多标志来升级问题时。

混合起来

就我个人而言,我同意这两种观点,因为它们都是使用其自己的语言提供的绝佳解决方案。 有充分的理由让他们习惯自己所在的位置。 但我想稍微扩展一下Python的习惯用法。

Python的执行方式存在的问题是,根据定义,该函数执行的功能不止一件事,因为它有时做一件事,而在其他时候则做另一件事。 我想稍微改变一下习惯用法,以更好地遵循SRP(单一责任原则)。

您可以按原样保留当前的函数签名,但是实现被更改,并且弹出了另外两个函数。

def lookUpPerson(id, cache_result):if cache_result:return lookUpAndCachePerson(id)else:return simplePersonLookup(id)def lookUpAndCachePerson(id):# looks up and caches person# probably uses the next function for doing the lookupreturn persondef simpleLookUpPerson(id):# looks up the personreturn person

这给了我们什么? 如前所述,它使代码更好地遵循SRP。 lookUpPerson()仅负责选择要调用的哪个更精细的函数。 尽管lookUpAndCachePerson()显然具有两个职责,但您可以通过阅读其名称来了解其他两个功能的职责。 但是缓存实际上是一个潜在的副作用,并且总体而言,这可能不足以代表我的观点,因此,我太忙了,无法尝试思考不同的东西:)

这不仅为我们提供了更好的代码段,而且还为用户提供了一些在某些情况下更清晰的代码选项。 用户可以调用原始函数,甚至可以动态地提供关键字参数,或者可以通过调用分支函数之一来明确是否使用缓存。

那Kotlin呢?

最后,我们到达Kotlin。 Kotlin是一种有趣的野兽,并且是一门新语言(甚至在版本1上甚至还没有),它的某些部分还没有惯用的用法,这是到目前为止尚未定义的惯用法之一。 Kotlin可以提供关键字参数,并具有默认参数,但不能强制参数成为关键字参数。 此外,它确实支持重载。 但是,所有这一切的最大因素是Kotlin与Java完全可互操作,而Java无法使用关键字参数。

我提出对Python稍有改动的习惯用法的最大原因并不在于提出我们应该对Python进行的更改,不如我希望的那样,但更多的是介绍我的想法应该是Kotlin的成语。 每当有人在Kotlin中创建具有默认参数的函数或方法时,都应创建其他方法,最好是公共方法。

为什么,除了给出为什么要使用Python的原因之外? 由于Kotlin代码本来也可以从Java代码中调用,并且具有默认参数的Kotlin函数只是具有Java完整参数列表的函数,因此我们应该以不会让用户失望的方式编写Kotlin代码。 Java。 尽管,如果您确定自己的代码只能由Kotlin代码使用,那么我对遵循这套建议会宽容得多。

但是,在Kotlin中要记住一些事情:您应该避免使用重载来提供其他功能。 为了理解原因,让我给您看一个例子:

fun aFunction(x: Int, y: Int = 5): Int = x + y
fun aFunction(x: Int): Int = aFunction(x, 5)

定义了这两个函数后,提供了第二个函数,以便Java用户可以使用具有“默认”值的版本,当您执行此调用时会发生什么:

z = aFunction(2)

您会收到一个编译器错误。 关于调用哪个函数是模棱两可的。 当您尝试传递一个(Int)-> Int`参数的函数时,也会发生同样的事情。 因此,请避免此问题,并使您的辅助方法的名称与默认方法的名称不同。

奥托罗

这就是我本周的全部。 我真的很想听听对此的一些看法,尤其是有很好的例子来支持批评。 这只是关于统一的一些观察和一些想法。 现在该回到写我的书了。 谢谢阅读!

翻译自: https://www.javacodegeeks.com/2015/08/flag-parameters-and-overloading-in-python-java-and-kotlin.html

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

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

相关文章

vue 扫码页面限制区域_Vue.js 单页面多路由区域操作的实例详解

单页面多路由区域操作在一个页面中有两个及以上的区域,需要通过设置路由的index.js,来操作这些区域的内容app.vue 中设置:index.js中设置:import vue from vueimport router from vue-routerimport hello from /components/helloi…

Divide and conquer:Drying(POJ 3104)

烘干衣服 题目大意:主人公有一个烘干机,但是一次只能烘干一件衣服,每分钟失水k个单位的水量,自然烘干每分钟失水1个单位的水量(在烘干机不算自然烘干的那一个单位的水量),问你最少需要多长时间烘…

c#string倒数第二位插入字符_c#string倒数第二位插入字符_C#利用String类的IndexOf、LastIndexOf、...

一、String.IndexOfString.IndexOf 方法 (Char, Int32, Int32)报告指定字符在此实例中的第一个匹配项的索引(从0开始)。搜索从指定字符位置开始,并检查指定数量的字符位置。String.IndexOf(value, startIndex, count)参数value:要查找的 Unicode 字符。s…

使用所学的javaWeb知识,实现一个小型的记账管理系统

导读:控制过度消费通过记账,你会很清楚地知道自己的钱都用来做了什么,关于每分钱的去处心中都明明白白, 哪些是必要的开销,哪些是非理性的、应该避免的花费,分别占有多大的比例。有专家统计,个人 或者家庭的年节余比例要达到收人的40%才是正常的。参照这样的比例,对你找…

java小细节_为什么我喜欢Java的细节

java小细节他们说,Java太冗长了。 您可以找到Hello World程序的比较,这些程序在ruby中使用2行,在Java中使用10行,而要读取文件,您需要使用Java 20行和php中1行。 尽管示例经常被夸大(例如,计算导…

java 的 AccessController.doPrivileged使用

AccessController.doPrivileged意思是这个是特别的,不用做权限检查. 在什么地方会用到呢:加入1.jar中有类可以读取一个文件,现在我们要使用1.jar去做这个事情.但是我们的类本生是没有权限去读取那个文件的,一般情况下就是眼睁睁的看着了. 但是jiava提供了doPrivileged.在1.ja…

cordova 实现网页缓存_如何解决ionic,cordova混合开发的app缓存大的问题

如何解决ionic,cordova混合开发的app缓存大的问题关注:143 答案:2 mip版解决时间 2021-02-05 06:24提问者旧梦已过期2021-02-04 16:54如何解决ionic,cordova混合开发的app缓存大的问题最佳答案二级知识专家臸釪樶初2021-02-04 17:10可以试试sd卡挂在&a…

当年课设期末大作业,班主任让我们做一个新闻发布管理系统

导读:基于web的新闻发布及管理系统的设计与实现,是动态网页和数据库结合,通过事件来处理新闻。我们对最新信息的更新和发布需要比较及时,而动态交互网页能实现这些功能,新闻发布及管理系统就是一个能够在网上实现新闻的发布及管理,让人们更好的获取更新的新闻资讯。 随着电…

疫情期间,在家使用java的SSH框架实现一个简单的任务调度系统

导读:随着科学技术的飞速发展和各行各业的分工愈发明细化,对于改革传统的人工任务调度方式的呼声越来越大。得益于快速发展的计算机技术,我们看到了改革的方向。本系统是针对企业或者事业单位甚至一个小团队的任务调度而设计的,目的是改变传统的调度方式,通过计算机来计算…

你在乎的--世界在乎的

惊闻苍老师在某地做活动,距离公司不远,便蠢蠢欲动,招呼几个小伙伴一同前往。老师果然是全民偶像,人生导师,人气火爆,现场是人山人海,根本没有立足之地,后来听说,由于人太…

css3优惠卷上方锯齿_css3怎么实现锯齿边框?

白板的微信你这样的最好还是切图做用css3也达不到一毛一样的效果,如果你很想要尝试一下的话可以试试,不过边缘不是顺滑的感觉

改善Hibernate应用程序性能的7种方法

Hibernate是将Java Web应用程序与SQL数据库集成的好工具,但是当应用程序的响应时间开始显着增加时,我们应该怎么做? 当我们怀疑应用程序是否会随着客户群的增长而扩展时,我们该怎么办? 在花大价钱托管或重写代码之前&…

java网络爬虫技术也可以代替Python实现网络新闻分析系统

导读:自从大数据的概念被提出后,互联网数据成为了越来越多的科研单位进行数据挖掘的对象。网络新闻数据占据了互联网数据的半壁江山,相比传统媒体,其具有传播迅速、曝光时间短、含有网民舆论等相关特征,其蕴含的价值也愈来愈大。 利用相关网络爬虫技术与算法,实现网络媒体…

centos 服务器装与python34源码安装

http://www.111cn.net/sys/CentOS/63645.htm 1、CentOS安装Python的依赖包(不安装依赖包,会导致python安装不完整) yum groupinstall "Development tools"yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-…

CSDN:2020博客之星年度总评选大赛,趣味总结!

导读:从2020年正式写博客,第一次参加活动,竟然落选了,在此记录一下这个过程吧,方便找帖子链接,毕竟靠着本人的影响力还是能捞点饭票的,哈哈。 2020博客之星年度总评选活动地址:https…

Java 日期格式

转载于:https://www.cnblogs.com/bylion/p/5141022.html

java获取默认用户目录_Java获取当前路径

1、利用System.getProperty()函数获取当前路径:System.out.println(System.getProperty("user.dir"));//user.dir指定了当前的路径2、使用File提供的函数获取当前路径:File directory new File("");//设定为当前文件夹try{System.o…

zk框架_ZK Web框架思想

zk框架我曾多次被要求提出一些有关ZK的意见。 因此,根据我4年作为ZK用户的经验,有一些想法: 总体开发人员经验,社区和文档 “就是这样” ZK提供的大多数东西都能很好地工作,并且如果您以前开发过任何桌面Java应用程序…

一文教你用java实现出租车计价器设计(附下载源码)

导读:在我国,出租车行业是八十年代初兴起的一项新兴行业,随着出租车的产生,计价器也就应运而生。但当时在全国没有一家企业能够生产,因而那个时期的计价器是由台湾引进。台湾是计价器的主要生产场地,目前全…

写论文的思考

以下引自知乎的回答 需要的能力 1.资料检索的能力 2.资料筛选的能力 3.期刊论文的阅读能力,期刊论文和大学部的课本截然不同。大学部的课本是寻次渐进地从最基本的知识背景逐步交代出整套有系统的知识,中间没有任何的跳跃,只要你逐页读下去…