मेरे पास C # में OOP के बारे में "सर्वोत्तम अभ्यास" सवाल है (लेकिन यह सभी भाषाओं पर लागू होता है)।
प्रॉपर्टी एक्सेसर के माध्यम से सार्वजनिक होने वाली वस्तु के साथ लाइब्रेरी क्लास होने पर विचार करें, लेकिन हम नहीं चाहते कि जनता (इस लाइब्रेरी क्लास का उपयोग करने वाले लोग) इसे बदलें।
class A
{
// Note: List is just example, I am interested in objects in general.
private List<string> _items = new List<string>() { "hello" }
public List<string> Items
{
get
{
// Option A (not read-only), can be modified from outside:
return _items;
// Option B (sort-of read-only):
return new List<string>( _items );
// Option C, must change return type to ReadOnlyCollection<string>
return new ReadOnlyCollection<string>( _items );
}
}
}
स्पष्ट रूप से सबसे अच्छा दृष्टिकोण "विकल्प सी" है, लेकिन बहुत कम वस्तुओं में ReadOnly संस्करण है (और निश्चित रूप से कोई उपयोगकर्ता-परिभाषित कक्षाएं नहीं हैं)।
यदि आप वर्ग A के उपयोगकर्ता थे, तो क्या आप परिवर्तनों की अपेक्षा करेंगे
List<string> someList = ( new A() ).Items;
मूल (ए) वस्तु के लिए प्रचार? या क्या किसी क्लोन को वापस करना ठीक है बशर्ते कि वह टिप्पणियों / प्रलेखन में ऐसा लिखा गया हो? मुझे लगता है कि इस क्लोन दृष्टिकोण से ट्रैक करने में काफी मुश्किल हो सकती है।
मुझे याद है कि C ++ में हम कास्ट ऑब्जेक्ट्स को वापस कर सकते हैं और आप केवल उस पर कॉन्स्ट के रूप में चिह्नित विधियों को कॉल कर सकते हैं। मुझे लगता है कि C # में ऐसा कोई फीचर / पैटर्न नहीं है? यदि नहीं, तो वे इसे शामिल क्यों नहीं करेंगे? मेरा मानना है कि इसे कांस्ट शुद्धता कहा जाता है।
लेकिन फिर मेरा मुख्य प्रश्न "आप क्या उम्मीद करेंगे" के बारे में है या विकल्प ए बनाम बी को कैसे संभालना है।