Ale*_*sky 0 java refactoring parameter-object
我有一些代码是相同的,除了一定的分配顺序发生在略有不同的顺序.
很容易将其分解为类型的方法参数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();
//........
}
Run Code Online (Sandbox Code Playgroud)
我如何将上面的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();
//........
}
Run Code Online (Sandbox Code Playgroud)
理论上我如何将它重构为参数对象:
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();
//........
}
Run Code Online (Sandbox Code Playgroud)
我想要做的是创建一个特定的类而不是使用int[]...但是想知道这是否有点过分.
好处是它更具可读性.而不是orderOfSections[0],它可能是orderOfSections.value1SectionIdx...我也可以在课堂上放置一些验证码.
我相信这就是Martin Fowler所说的引入参数对象.
编辑:
另一种选择是使用词典.比新课程更轻,但更具描述性...然后我可以使用类似的东西orderOfSections["value1"]
我将委托解析输入,而不是传入一个Class简单地指示原始项目的顺序String以及如何分配它们的数组或数组.执行以下操作会更具可读性:lineClass
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();
//........
}
Run Code Online (Sandbox Code Playgroud)
最后,这不会有点矫枉过正,当你回到这段代码并发现它更易于理解时,你会感谢3个月后的自己.