簡體   English   中英

Scala的特征命名約定

[英]Scala's naming convention for traits

假設我在Scala中有一個trait

trait Connection {

  def init(name: String)
  def dispose
}

我想創建一個實現它的類。 但是我想把它命名為Connection也是:

class Connection extends Connection {
  // ....
 }

它不會起作用。 當然,我可以用不同的方式命名trait ,但事實證明Scala中的命名約定說我應該將trait命名為普通類,這意味着沒有任何前綴,我將在C#中使用( IConnectionIConnection作為interface ) 。

在這種特殊情況下, classtraitConnection名稱更合適。

或者我在Scala的命名約定中遺漏了什么?

您將一般API提取到Connection trait本身的事實意味着它將具有多個特定實現。 這些實現當然將與一些更具體的實體相關,例如MySQL或H2數據庫。

根據您選擇的應用架構,有幾種方法可以解決您的問題:

  1. 如果將特定實現保留在同一名稱空間中,則會得到:

    • myApp.Connection

    • myApp.MySqlConnection

    • myApp.H2Connection

  2. 但實際上由於名稱冗余( *Connection部分)而不鼓勵使用以上內容,建議引入新包,例如:

    • myApp.Connection

    • myApp.connections.MySql

    • myApp.connections.H2

    要么

    • myApp.Connection

    • myApp.Connection.MySql

    • myApp.Connection.H2

    如果您選擇將特定實現放在Connection配對對象中。

  3. 在更高級的體系結構方法中,您將最終獲得具有私有包的特定實現:

    • myApp.Connection

    • myApp.mySql.Connection

    • myApp.h2.Connection

    即使在這里,雖然你有Connection名稱沖突,但由於類型通過使用限定引用( myApp.Connection )或限定導入而位於不同的包中,因此它很容易解決:

     import myApp.{Connection => GeneralConnection} //or IConnection if you insist 

它不是一個約定,但scala.collection中使用的東西是后綴類似於traits:

  • SeqLike :Seq [A]類型序列的模板特征。
  • MapLike :地圖的模板特征,它將鍵與值相關聯。

等等。

我想這是他們說矩形/矩形的方式,這種關系(Seq / SeqLike)沒有明確的命名。

在Martin Odersky的書中,有一個帶有Rectangle類的示例,它擴展了一個特性Rectangular和一個擴展特性Ordered的類Rational。 因此,這里的模式似乎是使用形容名作為類名的主語。 所以在你的情況下,它將是“類連接擴展連接”。 至少我喜歡這個,而不是“類ConnectionImpl擴展連接”。

實現某些接口/特性的命名類的常見做法是將Impl添加為后綴(並且不要向接口/特征添加任何前綴/后綴):

class ConnectionImpl extends Connection {
  // ....
}

為什么? 因為在良好的代碼中你可以編寫針對接口的函數 ,所以你不會用我的函數來判斷你的函數:

def sendThings(conn: Connection) {


}

def sendThings(conn: IConnection) {


}

如果你有多個實現,這當然應該是Connection trait, HttpConnection class1, JdbcConnection class2。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM