Şu anda Scala ile deneme ve en iyi uygulamaları arıyorum. Tek bir problemi çözmek için kendime iki zıt yaklaşımın olduğunu buldum. Hangisinin daha iyi olduğunu ve neden daha konvansiyonel olduğunu bilmek isterdim ve belki başka bazı daha iyi yaklaşımları biliyor olsaydınız. İkincisi bana daha güzel görünüyor.Scala En İyi Uygulama: Trait Inheritance - Enumeration
1. Sayım tabanlı çözüm
import org.squeryl.internals.DatabaseAdapter
import org.squeryl.adapters.{H2Adapter, MySQLAdapter, PostgreSqlAdapter}
import java.sql.Driver
object DBType extends Enumeration {
val MySql, PostgreSql, H2 = Value
def fromUrl(url: String) = {
url match {
case u if u.startsWith("jdbc:mysql:") => Some(MySql)
case u if u.startsWith("jdbc:postgresql:") => Some(PostgreSql)
case u if u.startsWith("jdbc:h2:") => Some(H2)
case _ => None
}
}
}
case class DBType(typ: DBType) {
lazy val driver: Driver = {
val name = typ match {
case DBType.MySql => "com.mysql.jdbc.Driver"
case DBType.PostgreSql => "org.postgresql.Driver"
case DBType.H2 => "org.h2.Driver"
}
Class.forName(name).newInstance().asInstanceOf[Driver]
}
lazy val adapter: DatabaseAdapter = {
typ match {
case DBType.MySql => new MySQLAdapter
case DBType.PostgreSql => new PostgreSqlAdapter
case DBType.H2 => new H2Adapter
}
}
}
2. Singleton tabanlı çözüm
import org.squeryl.internals.DatabaseAdapter
import org.squeryl.adapters.{H2Adapter, MySQLAdapter, PostgreSqlAdapter}
import java.sql.Driver
trait DBType {
def driver: Driver
def adapter: DatabaseAdapter
}
object DBType {
object MySql extends DBType {
lazy val driver = Class.forName("com.mysql.jdbc.Driver").newInstance().asInstanceOf[Driver]
lazy val adapter = new MySQLAdapter
}
object PostgreSql extends DBType {
lazy val driver = Class.forName("org.postgresql.Driver").newInstance().asInstanceOf[Driver]
lazy val adapter = new PostgreSqlAdapter
}
object H2 extends DBType {
lazy val driver = Class.forName("org.h2.Driver").newInstance().asInstanceOf[Driver]
lazy val adapter = new H2Adapter
}
def fromUrl(url: String) = {
url match {
case u if u.startsWith("jdbc:mysql:") => Some(MySql)
case u if u.startsWith("jdbc:postgresql:") => Some(PostgreSql)
case u if u.startsWith("jdbc:h2:") => Some(H2)
case _ => None
}
}
}
Tamamen katılıyorum. Scala numaralandırmalar kesinlikle işe yaramaz. Sadece birinin ihtiyaç duyduğundan şüphelenen sıralı değerlerin otomatik üretimini sağlıyorlar. Aksine, dize kimliği ile bir değer aramak için iyi bir yol (yansıma altında kullanılmaktadır) bulunmaktadır ve Numaralama # Değerinden Numaralama çözmek için hiçbir yasal yolu yoktur. –