2010-01-22 12 views
25

स्कैला में केस क्लासेस पैटर्न-मिलान, बराबर, ... के साथ बढ़ाए गए मानक वर्ग हैं (या मैं गलत हूं?)। इसके अलावा उन्हें अपने अनावश्यकता के लिए कोई "नया" कीवर्ड की आवश्यकता नहीं है। मुझे लगता है कि वे नियमित कक्षाओं से परिभाषित करने के लिए आसान हैं (या मैं फिर से गलत हूँ?)।जहां स्काला में वर्गों का उपयोग नहीं किया जाना चाहिए?

बहुत से वेब पेज बता रहे हैं कि उन्हें कहां इस्तेमाल किया जाना चाहिए (ज्यादातर पैटर्न मिलान के बारे में)। लेकिन उन्हें कहाँ से बचा जाना चाहिए? हम उन्हें हर जगह क्यों नहीं इस्तेमाल करते?

उत्तर

20

कई स्थानों पर जहां मामले कक्षाएं पर्याप्त नहीं हैं कर रहे हैं:

  • जब एक डेटा संरचना को छिपाने के लिए चाहता है।
  • दो या तीन से अधिक स्तरों के प्रकार पदानुक्रम के हिस्से के रूप में।
  • जब निर्माता को विशेष विचारों की आवश्यकता होती है।
  • जब निकालने वाले को विशेष विचारों की आवश्यकता होती है।
  • जब समानता और हैश कोड को विशेष विचारों की आवश्यकता होती है।

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

या, दूसरे शब्दों में, अधिक डिज़ाइन न करें।

16

केस कक्षाओं से विरासत समस्याग्रस्त है। मान लीजिए आप तो जैसे कोड है:

case class Person(name: String) { } 

case class Homeowner(address: String,override val name: String) 
    extends Person(name) { } 

scala> Person("John") == Homeowner("1 Main St","John") 
res0: Boolean = true 

scala> Homeowner("1 Main St","John") == Person("John") 
res1: Boolean = false 

शायद यह तुम क्या चाहते है, लेकिन आम तौर पर आप ख अगर और ख एक == ही अगर एक == चाहते हैं। दुर्भाग्यवश, संकलक स्वचालित रूप से आपके लिए यह ठीक से ठीक नहीं कर सकता है।

यह भी बदतर है क्योंकि Person("John") की hashCode Homeowner("1 Main St","John") की hashCode के समान नहीं है हो जाता है, तो अब के बराबर होती है अजीब और hashCode अजीब कार्य करता है कार्य करता है।

जब तक आप जानते हैं कि क्या उम्मीद करनी है, केस कक्षाओं से विरासत को समझने योग्य परिणाम दे सकते हैं, लेकिन इसे खराब रूप के रूप में देखा जा सकता है (और इस प्रकार 2.8 में बहिष्कृत किया गया है)।

+0

क्या आपके पास उल्लेख की गई बहिष्कृत सुविधा का लिंक है, कृपया? –

+2

Google पर "केस क्लास विरासत बहिष्कृत" खोजें और शीर्ष तीन हिट इस पर चर्चा करेंगे। बहिष्करण 2.8 कोडबेस में पहले से ही है - यदि आप रात का निर्माण डाउनलोड करते हैं तो आप इसे एक छोटे से उदाहरण के साथ आज़मा सकते हैं। –

0

यह केस कक्षाओं का उपयोग करने के लिए मोहक हो सकता है क्योंकि आप मुफ्त में स्ट्रिंग/बराबर/हैशकोड चाहते हैं। इससे समस्याएं पैदा हो सकती हैं, इसलिए ऐसा करने से बचें।

मेरी इच्छा है कि वहां एक एनोटेशन था जो आपको केस क्लास के बिना उन आसान चीजें प्राप्त करने देता है, लेकिन हो सकता है कि यह लगता है कि यह कठिन है।

+2

"समस्याएं पैदा कर सकते हैं"। क्या समस्या है? –

1

एक नकारात्मक पक्ष यह है कि Programming in Scala में बताया गया है है कि चीजें स्वचालित रूप से मामला वर्गों वस्तुओं सामान्य वर्गों के लिए की तुलना में बड़ा मिलता है, इसलिए यदि स्मृति क्षमता महत्वपूर्ण है, आप नियमित रूप से कक्षाओं में उपयोग करने के लिए चाहते हो सकता है के लिए उत्पन्न की वजह से।

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