どこでもヌル・ポインタデータが突然希薄であるため、
-
18-09-2019 - |
質問
誰かが完全なデータに頼ったコードを設計しました。 XMLは、常にすべての要素を持っていました。データソースは現在、まばらなXMLを送信しています。それは前に空になっているならば、それは今欠けています。だから、それはバグを固定してリファクタリングする時間です。
このようなコードの100+行があります
functionDoSomething(foo, bar, getRoot().getChild("1").getChild("A").
getChild("oo").getContent());
今除き、でGetChild( "A")はnullを返すことがあります。またはでGetChild(XXX)のいずれかの方法があります。
一つの追加のねじれ、代わりのでGetChild()のように、唯一の特定の順序で発生することができ、4つの別個の方法は、実際に存在します。誰かが悪い考えではありませんが、きれいとして、私が好むかもしれないと動作しません可変引数呼び出しを、提案します。
この1をクリーンアップする最も簡単な方法は何ですか?最高の?すべての行が示唆されたの周りに「/キャッチを試みる」、しかし男、それは醜いです。それ自身の機能の中に上記の方法の三番目の引数を断ち切ることは仕事ができる...それは100+いえそれほど、醜い感じている新しいメソッドを、必然的に伴うます。
でGetChild(XXX)コールの数が固定されていない深さで、どこか6およびライン当たり10の間です。このため、正しいDTDを取得するいかなる可能な方法もありません。物事がアップ前にヘッドずに後から追加され、私はそれが起こるログに警告を好む場合は、XMLで余分な行が正常に処理される必要があります。
アイデア?
でGetChild()は、実際に、便利な方法です。私が考えているクリーンな方法は、便利なメソッドが有効な子オブジェクトを返しますが、「空」子供のgetContent()は常に「」を返すことを持っていることです。
解決
あなたは(特別な子オブジェクトを返す)について説明すると、 NullObject のパターンの形であります、これが最善の解決策はここにある可能性があります。
他のヒント
この混乱するのではなく、XPathを使用することを検討してください。
ソリューションは、XML用のDTDファイルを使用することです。これは、Aが必須であるときにgetChild("A")
がnullを返しません、あなたのXMLファイルを検証します。
いかがます:
private Content getChildContent(Node root, String... path) {
Node target = root;
for ( String pathElement : path ) {
Node child = target.getChild(pathElement);
if ( child == null )
return null; // or whatever you should do
target = child;
}
return target.getContent();
}
として使用されます
functionDoSomething(foo, bar, getChildContent(root, "1", "A", "oo"));
あなたの問題は、設計上の問題が考えられます。法デメテルのの
あなたはhref="http://functionaljava.googlecode.com/svn/artifacts/2.20/javadoc/index.html" rel="nofollow noreferrer">オプションの種類オプションにでGetChildの戻り型を変更することの
for(Node r : getRoot())
for(Node c1 : r.getChild("1"))
for(Node c2: c1.getChild("A"))
return c2.getChild("oo")
このオプションは、反復処理可能を実装しているため、戻り値が定義されていないとき、それは中止されます動作します。これは、発現のために単一で発現させることができるためのScala similaryである。
1つの追加の利点は、あなたが にはnull値を返すことはありませんインターフェースを定義することができるということです。オプションのタイプを使用すると、戻り値は未定義であってもよいことインタフェース定義に述べることができ、クライアントはこれをどのように処理するかを決めることができます。
<時間>は、おそらく例えば、Eclipseを使用してコードをリファクタリングすることができ、それが自動的に同じに見えるすべての行を変更します。
、あなたが賢くする方法を変更することができる方法ではなく、個々の行を修正する