2016-02-07 8 views
33

लागू करने वाले लक्षणों के साथ स्कैला क्लाइंट संरचना मैंने स्कैला के साथ पढ़ा है, आमतौर पर इसे बेस क्लास का विस्तार करने के लिए सार कक्षाओं के बजाय लक्षणों का उपयोग करने की सलाह दी जाती है।एक अमूर्त वर्ग

क्या निम्न एक अच्छा डिजाइन पैटर्न और लेआउट है? क्या यह सार तत्वों को प्रतिस्थापित करने का इरादा था? (डीईएफ़ function1 साथ)

  • ग्राहक वर्ग
  • trait1 वर्ग (ओवरराइड function1)
  • trait2 वर्ग (ओवरराइड function1)
  • specificClient1 trait1 साथ ग्राहक फैली
  • specificClient2 ग्राहक trait2 साथ फैली

उत्तर

66

मुझे नहीं पता कि आपका स्रोत दावा के लिए क्या है कि आपको स्कैला में अमूर्त वर्गों पर विशेषताओं को प्राथमिकता देना चाहिए, लेकिन

  1. लक्षण जावा अनुकूलता को मुश्किल: फिर से कई कारणों से नहीं कर रहे हैं। यदि आपके पास किसी साथी ऑब्जेक्ट के साथ विशेषता है, तो जावा से साथी ऑब्जेक्ट पर कॉलिंग विधियों को विचित्र MyType$.MODULE$.myMethod सिंटैक्स की आवश्यकता होती है। यह साथी वस्तुओं के साथ अमूर्त वर्गों का मामला नहीं है, जो स्थिर और उदाहरण विधियों के साथ एक वर्ग के रूप में JVM पर लागू किए जाते हैं। जावा में कंक्रीट विधियों के साथ एक स्केल विशेषता को कार्यान्वित करना और भी अप्रिय है।
  2. एक विशेषता के साथ एक विधि को जोड़ना breaks binary compatibility एक वर्ग में ठोस तरीकों को जोड़ने के तरीके में नहीं है।
  3. लक्षणों के परिणामस्वरूप अधिक बाइटकोड और फॉरवर्डर विधियों के उपयोग से संबंधित कुछ अतिरिक्त ओवरहेड होते हैं।
  4. लक्षण अधिक शक्तिशाली हैं, जो कि खराब है-सामान्य रूप से आप कम से कम शक्तिशाली अमूर्तता का उपयोग करना चाहते हैं जो काम पूरा हो जाता है। यदि आपको कई विरासतों की आवश्यकता नहीं है जो वे समर्थन करते हैं (और अक्सर आप नहीं करते), तो बेहतर है कि इसका उपयोग न हो।

अंतिम कारण मेरे विचार में अब तक का सबसे महत्वपूर्ण कारण है। स्काला के भविष्य के संस्करणों में कम से कम कुछ अन्य मुद्दे might get fixed, लेकिन यह तब भी रहेगा जब कक्षाओं को डिफॉल्ट करना आपके कार्यक्रमों को ऐसे तरीकों से बाधित करेगा जो कम से कम डिजाइन के साथ संगत (कम से कम तर्कसंगत) हैं। यदि आप तय करते हैं कि वास्तव में आप वास्तव में गुणों द्वारा प्रदान की गई शक्ति चाहते हैं, तो वे अभी भी वहां होंगे, लेकिन यह आपके द्वारा तय किया जाने वाला निर्णय होगा, न कि आप जो कुछ भी फिसलते हैं।

इसलिए नहीं, अन्य जानकारी की अनुपस्थिति में, मैं एक अमूर्त वर्ग (आदर्श रूप से एक मुहरबंद) और दो ठोस वर्गों का उपयोग करने का सुझाव देना चाहता हूं जो कार्यान्वयन प्रदान करते हैं।

+2

फुटनोट के रूप में, स्केल के रैखिकरण के दृष्टिकोण का दृष्टिकोण एकाधिक विरासत की "समस्या" के लिए एक चालाक समाधान है, और जब आपको इसकी आवश्यकता होती है तो यह काफी अच्छी तरह से काम करता है (फ़ील्ड जैसी कुछ चीजों के अपवाद के साथ)। लेकिन आपको कभी भी कुछ उपयोग नहीं करना चाहिए क्योंकि यह चालाक है। –

+1

धन्यवाद, जो मेरे प्रश्न का उत्तर देता है। मेरा स्रोत https://www.safaribooksonline.com/library/view/scala-cookbook/9781449340292/ch04s13.html था। आपका उत्तर अधिक समझ में आता है हालांकि – kliew

+1

स्कैला [2.12] (http://www.scala-lang.org/news/2.12.0) के साथ # 1-3 अभी भी लागू होता है '' एक विशेषता सीधे सीधे संकलित करता है डिफ़ॉल्ट तरीकों के साथ एक इंटरफ़ेस। यह बाइनरी संगतता और जावा इंटरऑपरेबिलिटी में सुधार करता है। "'? बेशक # 4 एक 'विशेषता' पर 'अमूर्त वर्ग' चुनने के लिए पर्याप्त कारण है, मेरा मानना ​​है। @TravisBrown –

2

ओटीओएच, लक्षण आपको एक दानेदार फैशन में जटिल वस्तुओं की कार्यक्षमता का निर्माण और परीक्षण करने और विभिन्न तर्क प्रदान करने के लिए कोर तर्क का पुन: उपयोग करने की अनुमति देते हैं। उदाहरण के लिए, एक डेटा ऑब्जेक्ट को डेटा सर्वर पर तैनात किया जा सकता है, जो डेटाबेस पर बनी रहती है, जबकि एक वेब सर्वर डेटा सर्वर से अद्यतन किए गए उसी ऑब्जेक्ट के केवल-पढ़ने वाले संस्करणों को नियोजित कर सकता है।

प्रत्येक परिदृश्य के लिए कुछ भी उपयुक्त नहीं है। हाथ में कार्य के लिए सही निर्माण का प्रयोग करें। कभी-कभी कार्यान्वयन की वास्तविकता विशिष्ट उपयोग मामलों के लिए हल्के मुद्दों को लाती है जो डिजाइन समय पर अज्ञात थीं। अलग-अलग धारणाओं और संरचनाओं का उपयोग करके पुन: कार्यान्वित करने से आश्चर्यजनक परिणाम मिल सकते हैं।

संबंधित मुद्दे