मैं अपनी ताकत के कारण अपरिवर्तनीय "पैटर्न" से प्यार करता हूं, और अतीत में मैंने अपरिवर्तनीय डेटा प्रकार (कुछ, सबसे या यहां तक कि सभी) के साथ सिस्टम को डिजाइन करना फायदेमंद पाया है। अक्सर जब मैं ऐसा करता हूं, तो मैं खुद को कम बग लिखता हुआ पाता हूं और डिबगिंग बहुत आसान है।
हालांकि, मेरे साथी सामान्य रूप से अपरिवर्तनीय से दूर भागते हैं। वे बिल्कुल अनुभवहीन नहीं हैं (इससे बहुत दूर), फिर भी वे डेटा ऑब्जेक्ट्स को क्लासिक तरीके से लिखते हैं - निजी सदस्य और प्रत्येक सदस्य के लिए एक सेटर। तब आमतौर पर उनके निर्माता कोई तर्क नहीं लेते हैं, या शायद सुविधा के लिए कुछ तर्क देते हैं। तो अक्सर, एक वस्तु का निर्माण इस तरह होता है:
Foo a = new Foo();
a.setProperty1("asdf");
a.setProperty2("bcde");
शायद वे हर जगह ऐसा करते हैं। हो सकता है कि वे एक ऐसे कंस्ट्रक्टर को परिभाषित न करें जो उन दो तारों को लेता है, चाहे वे कितने भी महत्वपूर्ण क्यों न हों। और शायद वे बाद में उन तार के मूल्य को नहीं बदलते हैं और कभी भी आवश्यकता नहीं होती है। स्पष्ट रूप से अगर वे चीजें सही हैं, तो वस्तु को बेहतर रूप से अपरिवर्तनीय बनाया जाएगा, है ना? (कंस्ट्रक्टर दो गुणों को लेता है, कोई बसने वाला नहीं है)।
आप कैसे तय करते हैं कि किसी ऑब्जेक्ट प्रकार को अपरिवर्तनीय रूप में डिज़ाइन किया जाना चाहिए? क्या इसके द्वारा न्याय करने के लिए मापदंड का एक अच्छा सेट है?
मैं वर्तमान में इस बात पर बहस कर रहा हूं कि क्या अपने स्वयं के प्रोजेक्ट में कुछ डेटा प्रकारों को अपरिवर्तनीय करने के लिए स्विच करना है, लेकिन मुझे इसे अपने साथियों को औचित्य देना होगा, और प्रकारों में डेटा शायद ही कभी बदल सकता है - जिस समय आप निश्चित रूप से बदल सकते हैं यह अपरिवर्तनीय तरीका है (एक नया बनाएं, जो आप बदलना चाहते हैं, उसे छोड़कर पुरानी वस्तु से गुणों की नकल करें)। लेकिन मुझे यकीन नहीं है कि अगर यह केवल दिखावा करने वाले अपरिवर्तनीयों के लिए मेरा प्यार है, या अगर उनके लिए वास्तविक आवश्यकता / लाभ है।