2016-01-12 110 views

回答

13

UPD

在更新的編碼約定,有一個section on this topic

廠功能

如果要聲明一個類工廠功能,避免給它相同名稱作爲類本身。首選使用明確的名稱,明確爲什麼工廠功能的行爲是特殊的。只有在沒有特殊的語義時,纔可以使用與該類相同的名稱。

例子:

class Point(val x: Double, val y: Double) { 
    companion object { 
     fun fromPolar(angle: Double, radius: Double) = Point(...) 
    } 
} 

我下面所描述的動機,不過,似乎仍持有。


正如有關naming style文件說:

如有疑問默認的Java編碼約定,如:

  • 方法和屬性開始用小寫

一個強大的理由t Ø避免命名相同的一類功能是,它可能混淆開發誰以後會使用它,因爲,違背了他們的期望:

  • 功能將無法使用超級構造函數調用(如果類被open
  • 它不會通過反射
  • 構造可見它不能用作Java代碼構造(new HashSet(n, it -> "Element " + it)是錯誤的)
  • ,如果你想以後更改實施
  • 和反而會返回一些子類實例,它會變得更加令人困惑,即HashSet(n) { "Element $it" }將會升結構不是HashSet但是,例如LinkedHashSet

最好是明確的,這是一個工廠函數,而不是一個構造函數表現出來,爲了避免這種混亂。

在stdlib中通常也避免了爲一個類命名相同的功能。鑑於SomeClass,在stdlib中,工廠函數的首選命名方式是someClassOf,someClassBy或任何可以最好地解釋函數的語義。例子:

  • generateSequence { ... }sequenceOf(...)
  • lazy { ... }lazyOf(...)
  • compareBy { ... }
  • listOf(...)setOf(...)mapOf(...)

因此,人們非常需要有強有力的理由來有一個函數模仿構造函數。

相反,函數的名稱可能會告訴用戶更多(甚至是全部)關於它的用法。

+1

真的嗎?那麼現在二級構造函數比工廠函數更好?我認爲我們需要官方意見(在文檔中) – voddan

+1

@voddan,問題和答案不是關於次要構造函數,而是關於讓函數模仿構造函數。什麼是次要構造函數,當函數應該返回具有不同實現的子類實例時,它們是沒有用的。否則,它們似乎比工廠功能更好(反射,超級調用,Java互操作)。 – hotkey

+0

好吧,像類一樣命名的函數的唯一建議是在不溢出類代碼的情況下對這些類進行因式分解。另一種選擇是次要的構造函數,它在你的答案中隱含着。 – voddan

-2

我同意+熱鍵。在這種情況下最好避免混淆。

如果它只在內部使用,並且所有其他開發人員(如果有的話)都可以使用它,但是,我會說爲此付出努力。 Python承認這個想法,我喜歡它。哎呀,它們都是雙向的,如果你覺得它更像是一個函數,你也可以在函數的情況下命名一個類。但是,Python不必處理Java互操作,所以絕對不要爲公共代碼做這件事。

+2

我認爲我們不應該將其他語言的理想作爲「Kotlin最好的東西」的答案。內部代碼並沒有改變這樣一個事實,即它應該遵循整個行業的最佳實踐,除非有足夠的理由來區別。 –

+0

+ Jayson Minard首先,我想指出我基本同意。其次,我認爲與資本化有關的命名規則並不算真正的「最佳實踐」。例如,C#和Java幾乎是相同的語言,但具有不同的大寫約定。這些約定的原因純粹是爲了某些語言社區內的可讀性的一致性。所以,我堅持我說的話。如果每個閱讀該代碼的人都可以使用它,那麼它沒有任何問題。這與公司樣式表規定的任何其他慣例相同。 –

+0

這比關於大寫字母還要多一點。 –

相關問題