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
總結
以上是生活随笔為你收集整理的python kotlin_在Python,Java和Kotlin中标记参数和重载的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: dota笔记本配置?
- 下一篇: 游戏建模电脑配置推荐?