1

私のアプリケーションには、名前が示すように、同じ継承ツリーに属していない3つのクラスUserがあります。各クラスには、いくつかの(異なる)パラメーター、つまり、、、を受け取るコンストラクターがあります。各コンストラクターが必要とするパラメーターの数は、すべてのクラスで同じではありません。txtファイルからいくつかのデータを読み取り、データをパラメーターとして上記のコンストラクターに渡す新しいオブジェクトを作成するクラスを作成しました。このクラスのコードは、オブジェクトを作成する1つのメソッドを除いて、すべてのタイプで明らかに同じです。したがって、3つの異なるクラスを作成することは適切ではありませんが、より良い設計アプローチを目指す方がよいでしょう。GroupCompanyUser(String name, String password, int type)Group(String name, String name)Company(String name, int employees, boolean isValid)ReadDataFromFile

私の質問は、この場合の適切な設計がジェネリッククラスなのか、それとも抽象クラスであり、そのサブクラスに異なる1つのメソッドを実装するのかというcreateObject()ことです。ただし、txtファイルからの必要なデータが異なる長さの文字列配列に入れられると仮定します。各タイプ。Genericクラスのアプローチに従いたいのですがclass ReadDataFromFile<T>{}、それぞれが異なるコンストラクターの呼び出しを必要とするため、異なる型をどのように処理する必要があるかがわかりません。タイプを確認する必要がありinstanceofますか?各オブジェクトのクラスをメソッドに渡す必要がありますか?それとももっと良い方法はありますか?

4

4 に答える 4

2

質問を「抽象的または一般的」として提起した理由がわかりません。一般的な解決策は両方のようです。

public abstract class ReadFromFile<T> {

  public T readFile(File file) {
    String[] rawInput = doSomeStuffCommonToAll();
    return constructObject(rawInput);
  }

  abstract T constructObject(String[] rawInput);
}

public class UserFileReader extends ReadFromFile<User> {

  @Override
  User constructObject(String[] rawInput) {
    return new User(rawInput[0], rawInput[1], Integer.parseInt(rawInput[2]);
  }
}
于 2013-02-26T19:49:40.107 に答える
0

抽象的なデザインを選んで、たとえば抽象的な工場パターンを利用すると思います。

于 2013-02-26T19:44:28.613 に答える
0

「instanceof」検証などの条件に基づいてオブジェクトを作成します。

if (objectData instanceof User){
 User = new User();
 user.setName(objectData.getString(1));
} //...
于 2013-02-26T19:40:48.110 に答える
0

要するに、答えはどちらでもありません:)はい、抽象化は必要ですが、傾いているように見えるサブクラス化形式である必要はありません。 継承よりも構成を優先しますか?

長い答え:)私はあなたのドメインを正確には知りませんが、あなたが書いたものから、users.txt、groups.txt、およびcompanys.txtの3つのファイルがあり、フォーマットは共有されていますがデータが異なると想定しています-次のようなものですCSV。したがって、このようなことを行うことで、構成を通じて抽象化を実現できます。これは、私の仮定が間違っていたとしても、その点を説明するはずです。

public class FileReader {
    public static void read(File f, RowHandler rowHandler) {
        //read each line, convert its contents to a map, and pass it to rowHandler
    }
}

どこ

public interface RowHandler {
    void handle(Map<String,String> row);
}

これは、各行の読み取りと解析を、解析された各行に対して行うことから分離することを意味します。

User オブジェクトを作成するには、次のようにします。

public class UserConstructor implements RowHandler {
    private List<User> users = new ArrayList<User);

    public void handle(Map<String,String> row) {
        users.add(new User(row.get("name"), row.get("password"), Integer.parseInt(row.get("type)));
    }

    public List<User> getUsers() {
        return users;
    }
}

そして、あなたはそれをすべてつなぐ

UserConstructor uc = new UserConstructor();
FileReader.readFile(new File("users.txt), uc);
List<User> users = uc.users();

クラス名 ReadDataFromFile を使用します。この名前は単一の目的を示唆していますが、あなたの質問は、別の懸念をそれに混ぜていることを示唆しています。つまり、ファイルを読み取り、オブジェクトを作成します。ReadDataFromFile は、ファイルからデータを読み取り、そのデータを別のクラスに渡して、それを処理する戦略を実装する必要があります。

それが上記の設計がやろうとしていることです - 懸念を分離してください。

于 2013-02-26T19:49:51.447 に答える