बनाम मैं वर्तमान में स्काला के साथ प्रयोग कर रहा हूँ और सर्वोत्तम प्रथाओं की तलाश में। मैंने खुद को एक समस्या को हल करने के लिए दो विपरीत दृष्टिकोण पाया। मैं जानना चाहता हूं कि कौन सा बेहतर है और क्यों, जो अधिक पारंपरिक है, और यदि आप कुछ अन्य बेहतर दृष्टिकोणों के बारे में जानते हैं। दूसरा मुझे सुंदर दिखता है।स्काला उत्तम आचरण: विशेषता विरासत गणन
1. गणन आधारित समाधान
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. सिंगलटन आधारित समाधान
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
}
}
}
मैं पूरी तरह से सहमत हूं। स्कैला गणना बिल्कुल बेकार हैं। वे केवल अनुक्रमिक मूल्यों की स्वत: पीढ़ी प्रदान करते हैं, जो मुझे संदेह है कि किसी को भी जरूरत है। इसके विपरीत, स्ट्रिंग आईडी द्वारा मूल्य को देखने का कोई अच्छा तरीका नहीं है (प्रतिबिंब नीचे नियोजित किया गया है) और गणना # मूल्य से गणना को हल करने का कोई कानूनी तरीका नहीं है। –