[英]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#中使用( IConnection
將IConnection
作為interface
) 。
在這種特殊情況下, class
和trait
的Connection
名稱更合適。
或者我在Scala的命名約定中遺漏了什么?
您將一般API提取到Connection
trait本身的事實意味着它將具有多個特定實現。 這些實現當然將與一些更具體的實體相關,例如MySQL或H2數據庫。
根據您選擇的應用架構,有幾種方法可以解決您的問題:
如果將特定實現保留在同一名稱空間中,則會得到:
myApp.Connection
myApp.MySqlConnection
myApp.H2Connection
但實際上由於名稱冗余( *Connection
部分)而不鼓勵使用以上內容,建議引入新包,例如:
myApp.Connection
myApp.connections.MySql
myApp.connections.H2
要么
myApp.Connection
myApp.Connection.MySql
myApp.Connection.H2
如果您選擇將特定實現放在Connection
配對對象中。
在更高級的體系結構方法中,您將最終獲得具有私有包的特定實現:
myApp.Connection
myApp.mySql.Connection
myApp.h2.Connection
即使在這里,雖然你有Connection
名稱沖突,但由於類型通過使用限定引用( myApp.Connection
)或限定導入而位於不同的包中,因此它很容易解決:
import myApp.{Connection => GeneralConnection} //or IConnection if you insist
在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.