Tôi hiện đang thử nghiệm với Scala và tìm kiếm các phương pháp hay nhất. Tôi thấy mình có hai cách đối lập để giải quyết một vấn đề duy nhất. Tôi muốn biết cái nào tốt hơn và tại sao, đó là thông thường hơn, và nếu có thể bạn biết một số cách tiếp cận tốt hơn khác. Cái thứ hai trông đẹp hơn với tôi.Thực tiễn tốt nhất của Scala: Thừa kế thừa kế và liệt kê
1. Liệt kê dựa trên giải pháp
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. Giải pháp Singleton dựa trên
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
}
}
}
Tôi hoàn toàn đồng ý. Scala liệt kê là hoàn toàn vô dụng. Họ chỉ cung cấp tự động tạo ra các giá trị tuần tự, mà tôi nghi ngờ ai đó cần chút nào. Ngược lại, không có cách nào tốt để tìm kiếm một giá trị bằng id chuỗi (phản ánh được sử dụng bên dưới) và không có cách hợp pháp để giải quyết Enumeration từ Enumeration # Value. –