Нулевые указатели повсюду, потому что данные внезапно редки

StackOverflow https://stackoverflow.com/questions/1683698

Вопрос

Кто -то разработал код, который полагался на полные данные; У XML всегда был каждый элемент. Источник данных теперь отправляет редкий XML; Если бы это было пусто раньше, сейчас не хватает. Итак, пришло время рефакторировать при исправлении ошибок.

Таким образом, есть более 100 строк кода:

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

За исключением того, что GetChild («A») может вернуть NULL. Или любой из методов GetChild (XXX) может.

В качестве еще одного поворота вместо getChild () на самом деле есть четыре отдельных метода, которые могут возникнуть только в определенных порядках. Кто -то предложил, чтобы Вараргс звонил, что не плохая идея, но не будет работать настолько чисто, как мне понравилось.

Какой самый быстрый способ почистить это? Самый лучший? «Попробуйте/поймать» вокруг каждой линии было предложено, но чувак, это уродливо. Разрушение третьего аргумента при вышеуказанном методе в собственную функцию может работать ... но это повлечет за собой более 100 новых методов, которые кажутся некрасивыми, хотя и меньше.

Количество вызовов GetChild (xxx) составляет где -то от шести до десяти на строку, без фиксированной глубины. Там также нет возможного способа получить правильный DTD для этого; Вещи будут добавлены позже без предыдущих голов, и где я бы предпочел предупреждение в журналах, когда это произойдет, дополнительные строки в XML должны быть изящно обработаны.

Идеи?

GetChild () - это удобный метод, на самом деле. Самый чистый способ, которым я имею в виду, - это привести к тому, что методы удобства возвращают действительный дочерний объект, но иметь этот «пустой» ребенок getContent () всегда возвращается ».

Это было полезно?

Решение

То, что вы описали (возвращение специального дочернего объекта), является формой Nullobject шаблон, который, вероятно, является лучшим решением здесь.

Другие советы

Пожалуйста, рассмотрите возможность использования XPath вместо этого беспорядка.

Решение состоит в том, чтобы использовать DTD -файл для XML. Он проверяет ваш XML -файл, так что getChild("A") не вернется, когда является обязательным.

Как насчет:

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

Ваша проблема может быть проблемой дизайна: Закон Деметры.

Если нет, вы можете использовать что -то вроде Тип опции Изменение опции return типа GetChild наu003CNode> :

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

Это работает, потому что опция реализует итерабильно, он будет прервать, когда возвращаемое значение не будет определена. Это относится к Scala, где она может быть выражена в одном для выражения.

Еще одним преимуществом является то, что вы можете определить интерфейсы, которые будут Никогда не возвращайте нулевое значение. Анкет С помощью типа опции вы можете указать в определении интерфейса, что возвращаемое значение может быть неопределенным, и клиент может решить, как справиться с этим.


Если он всегда свернется примерно до того же уровня, вы, вероятно, сможете рефакторировать код, используя, например, Eclipse, и он автоматически изменит каждую строку, которая выглядит одинаковой.

Таким образом, вы можете изменить метод, чтобы быть умнее, а не изменять каждую строку индивидуально

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top