У меня есть некоторый код, который такой же, за исключением того, что определенная последовательность назначений происходит в несколько разных порядках.
Легко разделить это на параметр метода типа 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"]