27

traitScalaに があるとします

trait Connection {

  def init(name: String)
  def dispose
}

そして、それを実装するクラスを作成したいと思います。しかし、私はそれを次のようにも名付けたいですConnection:

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

うまくいきません。もちろん、別の名前を付けることもできますが trait、Scala の命名規則では、trait は通常のクラスとして名前を付ける必要があることが判明しました。IConnectionIConnectioninterface

この特定のケースでは、Connectionforclassとthe の名前のtrait方が適切です。

それとも、Scala の命名規則で何かを見逃したのでしょうか?

4

4 に答える 4

16

一般的な 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
    
于 2013-06-15T09:52:25.013 に答える
9

これは慣習ではありませんが、scala.collection で使用されるものは、トレイトで使用される接尾辞のようなものです:

  • SeqLike : Seq[A] 型のシーケンスのテンプレート トレイト。
  • MapLike : キーと値を関連付けるマップのテンプレート トレイト。

等々。

この関係 (Seq/SeqLike) に明確な名前が付いていないのは、Rectangle/Rectangular の言い方だと思います。

于 2015-01-11T00:14:07.420 に答える
7

Martin Odersky の本には、トレイト Rectangular を拡張するクラス Rectangle とトレイト Ordered を拡張するクラス Rational のサンプルがあります。したがって、ここでのパターンは、特性名に形容詞を使用し、クラス名に主語を使用するようです。したがって、あなたの場合、「class Connection extends Connected」になります。少なくとも私はこれが「クラス ConnectionImpl が接続を拡張する」よりも好きです。

于 2013-08-08T14:39:34.307 に答える
5

いくつかのインターフェイス/特性を実装するクラスに名前を付けるための一般的な方法は、Impl を接尾辞として追加することです (インターフェイス/特性に接頭辞/接尾辞を追加しないでください)。

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

なんで?良いコードでは、 interfaces に対して関数を記述するため、関数をこれらの I で汚染することはありません。

def sendThings(conn: Connection) {


}

def sendThings(conn: IConnection) {


}

複数の実装がある場合、これはもちろん、Connectiontrait、HttpConnectionclass1、class2 である必要がありますJdbcConnection

于 2013-06-15T09:21:45.017 に答える