2

JSoupライブラリを使用してWebスクレイピングを行っているこのJavaアプリがあります。私はライブラリを使用していて、それらの文字列6のコレクションを返しています。これらの6つのランダムな文字列をオブジェクトのプロパティにマップする必要があります。文字列が入ってくる順序と、どの番号がどのプロパティにマップされるかを知っています。私のアプローチがこれを処理するための最良の方法であるとは思わない。それは失われたように感じ、読みやすさは悪く、私はこれを行うためのより良い方法があるかどうか疑問に思っています。私は列挙型か何かだけでそれらの行を使用することを考えていました。簡単に言うと、ここにコードスニペットがあります。助けてくれてありがとう。

List<String> strings = JSoup.getStrings();
Car car = new Car();
int i = 0;
for(String s : strings) {
    switch (i) {
        case 0:
            car.setMake(s);
            break;
        case 1:
            car.setModel(s);
            break;
        .....
    }
    i++;
}
4

3 に答える 3

1

この質問はベスト プラクティスに関するものであるため、文字列のリストを入力として受け取るコンストラクターを Car で提供することを検討する必要があります。次に、コンストラクターは文字列のリストから車のフィールドを 1 つずつ初期化します。これは、車のインスタンスを設定するためのコードが単一の場所、つまり Car クラス内にあることを意味します。

このアプローチにより、Car インスタンスを作成するコードで Car インスタンスを手動で初期化する必要がなくなります。いくつの異なるクラスが Car を作成しても、これらの各クラスで初期化コードが重複することはありません。車自体の内部に初期化コードを配置すると、再利用性が促進されます。クラスが書かれているのはそのためではありませんか?

于 2012-09-23T18:47:35.600 に答える
1

単純にどうですか

car.setMake(strings.get(0));
car.setModel(strings.get(1));
...

それは非常に読みやすく、私には十分に単純に見えます。

于 2012-09-23T16:19:12.287 に答える
0

私なら次のように書きます。

List<String> strings = JSoup.getStrings();
if (null == strings || strings.isEmpty() || MAX_SIZE != strings.size()) {
    throw new IllegalArgumentException("I don't know what you are talking about!");
}
Car car = new Car();
car.setMake(strings.get(0));
car.setModel(strings.get(1));
...

リスト内の値が非常に多く、各要素が車の特定の属性であることは、コードの読者には明らかです。新しい属性が追加されると、例外はモディファイアに、新しい属性を処理するためにここで何かをしなければならないことを知らせます。

于 2012-09-23T16:19:02.887 に答える