Pregunta

Alguien código que se basó en datos completa diseñada; el XML siempre tenía todos los elementos. La fuente de datos está enviando XML escasa; si hubiera estado vacía antes, que le falta ahora. Por lo tanto, es hora de refactorizar mientras corrigiendo errores.

Hay más de 100 líneas de código como el siguiente:

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

Sólo que ahora, GetChild ( "A") podría devolver null. O cualquiera de los GetChild (xxx) métodos podrían.

Como un giro adicional, en lugar de GetChild (), en realidad hay cuatro métodos independientes, que sólo puede ocurrir en ciertos órdenes. Alguien sugirió una llamada varargs, que no es una mala idea, pero no funcionará tan limpiamente como me puede gustar.

¿Cuál es la forma más rápida de limpiar éste para arriba? ¿El mejor? "Try / catch" en torno a cada línea se sugirió, pero el hombre, eso es feo. Romper con el tercer argumento del método anterior en su propia función podría funcionar ... pero eso implicaría más de 100 nuevos métodos, que se siente fea, aunque en menor medida.

El número de GetChild (xxx) llama está en algún lugar entre seis y diez por línea, sin profundidad fija. Tampoco hay manera posible de obtener una DTD correcta para esto; cosas os serán añadidas más tarde sin un cabezas anteriores, y donde yo preferiría una advertencia en los registros Cuando esto sucede, las líneas adicionales en el XML deben ser manejados con gracia.

Las ideas?

GetChild () es un método de conveniencia, en realidad. La manera más limpia que tengo en mente es que los métodos de conveniencia devolver un objeto Niño válida, pero tienen que getContent "vacío" del niño () devuelve siempre ""

¿Fue útil?

Solución

Lo que usted describe (volviendo un objeto especial de niños) es una forma de la NullObject patrón , que es probablemente la mejor solución a este problema.

Otros consejos

Por favor, considere el uso de XPath en lugar de este lío.

La solución es utilizar un archivo DTD para XML. Se valida el archivo XML para getChild("A") no volverá nula cuando A es obligatorio.

¿Qué hay de:

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

}

para ser utilizado como

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

Su problema podría ser un problema de diseño:. Ley de Demeter

Si no se puede usar algo como un Tipo de Opción cambiar el tipo de retorno de GetChild a la Opción :

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

Esto funciona porque Opción implementa Iterable abortará cuando no se define un valor de retorno. Esto es similary a Scala donde puede ser expresado en una sola para la expresión.

Una ventaja adicional es que se puede definir interfaces que no devuelven un valor nulo . Con un tipo de opción puede indicar en la definición de interfaz que el valor de retorno puede ser indefinido y el cliente puede decidir cómo manejar esto.


Si siempre profundiza hasta llegar a aproximadamente el mismo mismo nivel, es probable que pueda refactorizar el código usando Eclipse, por ejemplo, y va a cambiar de forma automática cada línea que tiene el mismo aspecto.

De este modo puede modificar el método sea más inteligente, en lugar de modificar cada línea individual

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top