10

私の Scala プロジェクトでは、ほとんどすべてのファイルに次のインポートがあります。

import eu.timepit.refined._
import eu.timepit.refined.api.Refined
import eu.timepit.refined.auto._
import eu.timepit.refined.numeric._

import spire.math._
import spire.implicits._

import com.wix.accord._
import com.wix.accord.dsl._

import codes.reactive.scalatime._

import better.files._

import java.time._

import scala.collection.mutable
...
...

ScalaでこれをDRYする最良の方法は何ですか? 自分のプロジェクト (ある種の sbt プラグインを使用) またはパッケージ レベルでそれらすべてを指定できますか?

4

2 に答える 2

7

あなたが探しているものをちょっと解決するいくつかのアプローチを見てきました。チェックアウト

インポートの定義

https://github.com/mongodb/casbah/blob/master/casbah-core/src/main/scala/Implicits.scala

このアプローチの小さな例:

object Imports extends Imports with commons.Imports with query.Imports with query.dsl.FluidQueryBarewordOps

object BaseImports extends BaseImports with commons.BaseImports with query.BaseImports

object TypeImports extends TypeImports with commons.TypeImports with query.TypeImports

trait Imports extends BaseImports with TypeImports with Implicits

@SuppressWarnings(Array("deprecation"))
trait BaseImports {
  // ...
  val WriteConcern = com.mongodb.casbah.WriteConcern
  // More here ...
}

trait TypeImports {
  // ...
  type WriteConcern = com.mongodb.WriteConcern
  // ... 
}

使用される輸入品

https://github.com/mongodb/casbah/blob/master/casbah-core/src/main/scala/MongoClient.scala

彼らがこのインポート オブジェクトを使用すると、すべてのタイプ エイリアスのロックが解除されます。例えば、WriteConcern

import com.mongodb.casbah.Imports._
// ...
def setWriteConcern(concern: WriteConcern): Unit = underlying.setWriteConcern(concern)

基本的に、すべてのインポートを共通の Import オブジェクトにラップしてから、 import com.mycompany.Imports._ を使用します。

Doobie は、ほとんどのエンドユーザーがちょうどimport doobie.imports._

https://github.com/tpolecat/doobie/blob/series/0.3.x/yax/core/src/main/scala/doobie/imports.scala

繰り返しますが、このパターンのサンプル:

object imports extends ToDoobieCatchSqlOps with ToDoobieCatchableOps {
  /**
   * Alias for `doobie.free.connection`.
   * @group Free Module Aliases
   */
  val FC   = doobie.free.connection

  /**
   * Alias for `doobie.free.statement`.
   * @group Free Module Aliases
   */
  val FS   = doobie.free.statement

  // More here ...
}

パッケージ オブジェクト スタイルとのこのアプローチの主な違いは、何をいつインポートするかをより詳細に制御できることです。私は両方のパターンを使用しました。通常は、内部パッケージ全体で必要になる共通のユーティリティ メソッドのパッケージ オブジェクトです。また、ライブラリ、特に私のコードのユーザーについては、doobie前述のように、単一のインポートを使用してユーザーの DSL 構文のロックを解除する特定の暗黙的な定義をインポート オブジェクトにアタッチできます。

于 2016-10-07T19:17:34.407 に答える