हाल ही में मैं अपने ऑब्जेक्ट मॉडल और उनके परिणामी परिस्थितियों और साइड इफेक्ट्स में पढ़ने-लिखने निर्भरता मुद्दों पर नाटकीय रूप से कटौती करने के लिए अपरिवर्तनीय वस्तुओं का लाभ उठा रहा हूं (अंततः कुछ कोड का उपयोग करने के लिए, अंततः कोड को सरल बनाने के लिए प्रबंधन (कार्यात्मक-प्रोग्रामिंग-एस्क्यू की तरह)।इंटरफेस का उपयोग करके पढ़ने और लिखने की चिंताओं को अलग करने का सबसे अच्छा तरीका?
इस अभ्यास ने मुझे केवल पढ़ने योग्य वस्तुओं को बनाने के लिए प्रेरित किया है जो निर्माण/निर्माण समय पर मूल्य प्रदान किए जाते हैं और फिर बाहरी कॉलर्स के लिए केवल संपत्ति प्राप्त करने के लिए सार्वजनिक गेटर्स उपलब्ध कराते हैं। संरक्षित, आंतरिक और निजी सेटर्स ऑब्जेक्ट मॉडल को लिखित रूप में आंतरिक नियंत्रण को बनाए रखने की अनुमति देते हैं।
इंटरफ़ेस बनाते समय मेरे ऑब्जेक्ट मॉडल पर एक एपीआई बनाते समय, मैंने अपरिवर्तनीयता के बारे में एक ही मुद्दे पर विचार करना शुरू कर दिया है। उदाहरण के लिए, मेरे इंटरफेस पर केवल सार्वजनिक गेटर्स प्रदान करके, और इसे सेटर्स पर निर्णय लेने और उस पहलू को संभालने के लिए कार्यान्वयन करने वालों को छोड़कर।
public interface IValuableItem {
decimal Amount {get;}
string Currency {get;}
}
हालांकि मैं सोच कैसे मैं एक प्रदान करना चाहिए करने के लिए मिल गया:
कार्यान्वयन है कि मैं के बारे में बात कर रहा हूँ के लिए एक "केवल पढ़ने के लिए" इंटरफेस का एक उदाहरण इस मूल्यवान मद (सिर्फ प्रदर्शन के लिए) है साथी इंटरफ़ेस जो लिखने की अनुमति देता है (और यदि मुझे चाहिए), और एक ही इंटरफेस के भीतर उन परिचालनों को गठबंधन न करें क्योंकि इसकी अपरिवर्तनीयता "दांत" न करें।
निम्नलिखित विचारों को ध्यान में रखा गया है, बस मेरे सिर के ऊपर से। जो मुझे लगता है उसे प्रदान किए बिना, प्रत्येक के लिए पेशेवर और विपक्ष हैं, आपको क्या लगता है कि सबसे अच्छा तरीका है? क्या इस अवधारणा के प्रबंधन के लिए उद्योग में एक कोडिंग पद्धति सामान्य है?
// companion writer
public interface IValuableModifier {
decimal Amount {set;}
string Currency {set;}
}
या
// explicit methods to enforce importance of or deviance in the programming
public interface IValuableModifier {
void SetAmount(decimal val);
void SetCurrency(string cur);
}
या
// companion writer that inherits the original interface
public interface IValuableModifier : IValuableItem { //...
या
// Let a concrete class choose one and/or the other.
class Concrete : IValuableModifer, IValuableItem { //...
या
आदि ..
मेरे अन्यथा अपरिवर्तनीय प्रोग्रामिंग मॉडल पर लिखने में मुझे और क्या मदद कर सकता है और इसे कम से कम लचीला रखने के लिए या कम से कम चिंताओं को बेहतर नियंत्रण के लिए अलग करने में मदद कर सकता है?
एक ऐसी कक्षा जिसमें 'सार्वजनिक' या 'संरक्षित' संपत्ति है जो केवल 'सेट' एक्सेसर प्रदान करती है, कोड विश्लेषण चेतावनी [CA1044: गुण केवल लिखना नहीं चाहिए] (https://msdn.microsoft.com/ en-us/पुस्तकालय/ms182165.aspx)। – DavidRR