आप प्रभावी रूप से स्कैला में अपरिवर्तनीय संस्थाओं का उपयोग कर सकते हैं और उत्परिवर्तनीय क्षेत्रों के डरावने और म्यूटेबल राज्य से प्राप्त सभी बग से बच सकते हैं। अपरिवर्तनीय संस्थाओं का उपयोग करने से आपको समेकन में मदद मिलती है, इससे चीजों को और खराब नहीं होता है। आपका पिछला उत्परिवर्तनीय राज्य परिवर्तन का एक सेट बन जाएगा जो प्रत्येक परिवर्तन पर एक नया संदर्भ बनाएगा।
आपके आवेदन के एक निश्चित स्तर पर, हालांकि, आपको एक परिवर्तनीय स्थिति की आवश्यकता होगी, या आपका आवेदन बेकार होगा। विचार यह है कि आप इसे अपने प्रोग्राम तर्क में जितना कर सकते हैं उतना ही दबाएं। आइए बैंक खाते का एक उदाहरण लें, जो ब्याज दर और एटीएम वापसी या जमा के कारण बदल सकता है।
आप दो वैध दृष्टिकोण है:
आप तरीकों कि एक आंतरिक संपत्ति संशोधित कर सकते हैं बेनकाब और आप उन तरीकों पर संगामिति प्रबंधन (बहुत कुछ है, वास्तव में)
आप सभी वर्ग बनाने अपरिवर्तनीय और आप इसे "प्रबंधक" से घिराते हैं जो खाता बदल सकता है।
चूंकि पहला बहुत सरल है, मैं पहले विवरण दूंगा।
case class BankAccount(val balance:Double, val code:Int)
class BankAccountRef(private var bankAccount:BankAccount){
def withdraw(withdrawal) = {
bankAccount = bankAccount.copy(balance = bankAccount.balance - withdrawal)
bankAccount.balance
}
}
यह अच्छा है, लेकिन भगवान, तुम अब भी संगामिति के प्रबंधन के साथ फंस रहे हैं। खैर, स्कैला आपको इसके लिए एक समाधान प्रदान करता है। यहां समस्या यह है कि यदि आप अपने बैकग्राउंड नौकरी पर बैंककाउंटफ्रफ़ को अपना संदर्भ साझा करते हैं, तो आपको कॉल को सिंक्रनाइज़ करना होगा। समस्या यह है कि आप एक उपमहाद्वीप तरीके से समवर्ती कर रहे हैं।
संगामिति करने का इष्टतम तरीका: संदेश गुजर
क्या होगा अगर दूसरी तरफ, विभिन्न नौकरियों तरीकों सीधे BankAccount या एक BankAccountRef पर आह्वान नहीं कर सकते हैं, लेकिन सिर्फ उन्हें सूचित कि कुछ कार्यों की जरूरत है प्रदर्शन किया? खैर, तो आपके पास एक अभिनेता है, जो स्कैला में समवर्ती करने का पसंदीदा तरीका है।
class BankAccountActor(private var bankAccount:BankAccount) extends Actor {
def receive {
case BalanceRequest => sender ! Balance(bankAccount.balance)
case Withdraw(amount) => {
this.bankAccount = bankAccount.copy(balance = bankAccount.balance - amount)
}
case Deposit(amount) => {
this.bankAccount = bankAccount.copy(balance = bankAccount.balance + amount)
}
}
}
यह समाधान बड़े पैमाने पर अक्का दस्तावेज में वर्णित है: http://doc.akka.io/docs/akka/2.1.0/scala/actors.html। विचार यह है कि आप अपने मेलबॉक्स में संदेश भेजकर एक अभिनेता के साथ संवाद करते हैं, और उन संदेशों को रिसीवल के क्रम में संसाधित किया जाता है। इस तरह, इस मॉडल का उपयोग करते समय आपको कभी भी सहमति नहीं होगी।
आपको घटना सोर्सिंग इमो में देखना चाहिए, यह ओओपी के साथ डीडीडी के समान दृष्टिकोण प्राप्त करने का एक अच्छा तरीका है। –
https://www.manning.com/books/functional-and-reactive-domain-modeling पर एक नज़र डालें जो डीडीडी और एफपी को गठबंधन करने के तरीके को कवर करता है। देबाशीश में कुछ अच्छी प्रस्तुतियां भी हैं, उदाहरण के लिए: https://www.youtube.com/watch?v=U0Rk9Knq8Vk – Cal