我有一些代码是相同的,只是某个分配顺序发生在略有不同的顺序。
很容易将其分解为int[]
类型的方法参数,它表示顺序。
然而,我发现它并不是最清楚的。
另一种选择是将它们分解为AssignmentOrders
类型的对象。我也可以对对象构造函数中的值进行验证,而这些值是我无法对数组进行的。这将是本书中的“引入参数对象”重构重构。
我想知道这种特殊的重构是否过度,我应该坚持使用int[]
?
CODE:
原件的三个样本:
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
...我还可以将一些验证代码放入类中。
我相信这就是Martin Fowler所说的引入参数对象。
编辑:
另一种选择是使用词典。比新课程更轻,但更具描述性...然后我可以使用像orderOfSections["value1"]
答案 0 :(得分:6)
我会委托解析输入{{1},而不是传入一个Class
或数组,它只是指示原始String
中项目的顺序以及它们应该如何分配。这个line
。执行以下操作会更具可读性:
Class
最后,这不会有点过分,你会在3个月后回到这段代码并发现它更容易理解。
答案 1 :(得分:1)
恕我直言,最简单,最易读的方法是传递地图而不是int数组。
根据PersonDetails的字段,你甚至可以使用反射并在循环中分配值。