0

私はScalaを初めて使用し、Scalaの関数リテラル、高階関数などのサポートを使用して、このコードを何らかの方法でリファクタリングできるかどうか疑問に思っています。

大会とチームの間に関係がないので、これがどのように可能であるかわかりません。nameプロパティを含む特性をCompetitionandTeamに追加すると、それが可能になると思います。

他の選択肢はありますか?

class CompetitionDao extends BaseDao[Competition]{

  def retrieveAllCompetitionNames(): java.util.List[String] = {
    val competitions: java.util.List[_ <: Competition] = getDao().queryForAll()
    val competitionNames: java.util.List[String] = new ArrayList();
    for (competition <- competitions) competitionNames.add(competition.name)
    competitionNames
  } 

}

class TeamDao extends BaseDao[Team]{

  def retrieveAllTeamNames(): java.util.List[String] = {
    val teams: java.util.List[_ <: Team] = getDao().queryForAll()
    val teamNames: java.util.List[String] = new ArrayList();
    for (team <- teams) teamNames.add(team.name)
    teamNames
  }  
}
4

2 に答える 2

4

Enriqueが提案したように、を導入しtraitて使用することができます。map

import scala.collection.JavaConversions._

trait NameRetrieval[T <: { def name: String }] { self: BaseDao[T] =>
  def retrieveAllNames = getDao.queryForAll.map(_.name)
}

その後、次のように使用できます。

object TeamDao extends BaseDao[Team] with NameRetrieval[Team]

編集

これは、 typeと呼ばれる要素を持つすべてのタイプにトレイトを使用できること[T <: { def name:String }]を意味します。その表記法の詳細については、「Scala構造タイプ」を検索してください。NameRetrievalnameString

この特性は、と同じタイプのself: BaseDao[T]aと組み合わせてのみ使用できると私は言います。これにより、このメソッドが利用可能であることが確実にわかっているため、このメソッドを自由に使用できます。ケーキパターンにも同様のパターンが使われているので、詳しくはチェックしてみてください。BaseDaoTgetDao

于 2013-03-27T07:32:22.480 に答える
0

次のようなことを試すことができます:

object DAO{
  def getNames: String => List[String] = { from =>
    from match {
      case "competition" => Competition.getDao().queryForAll().map(_.name)
      case "team" => Team.getDao().queryForAll().map(_.name)
    }
  }

  ...
}

これを呼び出すのは簡単です

val temNames : List[String] = DAO.getNames("team")
于 2013-03-27T07:20:24.647 に答える