Question

Quelqu'un conçu code qui reposait sur des données complète; XML a toujours tous les éléments. La source de données envoie maintenant XML clairsemée; si elle aurait été vide avant, il manque maintenant. Alors, il est temps de revoir la conception tout en corrigeant des bogues.

Il y a plus de 100 lignes de code comme ceci:

functionDoSomething(foo, bar, getRoot().getChild("1").getChild("A").
    getChild("oo").getContent());

Sauf que maintenant, getChild ( "A") pourrait renvoyer nulle. Ou l'une des méthodes getChild (xxx) pourrait.

Comme une torsion supplémentaire, au lieu de getChild (), il y a en fait quatre méthodes distinctes, qui ne peut se produire dans certaines commandes. Quelqu'un a suggéré un appel varargs, ce qui est une mauvaise idée, mais ne fonctionnera pas aussi proprement que je pourrais vous.

Quelle est la meilleure façon de nettoyer ce un? Le meilleur? « Try / catch » autour de chaque ligne a été suggéré, mais l'homme, qui est laid. Briser le troisième argument à la méthode ci-dessus dans sa propre fonction pourrait fonctionner ... mais cela impliquerait 100+ de nouvelles méthodes, qui se sent laide, quoique moins.

Le nombre de getChild (xxx) appelle quelque part entre six et dix par ligne, sans profondeur fixe. Il y a aussi aucun moyen possible d'obtenir une DTD correcte pour cela; les choses seront ajoutés plus tard sans tête avant, et où je préfère un avertissement dans les journaux quand cela arrive, des lignes supplémentaires dans le fichier XML doivent être traités avec élégance.

Idées?

getChild () est une méthode pratique, en fait. La façon la plus propre je pense est d'avoir les méthodes pratiques retourner un objet enfant valide, mais avoir ce « vide » retourne toujours « enfant getContent () ».

Était-ce utile?

La solution

Qu'est-ce que vous avez décrit (retourner un objet enfant spécial) est une forme du motif NullObject , ce qui est probablement la meilleure solution ici.

Autres conseils

S'il vous plaît envisager d'utiliser XPATH au lieu de ce gâchis.

La solution est d'utiliser un fichier DTD XML. Il valide votre fichier XML afin getChild("A") ne reviendra pas nulle lorsque A est obligatoire.

Que diriez-vous:

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

}

à utiliser comme

functionDoSomething(foo, bar, getChildContent(root, "1", "A", "oo"));

Votre problème pourrait être un problème de conception. loi de Déméter

Sinon, vous pouvez utiliser quelque chose comme un Option changer le type de retour de getChild à l'option :

for(Node r : getRoot())
  for(Node c1 : r.getChild("1"))
    for(Node c2: c1.getChild("A"))
      return c2.getChild("oo")

Cela fonctionne parce que l'option Iterable implémente interrompra lorsqu'une valeur de retour n'est pas définie. Ceci est similairement à Scala où il peut être exprimé en une seule pour l'expression.

Un avantage supplémentaire est que vous pouvez définir des interfaces qui ne renvoyer une valeur NULL . Avec un type d'option, vous pouvez indiquer dans la définition de l'interface que la valeur de retour peut être définie et le client peut décider comment gérer cela.


S'il fore toujours à peu près le même niveau même, vous pouvez probablement factoriser le code en utilisant Eclipse, par exemple, et il va changer automatiquement chaque ligne qui a la même.

De cette façon, vous pouvez modifier la méthode pour être plus intelligent, plutôt que de modifier chaque ligne individuellement

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top