2012-02-08 29 views
6

Tôi muốn lưu một số lớp và vì xml-serialization sẽ không thực hiện trong trường hợp của tôi, tôi đang lưu các giá trị theo cách thủ công vào tài liệu xml. Hoạt động tốt, nhưng FxCop không thích nó và kể từ khi FxCop bình thường đưa ra lời khuyên tốt và lý do tại sao tôi không nên làm mọi thứ theo một cách nào đó tôi cố gắng giữ cho nó hạnh phúc.Khiếu nại FxCop: Các loại xml bê tông lộ ra và cải thiện xấu

Lần này, tôi không hiểu đây là cải tiến.

Đây là những gì tôi đã có:

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) 
{ 

} 

Và đây là những gì FxCop than phiền:. "Sửa đổi thành viên 'OtherclassSave2 (XmlNode)' để nó không còn thấy nhiều loại bê tông 'XmlNode' Use IXPathNavigable để đại diện cho các nguồn dữ liệu XML. "

Và bây giờ giải pháp tuyệt vời của tôi:

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); 

    } 

Bằng cách này tôi nhận được nút của tôi trong các phương pháp khác và FxCop là hạnh phúc, nhưng tôi thực sự không nhìn thấy sự cải thiện và tôi cần một nút để thêm những thứ trong đó, không phải cái gì để đọc.

tôi mặc dù về việc thay đổi khoảng trống SaveInThisNode (XmlNode) thành một XmlNode GetMeTheNode() nhưng để tạo ra các nút qua CreateElements, tôi cần XmlDocument đối tượng mà tôi không được phép sử dụng như một tham số, nhưng tôi có thể tạo các XmlDocuments mới trong mỗi bước, tốt.

Giải pháp của tôi rất đơn giản và hiệu quả cho mọi thứ tôi muốn, nhưng FxCop dường như không cho phép các giải pháp không rõ ràng tồi tệ và phức tạp hơn.

+0

Hiểu biết của tôi là bạn phải ném xung quanh giao diện đó thay vì các lớp triển khai giao diện đó. Khái niệm khá phổ biến. Đôi khi nó làm cho mọi thứ dễ dàng hơn, những lúc khác, không quá nhiều. Đó là một trong những nguyên tắc "meh" đó. – Zenexer

+0

'XmlNode' thực hiện' IXPathNavigable', xem câu trả lời y. Bạn có thể sửa cảnh báo rất dễ dàng. – ken2k

+0

Bạn cũng có thể làm cho phương pháp nội bộ để giải quyết vấn đề của bạn, tôi đoán vậy. –

Trả lời

2

Nó chỉ gợi ý rằng bạn không nên tự kết đôi với việc triển khai cụ thể của XmlNode trong chữ ký phương thức. Điều này cho phép bạn thay đổi việc triển khai thực hiện nội bộ mà không ảnh hưởng đến bất kỳ thứ gì sử dụng lớp.

Bạn nên bỏ qua cảnh báo nếu bạn cần chức năng cụ thể từ lớp cụ thể. Nếu đây là API đối mặt với công chúng, bạn nên cố gắng phân tích nhiều như bạn có thể để cho bạn tự do thay đổi triển khai với ít cơ hội thay đổi chữ ký phương thức và do đó buộc người tiêu dùng API thay đổi triển khai của họ.

CA1059: Members should not expose certain concrete types

+0

Vì tôi và một người khác ngồi cách tôi chưa đầy hai mét sẽ là người duy nhất trên thế giới sử dụng phương pháp đó, tôi sẽ chỉ bỏ qua cảnh báo đó. Cảm ơn bạn =) – Otterprinz

+0

Tôi thực sự nghĩ rằng FxCop sẽ không ném cảnh báo này nếu các chức năng cụ thể từ lớp bê tông được sử dụng. – ken2k

+0

@ ken2k Tôi nghĩ rằng quyền của bạn, chưa thử bản thân mình. – Bronumski

4

FxCop đang nói rằng bạn nên sử dụng giao diện thay vì thực hiện cụ thể của giao diện. Có thể phát hiện ra rằng trong phương pháp OtherclassSave2 của bạn, tham số nav có thể được sử dụng làm IXPathNavigable mà không chỉ định việc triển khai cụ thể (chỉ các thành viên được hiển thị bởi IXPathNavigable mới được sử dụng).

Như XmlNode thực hiện IXPathNavigable, bạn sẽ có thể viết:

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 
} 

Chỉ cần làm rõ lý do tại sao FxCop đang nói rằng, đây là ví dụ phổ biến hầu hết các vấn đề FxCop phát hiện:

Giả sử bạn có:

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); 

Khi triển khai Sum không sử dụng các phương pháp cụ thể của loại List<T>, bạn không nên đặt loại tham số là List<int> vì nó sẽ giới hạn mức sử dụng phương thức Sum của bạn. Như Sum thực hiện chỉ sử dụng một foreach, nó thích hợp hơn để viết:

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

    return i; 
} 

vì vậy bạn có thể gọi Sum với các loại khác mà List<T>: ObservableCollection<T> ... vv.

0

tôi thấy LinqToXml sử dụng XElements để được chính xác đã được tôi đang tìm kiếm một cách đơn giản hơn và mạnh hơn với ít FxCop và giao diện rắc rối.

Các vấn đề liên quan