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

python 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

python kotlin

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

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

相关文章

python调用zabbixapi接口_python调用zabbix api获取主机信息

import requestsimport jsonheaders {Content-Type: application/json}class GetZabbix:def __init__(self):#用户信息self.username "****"self.password "****"self.url "http://192.168.0.*/zabbix/api_jsonrpc.php"self.token self.get…

C++17 常用新特性:带初始化的 if 和 switch 语句

点击蓝字关注我们因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络,侵删早在2016-03-14,Thomas Kppe 在https://wg21.link/p0305r0中就提出了在if和switch使用初始化语句,使用时的代码示例如下&…

python回归预测例子_案例实战 | 逻辑回归实现客户流失预测(附Python代码与源数据)...

关注一下~,更多商业数据分析案例等你来撩前言利用逻辑回归进行客户流失预警建模中涵盖了许多比较细的知识点,思维导图只展示了极小的一部分,相关知识点链接将穿插在文中。(源数据源代码空降文末获取)数据读入数据属性说明数据探索简洁版本&am…

latex中算法命令_比较Java 8中的命令式和功能性算法

latex中算法命令Mario Fusco受欢迎的推文令人印象深刻,显示了类似算法的命令性和功能性方法之间的主要区别实际上是: 势在必行–功能分离pic.twitter.com/G2cC6iBkDJ — Mario Fusco(mariofusco) 2015年3月1日 两种算法都做同样…

四大语言加强统治地位,Rust威胁C/C++

点击蓝字关注我们因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络,侵删TIOBE 公布了 2022 年 10 月的编程语言排行榜。截至今日,Python、Java、C 和 C 语言已经在 TIOBE 榜单的前 4 位盘踞了相当长的一段时…

sql计算留存_SQL无所不能:DBA宝妈宝爸系列分享

原文链接:https://www.modb.pro/db/22315 目前程序从功能上其实已经完全满足客户(当然我这里的客户都是指媳妇儿)需求,具体可参考:使用SQL计算宝宝每次吃奶的时间间隔 - Part1:分析函数的使用使用SQL计算宝宝每次吃奶的时间间隔 -…

java8流分组 性能_Java性能教程– Java 8流有多快?

java8流分组 性能在此JAX Magazine的预览预览中,JAX伦敦发言人Angelika Langer为使用Java流的任何人回答了最重要的问题:它们真的更快吗? Java 8是JDK收集框架的主要补充,即流​​API。 与集合相似,流表示元素序列。 …

对 int 变量赋值的操作是原子的吗?为什么?

点击蓝字关注我们因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络,侵删这个是在面试的时候遇到的问题,当时没有答出来。回到家以后查了查,整理记录下来。原问题:什么指令集支持原子…

C语言知识总结:if-else判断语句和switch-case选择语句

点击蓝字关注我们因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络,侵删1、if-else判断语句一个基本的if语句由一个关键字if开头,跟上在括号()里边的是表示逻辑条件的表达式&#xf…

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

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

python 坐标轴 单位刻度_Python学习笔记(matplotlib篇)--坐标轴刻度

python学习笔记--坐标轴刻度所用的库及环境:ide:pycharmpython环境:python3.7matplotlib: matplotlib 1.11numpy: numpy1.15.datetime :datetime坐标轴刻度概念当需要把x,y坐标轴刻度调整的更密集些或者更宽松点学习如何调整x&…

为什么永远不会有语言取代C/C++?

点击蓝字关注我们因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络,侵删数以百计的 C/C 替代品将会出现,但 C/C 将永远与我们同在!每个 CPU 都带有一种称为 ISA(指令集架构&#xff…

mwc校准油门_编写下载服务器。 第五部分:油门下载速度

mwc校准油门在僵尸网络时代,您可以租用几百美元来运行自己的分布式拒绝服务攻击,拥有紧急开关来有选择地关闭昂贵的功能或严重降低性能是一个巨大的胜利。 在缓解问题的同时,您的应用程序仍可运行。 当然,这种安全措施在高峰或工作…

sql 非主键每年自增_或许你不知道的 10 条 SQL 技巧

上文我们简述了 SQL 的一些进阶技巧,一些朋友觉得不过瘾,我们继续来下篇,再送你 10 个技巧一、 使用延迟查询优化 limit [offset], [rows]经常出现类似以下的 SQL 语句:SELECT * FROM film LIMIT 100000, 10offset 特别大!这是我司出现很多慢…

C语言最全入门笔记

点击蓝字关注我们因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络,侵删c语言入门C语言一经出现就以其功能丰富、表达能力强、灵活方便、应用面广等特点迅速在全世界普及和推广。C语言不但执行效率高而且可移植性好&am…

yolo v4 python_YOLOv4: Darknet 如何于 Ubuntu 编译,及使用 Python 接口

本文将介绍 YOLOv4 官方 Darknet 实现,如何于 Ubuntu 18.04 编译,及使用 Python 接口。主要内容有:准备基础环境: Nvidia Driver, CUDA, cuDNN, CMake, Python编译应用环境: OpenCV, Darknet用预训练模型进行推断&…

junit测试spring_使用Spring JUnit规则进行参数化集成测试

junit测试springSpring 4.2附带了全新的JUnit规则: SpringClassRule和SpringMethodRule 。 使用JUnit规则的主要优点是让开发人员摆脱SpringJUnit4ClassRunner并在Spring集成测试中利用不同的JUnit运行器。 我认为Spring JUnit Rules的最大机会是易于创建参数化的集…

不属于python的数据类型_下列________不是Python的数据类型。

【判断题】已知 x, y 3, 5,那么执行x, y y, x 之后,x的值为15。【多选题】Python 中对变量描述正确的选项是( )【单选题】字符串是一个连续的字符序列,用________方式打印出可以换行的字符串。【多选题】以下选项中,不符合 Python 语言变量命名规则的有( )【多选题】Python的…

无处不在_Java无处不在:使用DukeScript在任何地方运行一次编写

无处不在在相当长一段时间内,Java都未能兑现“一次编写,随处运行”的承诺。 DukeScript希望通过在跨平台应用程序中实现视图和逻辑的清晰分离来改变这种状况。 在本文中,一个简单的场景用于介绍DukeScript的基础。 多年以来,Java…

C语言为何不会过时

点击蓝字关注我们因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络,侵删评价任何一门编程语言,都是招人骂的。永远是这样。就像是春寒料峭的季节, 街上穿棉袄和穿单衣的擦肩而过,双方…