तो कहें कि मेरे पास मेरे ऐप में दो निर्भरताएं हैं, कुछ पब उप सिस्टम से कनेक्शन है, और डेटाबेस से कनेक्शन है। मैं की तरहस्कैला केक पैटर्न - क्या मेरे पास केक की कई परतें हो सकती हैं?
trait DB {
def lookup(query:String):String
}
trait PubSub {
def subscribe(key:String, callback:String => Any)
}
कुछ करना तो मैं जैसे
trait Functionality { this:DB with PubSub =>
def doSomething() {
val key = lookup("get key")
subscribe(key, data => println(data))
}
}
और फिर मेरा तर्क लिख सकते हैं मेरे ऐप की तरह
object Awesome extends App {
object repository extends Functionality with DB with PubSub {
def lookup(query:String) = "some key"
def subscribe(key:String, callback:String => Any) {
scala.concurrent.ops.spawn { while(true) { callback(key) ; Thread.Sleep(1000) } }
}
}
repository.doSomething()
}
हो सकता है और सब कुछ ठीक है और अच्छा दुनिया में है सकता है।
लेकिन अगर मैं दो पब सब सिस्टम से कनेक्शन चाहता हूं जो एक ही ऐप में समान डेटाबेस कार्यान्वयन साझा करते हैं?
मैं की तरह
object Awesome2 extends App {
object repository extends DB {
def lookup(query: String): String = "some other key"
object connection1 extends Functionality with PubSub with DB {
def subscribe(key: String, callback: (String) => Any) {
scala.concurrent.ops.spawn { while(true) { callback(key.toUpperCase) ; Thread.sleep(1000) } }
}
}
object connection2 extends Functionality with PubSub with DB {
def subscribe(key: String, callback: (String) => Any) {
scala.concurrent.ops.spawn { while(true) { callback(key.toLowerCase) ; Thread.sleep(1000) } }
}
}
}
}
जहां केक की दूसरी परत में वस्तुओं (परोक्ष?) माता-पिता के स्तर से डीबी कार्यान्वयन में slurp कुछ करना चाहता हूँ।
लेकिन स्केला संकलक मुझसे कहता है
error: object creation impossible, since method lookup in trait DB of type (query:String) String is not defined
object connection2 extends Functionality with PubSub with DB {
अगर मैं करता हूँ उसके बाद निम्न यह क्या मैं
object Awesome3 extends App {
object repository extends DB {
override def lookup(query: String): String = "some other key"
object connection1 extends Functionality with PubSub with DB {
def subscribe(key: String, callback: (String) => Any) {
scala.concurrent.ops.spawn { while(true) { callback(key.toUpperCase) ; Thread.sleep(1000) } }
}
def lookup(query: String): String = repository.lookup(query)
}
object connection2 extends Functionality with PubSub with DB {
def subscribe(key: String, callback: (String) => Any) {
scala.concurrent.ops.spawn { while(true) { callback(key.toLowerCase) ; Thread.sleep(1000) } }
}
def lookup(query: String): String = repository.lookup(query)
}
}
repository.connection1.doSomething()
repository.connection2.doSomething()
}
चाहते करती है, लेकिन इस तरह के गन्दा
मैं इस विशेषता जोड़ सकते हैं
trait DB_Base extends DB {
private val db:DB = this
trait DB_Layer extends DB {
def lookup(query:String):String = db.lookup(query)
}
}
और उसके बाद निम्नलिखित काम
object Awesome4 extends App {
object repository extends DB_Base {
override def lookup(query: String): String = "some other key"
object connection1 extends Functionality with PubSub with DB_Layer {
def subscribe(key: String, callback: (String) => Any) {
scala.concurrent.ops.spawn { while(true) { callback(key.toUpperCase) ; Thread.sleep(1000) } }
}
}
object connection2 extends Functionality with PubSub with DB_Layer {
def subscribe(key: String, callback: (String) => Any) {
scala.concurrent.ops.spawn { while(true) { callback(key.toLowerCase) ; Thread.sleep(1000) } }
}
}
}
repository.connection1.doSomething()
repository.connection2.doSomething()
}
तो अब मेरे पास दो परतें हैं। मैं तीन कैसे प्राप्त करूं? मुझे लगता है कि मैं साजिश खो रहा हूँ।
केक कैलोरी में उच्च है और उच्च ग्लाइसेमिक लोड है ... और क्या आपने कभी एक स्तरित केक में सामग्री की सूची देखी है? सरल, प्राकृतिक खाद्य पदार्थ पसंद करते हैं। यही है, सबसे अधिक एक परत वाला केक है, और किसी भी संसाधन को इंगित करने के लिए एक डीफ़ का उपयोग करें जिसे अन्यथा आपको जरूरी है। (यह एक टिप्पणी है क्योंकि यह वास्तव में आपकी समस्या का समाधान नहीं है, केवल एक सुझाव है कि यह अनावश्यक हो रहा है।) 'डीबीबीएएसई' को बढ़ाकर '{dbbase =>' जोड़ना और डीबी_लेयर के साथ 'ड्रॉप करना 'और' def dbLayer = dbbase' जोड़ना या कुछ स्पष्ट रूप से एक स्पष्ट अभी तक कॉम्पैक्ट विकल्प उत्पन्न करना। –
धन्यवाद रेक्स। मैं आपकी टिप्पणी से उलझन में हूँ। सबसे पहले, '{dbbase =>' वास्तव में क्या करता है? मैं उस वाक्यविन्यास से परिचित नहीं हूँ। और दूसरा, क्या परिणाम 'Awesome3' की तरह एक भयानक नहीं दिखेंगे? – dvmlls
@RexKerr सही है लेकिन मुझे नहीं लगता कि आप अतिरिक्त परतों के बिना अपना खुद का केक डी (जैसे ओपी प्रतीत होता है) कैसे रोल कर सकते हैं। उदाहरण के लिए, मान लें कि आप कुछ डीएओ केक सेंकना चाहते हैं। आपको डेटाबेस कनेक्शन (उत्पादन, चरण, परीक्षण), कनेक्शन प्रकार (जेएनडीआई, जेडीबीसी), और डीएओ अनुबंध को डीएओ लागू करने के लिए स्वयं को संभालने की आवश्यकता होगी। चूंकि हम ओपी प्रस्तुत करने के साथ देख सकते हैं, पैटर्न जटिल हो जाता है, जिससे सिर खरोंच हो जाता है ;-) फिर से, यह सुनिश्चित न करें कि कैसे आप खरगोश छेद नीचे जाकर स्कैला में केक डी कर सकते हैं – virtualeyes