特定の一連の割り当てがわずかに異なる順序で発生することを除いて、同じコードがいくつかあります。
int[]
これを、順序を表すtype のメソッド パラメーターに分解するのは簡単です。
しかし、私はそれが最も明確ではないことがわかりました。
別のオプションは、それらを type のオブジェクトに分解することでしたAssignmentOrders
。また、配列ではできなかったオブジェクト コンストラクターの値の検証も行うことができます。これは、本Refactoringの「Introduce Parameter Objects」リファクタリングになります。
この特定のリファクタリングがやり過ぎなのかどうか疑問に思っていint[]
ます。
コード:
オリジナルの 3 つのサンプル:
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"]