2011-04-24 52 views
14

斯卡拉允許導入幾乎任何你想要的,無論你想要的,這是偉大的。但是,在課堂,方法或任何塊中導入某些東西時,我是否應該考慮這些因素?它與性能,風格,代碼的可維護性等有什麼關係?Scala:我應該在哪裏放置導入語句?

一般來說,我試圖(通過自己配製)遵守這些規則:

  • 如果我輸入的東西從其他外部包,我總是將其放置在頂部只是「包裝」後。
  • 如果我在同一個文件中多次使用某些東西,我也會將它導入到頂部。
  • 否則,我把我的進口放在相關類/特質/對象的頂部。
  • 我避免在方法和塊中導入東西。
  • 我儘量避免導入實例對象的內容,除非我有一個很好的理由這樣做。
  • 我會避免重命名和「隱藏」,除非解決名稱衝突,但我從來沒有需要。

那些「規則」對你有意義嗎?我是否限制自己太多?

+0

相關:https://stackoverflow.com/questions/17029764/scala-import-statement-at-top-and-inside-scala-class – dskrvk 2016-04-12 01:32:59

回答

9

儘可能地將某些東西(例如變量或方法)的範圍限制爲「最少」通常是有意義的。例如,使用inner def而不是在課堂級別。爲什麼要導入語句有什麼不同?爲什麼要污染只在一個區塊中使用的進口產品?

我喜歡將導入聲明爲儘可能接近它們的位置!

這樣做的結果是,普通實用程序,像scalaz和我自己的庫都傾向於在頂層導入一次(因爲它們在整個課程中都被使用過)。而這樣的東西I/O被當地進口的,只有在它被用來

+0

這是一個很好的觀點。你是否區分第三方庫和「本地」代碼(例如,來自同一個包或項目)的進口? 「埋入」庫進口而不是將它們保持在最高位置是一個好主意,這樣任何人都可以輕鬆地說出依賴關係? – 2011-04-24 15:42:57

+0

請參閱編輯。我沒有區分。在實踐中,我發現頂級進口很少被使用。大多數IDE會在默認情況下摺疊它們 – 2011-04-24 16:25:24

+0

[off-topic] oxbow_lakes,我真的認爲我是世界上唯一一個在Scala上寫交易相關代碼的人:) 這兩者同時:令人失望 - 因爲我不是獨特的,因爲我認爲,並鼓勵 - 因爲斯卡拉不是那麼晦澀了:)) – 2011-04-24 16:30:52

2

我避免在導入方法和塊的東西。

爲什麼?

+0

只是因爲它*感覺*更好地有我的進口頂級。這正是我問這個問題的原因。我想知道其他人*感覺*(或事件更好 - *想*)關於進口的位置。 – 2011-04-24 14:02:31

+1

順便說一句,「否」是對「有意義」或「限制太多」這個問題的回答嗎? – 2011-04-24 14:06:31

+0

致:「他們有道理」。並且「能感覺到」嗎?這是想象力,而不是感覺。 – 2011-04-24 14:32:48

2

您應該記住,Scala仍然是編譯語言,適用於Java作爲編譯語言的所有規則也適用於Scala。當你說ListFunction時,編譯器應該知道你的意思是什麼。

您可以使用塊內導入語句但仔細使用它們。過度使用可能會導致其他人對源文件的理解不一致。如果單個類別邊界將使用取決於上下文的List的兩個不同定義將是不方便的。

+0

我知道過度使用導入的危險(或者更不方便)。事實上,我想知道,如果我對避免進口塊或方法過於謹慎。 – 2011-04-24 16:01:42

2

在有效斯卡拉import guidelines說:

認沽進口在文件

讀者可以參考的頂部到一個地方的所有進口。

在我使用過的一些代碼庫中,有一種趨勢是在同一個文件的多個位置多次導入相同的東西,因爲開發者沒有檢查這個。如果IDE可以檢測到它們的多個實例,IDE會自動提升塊級別的輸入,但AFAIK(我使用IntelliJ)並不這樣做。

大型文件時,很多人往往只看到當地的一段代碼,讓他們可以在本地進口的東西,與包的其他地區的衝突(例如,在一個類Promisescala.concurrent進口,並在另一個來自akka.dispatch),並且當您將進口灑滿整個地方時很難察覺到這一點。

這可能與您的特定代碼庫相關,也可能不相關,但我個人傾向於對我維護的代碼(熵和所有這些)持悲觀態度,因此嘗試從一開始就制定規則以確保可維護性長跑。

編輯:刪除了對ScalaStyle的BlockImportChecker rule的引用,這是不相關的。

+0

我同意你寫的第一部分。關於第二個 - 他們實際上是在尋找一個不同的野獸。如果你在第一行這樣做:'import scala。{util,math,io}',你將會合並衝突,並且人們開始在這個「塊」導入中添加/刪除東西。 – VasyaNovikov 2016-04-10 09:53:07

+0

你是對的,雖然他們沒有解釋這個檢查在文檔中的確切含義。 [source](https://github.com/scalastyle/scalastyle/blob/master/src/main/scala/org/scalastyle/scalariform/BlockImportChecker.scala)確認了你的意思。 – dskrvk 2016-04-12 01:41:14

2

將導入置於文件頂部。

讓他們分散在一個文件就更難閱讀代碼:

  • 他們傳達沒有邏輯意義,它們僅僅是一個別名;因此,它們「污染」反映該計劃邏輯方面的代碼。
  • 人們不能指望在哪裏找到他們(這是約定的目的)。
  • 在對具有相同名稱但名稱空間不同的實體具有多個引用的文件中,很難跟蹤每個作用域中的名稱引用。

我沒有看到將它們放在最接近的範圍旁邊沒有任何好處。實際上,有了這個推理,人們根本不應該使用它們;相反,應該總是爲每個引用的實體使用完整的名稱空間。這有任何意義嗎?恕我直言,不。