2012-02-08 22 views
6

私は特定のクラスを保存したいと思いますし、xml-serializationは私のケースではそれをしません。うまく動作しますが、FxCopはそれを好きではありません.FxCopは通常、適切なアドバイスと理由を提供しています。FxCopクレーム:公開されたコンクリートXMLタイプと悪い改善

今回は、これがどのように改良されているのか分かりません。

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のは不満です::

この

は私が持っていたものである。 「それはもはや具体的な型 'のXmlNode' を公開するように、メンバーのOtherclassSave2(XmlNodeの) 'を変更していない使用IXPathNavigable XMLデータソースを表現することができます。

そして今、私の素晴らしい解決策:

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オブジェクトを必要とするが、約

でも、私は私ができましたすべてのステップで新しいXmlDocumentsを作成してください。

私のソリューションはシンプルで、私がやりたかったすべての作業にはうまく機能しましたが、FxCopでは明らかに悪くて複雑ではない解決策がないようです。

+0

私が理解していることは、あなたがそれを実装するクラスではなく、そのインタフェースを捨てることになっていることです。かなり一般的な概念。時には、物事が楽になります。それはそれらの "meh"ガイドラインの1つです。 – Zenexer

+0

'XmlNode'は' IXPathNavigable'を実装しています、y答えを見てください。あなたは非常に簡単に警告を修正することができます。 – ken2k

+0

あなたの問題を解決するためにメソッドを内部にすることもできます。 –

答えて

2

メソッドシグネチャでXmlNodeの特定の実装に自分自身を関連付けることはお勧めできません。これにより、クラスの使用に影響を与えずに内部実装を変更することができます。

具体的なクラスの特定の機能が必要な場合は、警告を無視することをお勧めします。これが公開APIである場合は、できるだけデカップリングして、実装方法を変更してメソッドシグネチャを変更し、APIのコンシューマに実装を変更させる自由を与えるようにしてください。

CA1059: Members should not expose certain concrete types

+0

私から2メートルも離れて座っている私と他の人が、この方法を使っている世界で唯一の人なので、私はその警告を無視します。ありがとう=) – Otterprinz

+0

具体的なクラスの特定の機能が使用されていた場合、FxCopはこの警告をスローしなかったと私は思っています。 – ken2k

+0

@ ken2k私はあなたの権利を考え、自分でそれを試していない。 – Bronumski

4

FxCopのは、インターフェイスの代わりに、インタフェースの具体的な実装を使用する必要がありますと言っています。 OtherclassSave2メソッドでは、具体的な実装(IXPathNavigableによって公開されているメンバーのみが使用されます)を指定せずに、navというパラメータを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のは、検出された問題の最も一般的な例であると言っている理由を明確にする:XmlNodeとして

は、あなたが書くことができる必要があり、IXPathNavigable実装

は、あなたが持っていると言う:

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実装が唯一foreachを使用すると、それは書くことが望ましいです:

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

    return i; 
} 

ので、あなたがList<T>ことを他のタイプのSumを呼び出すことができます。ObservableCollection<T> ...など。

0

私は正確に私はあまりFxCopのおよびインターフェイスのトラブルで、よりシンプルでより強力な方法で探していたたことをXElementsを使用してLinqToXmlを見つけました。

関連する問題