0

特定の一連の割り当てがわずかに異なる順序で発生することを除いて、同じコードがいくつかあります。

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"]

4

2 に答える 2

7

Class生の項目の順序と割り当て方法を単に示す or 配列を渡す代わりに、入力の解析を thisStringに委譲します。次のようにすると、はるかに読みやすくなります。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();

    //........
}

最終的に、これはやり過ぎではなく、3 か月後にこのコードに戻って理解できるようになったことに感謝することでしょう。

于 2009-10-03T14:48:15.807 に答える
1

私見、最も簡単で最も読みやすい方法は、int 配列の代わりにマップを渡すことです。

また、PersonDetails のフィールドがどのように見えるかに応じて、リフレクションを使用してループで値を割り当てることもできます。

于 2009-10-03T13:16:09.550 に答える