Помогите с рефакторингом: ввести объект параметров? - PullRequest
0 голосов
/ 03 октября 2009

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

Легко разделить это на параметр метода типа int[], который обозначает порядок.

Однако я считаю, что это не самое ясное.

Другой вариант состоял в том, чтобы выделить их в объект типа AssignmentOrders. Я также могу выполнить проверку значений в конструкторе объектов, которые я не смог сделать с массивом. Это будет рефакторинг «Ввести объекты параметров» из книги, Рефакторинг .

Мне интересно, является ли этот конкретный рефакторинг излишним, и я должен просто придерживаться int[]?

КОД:

Три образца оригиналов:

private static PersonDetails parseLine(String line, String deliminator, int[] orderOfSections) 
            throws Exception {
        String[] sections = line.split(deliminator);

        String value1 = sections[0].trim();
        String value2 = sections[1].trim();
        String value3 = sections[4].trim();
        String value4 = sections[2].trim();
        String value5 = sections[3].trim();

        //........
    }

private static PersonDetails parseLine(String line, String deliminator) 
            throws Exception {
        String[] sections = line.split(deliminator);

        String value1 = sections[1].trim();
        String value2 = sections[0].trim();
        String value3 = sections[2].trim();
        String value4 = sections[3].trim();
        String value5 = sections[4].trim();

        //........
    }

private static PersonDetails parseLine(String line, String deliminator, int[] orderOfSections)


        throws Exception {
        String[] sections = line.split(deliminator);

        String value1 = sections[0].trim();
        String value2 = sections[1].trim();
        String value3 = sections[2].trim();
        String value4 = sections[4].trim();
        String value5 = sections[5].trim();

        //........
    }

Как я реорганизовал вышеупомянутые 3 в это:

private static PersonDetails parseLine(String line, String deliminator, int[] orderOfSections) 
            throws Exception {
        String[] sections = line.split(deliminator);

        String value1 = sections[orderOfSections[0]].trim();
        String value2 = sections[orderOfSections[1]].trim();
        String value3 = sections[orderOfSections[2]].trim();
        String value4 = sections[orderOfSections[3]].trim();
        String value5 = sections[orderOfSections[4]].trim();

        //........
    }

Как я могу теоретически преобразовать его в объект параметра:

private static PersonDetails parseLine(String line, String deliminator, OrderOfSections order) 
        throws Exception {
        String[] sections = line.split(deliminator);

        String value1 = sections[order.getValue1Idx].trim();
        String value2 = sections[order.getValue2Idx].trim();
        String value3 = sections[order.getValue3Idx].trim();
        String value4 = sections[order.getValue4Idx].trim();
        String value5 = sections[order.getValue5Idx].trim();

        //........
    }

То, о чем я думал, это создать определенный класс вместо использования int[] ... Но подумал, будет ли это излишним.

Преимущества в том, что он будет более читабельным. Вместо orderOfSections[0], это может быть orderOfSections.value1SectionIdx ... Я мог бы также добавить код проверки в класс.

Я полагаю, что это то, что Мартин Фаулер называет введением объекта параметров.

EDIT:

Другой вариант - использовать словарь. Легче, чем у нового класса, но более наглядно ... Тогда я мог бы использовать что-то вроде orderOfSections["value1"]

Ответы [ 2 ]

6 голосов
/ 03 октября 2009

Вместо передачи Class или массива, который просто указывает порядок элементов в необработанном String и как они должны быть назначены, я бы делегировал разбор ввода line этому Class , Было бы намного удобнее сделать следующее:

private static PersonDetails parseLine(String line, String deliminator, 
                         SectionsReader reader) throws Exception 
{
    reader.setLine(line);
    String value1 = reader.getValue1();
    String value2 = reader.getValue2();
    String value3 = reader.getValue3();
    String value4 = reader.getValue4();
    String value5 = reader.getValue5();

    //........
}

В конце концов, это не будет излишним, и через 3 месяца вы поблагодарите себя, когда вернетесь к этому коду и найдете его более понятным.

1 голос
/ 03 октября 2009

ИМХО, самый простой и читаемый способ - передать карту вместо массива int.

И в зависимости от того, как выглядят ваши поля для PersonDetails, вы можете даже использовать отражение и присваивать значения в цикле.

...