2012-02-08 17 views
6

मैं कुछ वर्गों को बचाने के लिए करना चाहते हैं और के बाद से एक्सएमएल-क्रमबद्धता मेरे मामले में यह काम नहीं चलेगा मैं एक xml-दस्तावेज़ में मैन्युअल रूप से मूल्यों की बचत कर रहा हूँ। ठीक काम करता है, लेकिन FxCop इसे पसंद नहीं करता है और चूंकि FxCop सामान्य रूप से अच्छी सलाह देता है और कारणों से मुझे चीजों को एक निश्चित तरीके से क्यों नहीं करना चाहिए, मैं इसे खुश रखने की कोशिश करता हूं।FxCop शिकायत: उजागर ठोस एक्सएमएल प्रकार और एक बुरी सुधार

इस बार, मुझे नहीं पता कि यह कैसे सुधार है।

यह मैं क्या था:

public void Save() 
{ 
     XmlDocument doc = new XmlDocument(); 
     XmlNode XmlNodeJob = doc.CreateElement("Job"); 
     doc.AppendChild(XmlNodeJob); 
     OtherclassSave2(XmlNodeJob);//Node as Parameter 
} 

public void OtherclassSave2(XmlNode node) 
{ 

} 

और यही FxCop शिकायत की है:। "संशोधित सदस्य 'OtherclassSave2 (XmlNode)' इसलिए इसमें ऐसी कोई ठोस प्रकार 'XmlNode' को उजागर करता है IXPathNavigable उपयोग एक्सएमएल डेटा स्रोतों का प्रतिनिधित्व करने के लिए। "

और अब मेरी भयानक समाधान:

public void Save() 
    { 
     XmlDocument doc = new XmlDocument(); 
     XmlNode XmlNodeJob = doc.CreateElement("Job"); 
     doc.AppendChild(XmlNodeJob); 
     OtherclassSave2(XmlNodeJob.CreateNavigator());//Interface from a node's navigator 
    } 

    public void OtherclassSave2(IXPathNavigable nav) 
    { 
     XmlNode node = (XmlNode)(nav.CreateNavigator().UnderlyingObject); 

    } 

इस तरह मैं अन्य विधि में मेरी नोड हो और FxCop खुश है, लेकिन मैं वास्तव में सुधार नहीं दिख रहा है और मैं एक की जरूरत है इसमें कुछ जोड़ने के लिए नोड, पढ़ने के लिए कुछ नहीं।

मैं हालांकि बारे में() एक XmlNode GetMeTheNode में शून्य SaveInThisNode (XmlNode) बदलते लेकिन CreateElements के माध्यम से नोड्स बनाने के लिए, मैं XmlDocument-वस्तु जो मैं एक पैरामीटर के रूप में उपयोग करने की अनुमति नहीं कर रहा हूँ की जरूरत है, लेकिन मैं कर सकता था हर कदम में नया एक्सएमएल दस्तावेज़ बनाएं, ठीक है।

मेरे समाधान सरल था और सब कुछ मैं इसे करना चाहता था के लिए ठीक काम किया, लेकिन FxCop समाधान है कि स्पष्ट रूप से नहीं बदतर और अधिक जटिल हैं अनुमति देने के लिए प्रतीत नहीं होता।

+0

मेरी समझ यह है कि आपको इसे लागू करने वाले वर्गों के बजाय उस इंटरफ़ेस के आसपास फेंकना होगा। बहुत आम अवधारणा। कभी-कभी यह चीजों को आसान बनाता है, दूसरी बार, इतना नहीं। यह उन "मेह" दिशानिर्देशों में से एक है। – Zenexer

+0

'एक्सएमएलएनओडी' लागू 'IXPathNavigable', y उत्तर देखें। आप चेतावनी को बहुत आसानी से ठीक कर सकते हैं। – ken2k

+0

मुझे लगता है कि आप अपनी समस्या को हल करने के लिए विधि को आंतरिक भी बना सकते हैं। –

उत्तर

2

यह केवल यह सुझाव दे रहा है कि आप विधि हस्ताक्षर में XmlNode के विशिष्ट कार्यान्वयन के साथ स्वयं को जोड़े नहीं हैं। यह आपको कक्षा का उपयोग कर कुछ भी प्रभावित किए बिना आंतरिक कार्यान्वयन को बदलने की अनुमति देता है।

यह सुझाव दिया जाता है कि यदि आपको ठोस वर्ग से विशिष्ट कार्यक्षमता की आवश्यकता है तो आप चेतावनी को अनदेखा कर सकते हैं। यदि यह एक सार्वजनिक सामना करने वाला एपीआई है तो आपको जितना संभव हो उतना deculple करने की कोशिश करनी चाहिए जो आपको विधि हस्ताक्षर बदलने की कम संभावना के साथ कार्यान्वयन को बदलने की स्वतंत्रता प्रदान करेगा और इस प्रकार एपीआई के उपभोक्ताओं को उनके कार्यान्वयन को बदलने के लिए मजबूर कर देगा।

CA1059: Members should not expose certain concrete types

+0

चूंकि मेरे और एक अन्य व्यक्ति मुझसे दो मीटर से भी कम दूर बैठे हैं, इसलिए इस विधि का उपयोग करके दुनिया में केवल एक ही व्यक्ति होगा, मैं केवल उस चेतावनी को अनदेखा कर दूंगा। धन्यवाद =) – Otterprinz

+0

मुझे सच में लगता है कि कंक्रीट वर्ग से विशिष्ट कार्यक्षमताओं का उपयोग किया गया था तो FxCop इस चेतावनी को नहीं फेंक दिया होगा। – ken2k

+0

@ ken2k मुझे लगता है कि आपका अधिकार है, मैंने इसे स्वयं नहीं किया है। – Bronumski

4

FxCop कह रही है कि आप इंटरफेस के बजाय इंटरफ़ेस के ठोस कार्यान्वयन का उपयोग करना चाहिए। यह शायद पाया है कि आपकी OtherclassSave2 विधि में पैरामीटर nav ठोस कार्यान्वयन निर्दिष्ट किए बिना एक IXPathNavigable के रूप में इस्तेमाल किया जा सकता है (केवल IXPathNavigable द्वारा उजागर सदस्यों उपयोग किया जाता है)।

XmlNode रूप IXPathNavigable लागू करता है, तो आप लिखने के लिए सक्षम होना चाहिए:

public void Save() 
{ 
     XmlDocument doc = new XmlDocument(); 
     XmlNode XmlNodeJob = doc.CreateElement("Job"); 
     doc.AppendChild(XmlNodeJob); 
     OtherclassSave2(XmlNodeJob); 
} 

public void OtherclassSave2(IXPathNavigable node) 
{ 
    // Deal with node using the interface only 
} 

बस स्पष्ट करने के लिए क्यों FxCop कह रही है कि, यहां मुद्दा FxCop का पता चला की सबसे आम उदाहरण है:

आप कहते हैं:

public int Sum(List<int> parameter) 
{ 
    int tmp = 0; 
    foreach (int i in parameter) 
    { 
     tmp += i; 
    } 

    return i; 
} 

List<int> lst = new List<int> {3, 4, 5}; 
int sum = Sum(lst); 

Sum कार्यान्वयन List<T> प्रकार के विशिष्ट तरीकों का उपयोग नहीं करता है, पैरामीटर के प्रकार को List<int> के रूप में सेट करना अच्छा नहीं है क्योंकि यह आपके Sum विधि के उपयोग को सीमित कर देगा। के रूप में Sum कार्यान्वयन केवल एक foreach उपयोग करें, यह लिखने के लिए प्राथमिकता दी जाती है:

public int Sum(IEnumerable<int> parameter) 
{ 
    int tmp = 0; 
    foreach (int i in parameter) 
    { 
     tmp += i; 
    } 

    return i; 
} 

ताकि आप अन्य प्रकार के Sum कॉल कर सकते हैं कि List<T>: ObservableCollection<T> ... आदि।

0

मैं LinqToXmlXElements का उपयोग कर वास्तव में किया गया था मैं कम FxCop और इंटरफ़ेस-मुसीबत के साथ एक अधिक सरल और अधिक शक्तिशाली तरीका में लिए देख रहा था हो पाया।

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