原則上,檔案應包含單一邏輯編譯單元。所謂「邏輯」是指類別、特質或物件。此準則的一個例外是具有伴隨物件的類別或特質。伴隨物件應與其對應的類別或特質分組在同一個檔案中。這些檔案應根據其包含的類別、特質或物件命名
package com.novell.coolness
class Inbox { ... }
// companion object
object Inbox { ... }
這些編譯單元應放置在 com/novell/coolness
目錄中的名為 Inbox.scala
的檔案中。簡而言之,儘管 Scala 在這方面允許更大的靈活性,但應優先考慮 Java 檔案命名和定位慣例。
多單元檔案
儘管上述說法,有些重要情況需要在單一檔案中包含多個編譯單元。一個常見的範例是密封特質和幾個子類別(通常模擬函數語言中可用的 ADT 語言功能)
sealed trait Option[+A]
case class Some[A](a: A) extends Option[A]
case object None extends Option[Nothing]
由於密封超級類別(和特質)的性質,所有子類型必須包含在同一個檔案中。因此,這種情況絕對符合應忽略單一單元檔案偏好的情況。
另一種情況是當多個類別在邏輯上形成一個單一的、有凝聚力的群組,共享概念,以至於將它們包含在單一檔案中對維護很有幫助。與上述密封超級類型例外情況相比,這些情況更難預測。一般來說,如果在單一檔案中對幾個單元執行長期維護和開發較容易,而不是分散在多個單元中,那麼應優先為這些類別採用這種組織策略。但是,請記住,當多個單元包含在單一檔案中時,在需要進行變更時,通常更難找到特定單元。
所有多單元檔案都應給予開頭為小寫字母的駝峰式名稱。這是一個非常重要的慣例。它區分了多單元檔案和單元檔案,大大簡化了尋找宣告的過程。這些檔案名稱可以基於它們包含的重要類型(例如上面範例的 option.scala
),或者可以描述其中所有單元共享的邏輯屬性(例如 ast.scala
)。