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

python kotlin_在Python,Java和Kotlin中标记参数和重载相关推荐

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

    在多种语言之间跳来跳去可以帮助您注意到不同语言的习惯用法和最佳做法之间的某些差异. 比较有趣的差异之一与一个函数执行多项操作有关. Python 我们先来看一下Python. Python实际上无法重 ...

  2. java从配置文件中读取参数

    java从配置文件中读取参数的方式 有的时候我们需要将一些固定的配置信息写到yml文件中去,然后在类中在读取 #首先就得先在yml文件中配置参数 upload:param:"test&quo ...

  3. android 国密签名,关于国密 (sm2,sm3,sm4)在Linux、python、Android、java、ios中的...

    国密即国家密码局认定的国产密码算法.主要有SM1,SM2,SM3,SM4和最新的sm9.在国内环境主要使用的国家密码局认定的算法. SM2算法:SM2椭圆曲线公钥密码算法是我国自主设计的公钥密码算法, ...

  4. python变量后面加星号_Python开发中关于参数使用的几点建议 -- 1

    减少使用位置参数 使用可选参数(*args)可以使方法看起来更清晰,减少视觉噪音.例如,你想要记录一些代码调试信息,如果使用固定参数,那么你的方法可能就像下面的示例一样接收两个参数: 如果你在调用这个 ...

  5. python如何调用参数配置文件_【Python学习笔记七】从配置文件中读取参数

    将一些需要经常更改的参数存放在配置文件中,通过读取配置文件来获取参数,这样修改以及使用起来比较方便 1.首先是配置文件的写法,如下一个environment.ini文件: a:里面"[]&q ...

  6. java 参数值_Java中的参数传值方式

    本文转载自 https://blog.csdn.net/SEU_Calvin/article/details/70089977 1.  你觉得下面程序会输出什么 public static void  ...

  7. c++ java setobjectarrayelement_Android jni中数组参数的传递方式

    1.背景 今天调试了一下Android jni关于Java中调用C代码的程序,发现我的数组参数传递方式不对,导致值传递不正确,我的方法是: C代码,入口函数 #include #include jin ...

  8. 关于抓java的dump中live参数

    我们经常需要查看内存中的一些变量的值,来定位生产环境的问题.一般会使用jmap来抓dump,在抓dump的时候,我们会把堆全部扒下来: jmap -dump:format=b,file=path pi ...

  9. Java获取URL中的参数

    先获取想要的字段 throws Exception {URL url = new URL("http://www.runoob.com/html/html-tutorial.html?id= ...

最新文章

  1. 青岛程序员加班看不上球赛崩溃,外卖小哥伸出援手:我帮你改代码
  2. Morphling:云原生部署 AI ,如何把降本做到极致?
  3. python 两点之间的距离_手把手教你HTML5实现根据LBS定位到商家两点之间距离多少...
  4. 成人高考 计算机英语作文,2017年成人高考英语作文范文
  5. SQL语句如何判断某字段是以字母开头而不是汉字开头
  6. Makefile--伪目标 (三)
  7. vi编辑器常用命令大全
  8. linux stm32 虚拟串口驱动安装,stm32usb虚拟串口驱动
  9. 图片怎么转文字?建议收藏这些方法
  10. (含代码)基于51最小系统的流水灯+焊接制作
  11. 什么是 Skype?
  12. 计算机英语教学设计反思,小学五年级英语教学设计与反思
  13. 《Python深度学习》第一部分读书笔记
  14. OAuth2.0实战
  15. 对OpenGL学习的记录
  16. php jquery实现弹窗,jquery+video实现点击播弹窗放视频功能
  17. 小程序-----小程序开发工具使用及流程文档说明
  18. 服务器虚拟化的作用是什么,什么是服务器虚拟化-vSphere Platnum-VMware虚拟化服务器 | VMware | CN...
  19. Whale 帷幄技术周大咖分享:AI 迎来大洗牌
  20. python文献检索_那个发了好几篇SCI的师姐,教你如何搞定文献检索和科研图片!...

热门文章

  1. P3308-[SDOI2014]LIS【最小割】
  2. ssl1213-多边形面积【差积,计算几何】
  3. 【2018.3.10】模拟赛之三-ssl2576 平台
  4. 【期望】期望分数(金牌导航 期望-4)
  5. Codeforces 235C
  6. Full_of_Boys训练4总结
  7. codeforces gym-101736 Dessert First Strategy 最小割
  8. 27、jdbc操作数据库(4)
  9. Unicode与UTF-8的区别
  10. 内存模型是怎么解决缓存一致性的