Scala的特征命名约定

Ala*_*ano 25 scala

假设我有一个traitScala

trait Connection {

  def init(name: String)
  def dispose
}
Run Code Online (Sandbox Code Playgroud)

我想创建一个实现它的类.但是我想把它命名为Connection:

class Connection extends Connection {
  // ....
 }
Run Code Online (Sandbox Code Playgroud)

它不会起作用.当然,我可以用trait不同的名字命名,但事实证明,Scala中的命名约定说我应该将trait命名为普通类,这意味着没有任何前缀,我将在C#中使用(IConnection其中 IConnection将是interface).

而在这种特殊情况下的名称Connectionclasstrait更适合.

或者我在Scala的命名约定中遗漏了什么?

Nik*_*kov 14

您将一般API提取到Connection特征本身的事实意味着它将具有多个特定实现.这些实现当然将与一些更具体的实体相关,例如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
    
    Run Code Online (Sandbox Code Playgroud)

  • 我认为选项1在实践中是最常见的.当您阅读代码时,选项2会令人困惑. (2认同)

小智 8

它不是一个约定,但scala.collection中使用的东西是后缀类似于traits:

  • SeqLike:Seq [A]类型序列的模板特征.
  • MapLike:地图的模板特征,它将键与值相关联.

等等.

我想这是他们说矩形/矩形的方式,这种关系(Seq/SeqLike)没有明确的命名.


Oll*_*liP 7

在Martin Odersky的书中,有一个带有Rectangle类的示例,它扩展了一个特性Rectangular和一个扩展特性Ordered的类Rational.因此,这里的模式似乎是使用形容名作为类名的主语.所以在你的情况下,它将是"类连接扩展连接".至少我喜欢这个,而不是"类ConnectionImpl扩展连接".

  • 也许Connection扩展了Connectable.它可能并不总是连接在一起. (6认同)

om-*_*nom 5

实现某些接口/特性的命名类的常见做法是将Impl添加为后缀(并且不要向接口/特征添加任何前缀/后缀):

class ConnectionImpl extends Connection {
  // ....
}
Run Code Online (Sandbox Code Playgroud)

为什么?因为在良好的代码中你可以编写针对接口的函数,所以你不会用我的函数来判断你的函数:

def sendThings(conn: Connection) {


}
Run Code Online (Sandbox Code Playgroud)

def sendThings(conn: IConnection) {


}
Run Code Online (Sandbox Code Playgroud)

如果你有多个实现,这当然应该是Connectiontrait,HttpConnectionclass1,JdbcConnectionclass2.

  • `HttpUtilImpl`,`UserImpl`,`CarImpl` ......?也就是说,我应该在我的代码中为每个类名添加`Impl`,即使没有类似名称的特征?根本不合理. (4认同)
  • 在他的书中,Martin Odersky有一个特征Rectangular的样本,其中一个Rectangle类扩展了特征Rectangular.我喜欢这个Rectangle-> Rectangular命名对.我想要的是一个命名约定,它是Rectangle-> Rectangular的泛化.但这很难找到.对我而言,Impl的解决方案很丑陋.我也不喜欢Java世界. (4认同)