日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

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

發布時間:2023/12/3 python 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 在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

總結

以上是生活随笔為你收集整理的在Python,Java和Kotlin中标记参数和重载的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。