2011-06-14 50 views
3

我感到強烈的不適感觀看方法簽名時這樣的:Xml文檔不應該作爲String傳遞,如何激勵?

public void foo(String theXml); 

什麼會foo FO如果通過用UTF-16 XML聲明開頭的字符串? 在我看來,XML應該是一個強類型的XML,比如一個DOM樹或者一個字節數組。因此,FOO應當重新聲明爲:

public void foo(Byte[] theXml); 

通常,程序員會不必要地假設,當讀取theXml具有一定的編碼。通常只是希望文件庫的默認值能正確猜測。

我該如何激勵我的同事?

不兼容的文檔頭編碼聲明的動機太弱。 (使用強類型或字節數組會阻止對文檔進行天真的解析/修改。)我曾多次看到由於這種錯誤導致編碼中斷的情況。

回答

7

確保在您的測試套件中有一個測試,如果在字符串中錯誤地處理XML,將會失敗。如果解釋問題沒有動力,顯示它發生的可能...

+0

謝謝,這是一個很好的答案。我正在尋找一些更理論化的東西。甚至可能是哲學的。 – Hugo 2011-06-14 12:51:07

+0

我不確定這是否是一個理論問題;更實用一個。一些使用XML的西方開發人員最初對字符和編碼問題的複雜性存在盲點。處理具有「特殊」特徵的廣泛內容的內容強化了這些問題存在的觀點;從那裏開始有一些必須存在的方式來處理它們 - 從那裏解決方案就是了解這項技術...... – alexbrn 2011-06-14 13:02:15

6

傳遞XML作爲String沒有比錯過它作爲byte[] - 如果輸入已被解碼,您可以愉快地忽略解碼提示在處理指令中。您擔心對編碼做出不正確的假設,但如果使用字符串,則編碼不是問題,因爲您不必解碼任何內容。 (當然有人可能會從原始字節構造字符串,並在那個點做出不正確的假設,當然會是是一個問題。但是,如果你採取byte[]參數,某人可能已經有一個字符串並將其轉換。使用不正確的字符集字節)

解析字符串輸入並不比從像java.io.ReaderSystem.IO.TextReader解碼源解析輸入陌生人(大多數XML解析器讓你這樣做),這給我們帶來了另一個話題:我會建議不要將未解析的XML作爲字符串或字節數組一起傳遞 - 如果您使用InputStream(對於不知道編碼的源)和Reader s(如果您知道編碼,或者由於某種原因數據不需要解碼)。您還可以獲得整個文檔在解析之前不需要駐留在內存中的好處。

所以,與其這樣:

public void foo(String theXml); 
public void foo(byte[] theXml); 
// Usage: 
foo("<document />"); 
foo("<?xml version='1.0' encoding='UTF-8' ?><document />".getBytes("UTF-8")); 

...你必須:

public void foo(Reader source); 
public void foo(InputStream source); 
// Usage: 
foo(new StringReader("<document />")); 
foo(new ByteArrayInputStream("<?xml version='1.0' encoding='UTF-8' ?><document />" 
          .getBytes("UTF-8"))); 
0

我想這忽略編碼的重要性的將只是解決您的建議使用:foo(Encoding.Default.GetBytes(theString))。下一個可能會爲你的課程做一個包裝,以便他們可以再次使用string

我想在某些時候需要注意讓一些事情做得正確,並且保護那些不希望編寫正確代碼的人可能會在開始之前失去戰鬥。

就我個人而言,我實際上總是發現,我們在編碼數據流中聲明編碼有點奇怪。但這很理論。

0

我其實同意你的同事。除非你想要節省內存,但在調試時不可讀,那麼對此沒有什麼好的論點。編碼在被傳遞之前應該被檢查,不管類型。

如果你創建或使用包裝器,你可以爭辯說代碼更乾淨。

相關問題