2015-01-04 5 views
5

स्केल जैसे प्रोग्रामिंग भाषा में अपरिवर्तनीयता पर जोर देने के साथ ("var" से बचें), इसका मतलब है कि मेरे ऑब्जेक्ट में "राज्य-संशोधित विधियों" को उदाहरण की एक प्रति वापस करनी होगी (साथ नया राज्य)?अपरिवर्तनीयता (स्कैला में)

चलो कछुए पर विचार करें। मैं इस तरह मेरे कछुआ स्थानांतरित करना चाहते हैं:

val turtle = new Turtle(0, 0, "north") 
val turtle2 = turtle.turnLeft().forward(5).turnRight().backward(2) 

यहाँ turtle2 कछुए का एक ही उदाहरण (वे दो अलग अलग उदाहरणों रहे हैं) को इंगित नहीं होता। वास्तव में, आंदोलनों के उस अनुक्रम में 4 अंतरिम वस्तुओं का निर्माण किया गया था। यह मैं कैसे विधि turnLeft लागू करेगा, उदाहरण के लिए है:

def turnLeft { 
    self.copy(orientation = self.orientation match { 
    case "north" => "west" 
    case "east" => "north" 
    case "south" => "east" 
    case "west" => "south" 
    }) 
} 

कि एक सही डिजाइन दृष्टिकोण है?

यदि हां, तो कितना कुशल/अक्षम है (प्रत्येक विधि कॉल पर नई वस्तु का निर्माण)? यदि नहीं, तो सही क्या होगा? अपरिवर्तनीय पहलू (या शायद सामान्य रूप से कार्यात्मक प्रोग्रामिंग) की मेरी समझ में गलत/गायब क्या है?

अग्रिम धन्यवाद, राका

+0

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

+0

धन्यवाद, यह ध्यान देगा। –

उत्तर

9

बहुत सारे और अल्पकालिक वस्तुओं की बहुत सारी के निर्माण स्केला की एक बानगी सुविधा है। यह आमतौर पर बहुत महंगा नहीं होता है, बशर्ते आप इसे पर्याप्त रूप से आकार के ढेर के साथ एक जेवीएम पर चलाएं, जिसमें सभी मंथन को समायोजित करने के लिए पर्याप्त मात्रा में युवा पीढ़ी की स्मृति हो।

यह कहकर कि, अपरिवर्तनीयता एक धर्म नहीं है। सामान्य ज्ञान प्रबल होना चाहिए, और डिजाइन निर्णयों को मार्गदर्शन करना चाहिए जहां "प्रतिमान" पर चिपके रहना बहुत कर लग रहा है।

+0

प्रतिक्रिया के लिए धन्यवाद। मुझे इस दृष्टिकोण के साथ कोई फर्क नहीं पड़ता (अल्पकालिक वस्तुओं का निर्माण करने के लिए)। ... यह बस है ... मैन्युअल रूप से "self -opy (...)" को मेरे "राज्य-संशोधित" तरीकों पर बोझिल लग रहा है। क्या स्कैला में ऐसा करने का कोई बेहतर तरीका है (विधि के लिए विशेष एनोटेशन)? –

+0

अच्छी तरह से, 'कॉपी (foo = bar)' शायद foo = bar की तुलना में बहुत अधिक "cumersome" लगता है; इसे वापस करो, है ना? या क्या मैं कुछ न कुछ भूल रहा हूं? – Dima

1

मुझे लगता है कि यह मानना ​​महत्वपूर्ण है कि आप अपनी Turtle को एक इकाई के रूप में संभालना चाहते हैं या नहीं।

यदि मेरे पास कार है और मैं पहिया को सही करता हूं, तो कार सही हो जाती है (इष्टतम मामले में: पी), फिर मैं पहिया को बायीं ओर चला जाता हूं, और यह बायीं ओर जाता है, लेकिन यह अभी भी वही कार है। एक कछुए के लिए भी यही सच है। हालांकि अपरिवर्तनीयता आमतौर पर कार्यक्रमों को अधिक आसानी से समझने योग्य बनाती है, ऐसे मामले होते हैं जब यह कम सहज होता है।

इस बारे में सोचें कि सही शीर्षक और बाएं शीर्षक कछुए अलग हैं या नहीं। बेशक, समानता जांच को ओवरराइड किया जा सकता है, इसलिए यह एक सैद्धांतिक अंतर है कि पुराना और नया कछुआ (उसी नाम/आईडी के साथ) समानता या संदर्भित रूप से समान है।

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