4

私のアプリケーションは、要求に応じてデータベースから情報を取得し、その情報からオブジェクトを生成します。私は現在、このタスクを完了するために 2 つの異なる手法を検討しています (ただし、他の手法にもオープンです!)。

方法 1:

class Book {

    private int id;
    private String author;
    private String title;

    public Book(int id) {

        ResultSet book = getBookFromDatabaseById(id);

        this.id = book.id;
        this.author = book.author;
        // ...

    }

}

方法 2:

public class Book {

    private HashMap<String, Object> propertyContainer;

    public Book(int id) {

        this.propertyContainer = getBookFromDatabaseById(id);

    }

    public Object getProperty(String propertyKey) {

        return this.propertyContainer.get(propertyKey);

    }

}

方法 1 では、プロパティの制御、制限、および場合によってはアクセスが容易であると思いますが、新しいプロパティの追加は方法 2 の方がスムーズになります。

これを行う適切な方法は何ですか?

4

3 に答える 3

3

この問題は、ORM、DAO、行とテーブルのマッパー、その他多くの方法で解決されたと思います。やり直す必要はありません。

よく考えなければならない問題の 1 つは、パッケージ間の結合と循環依存関係です。モデル オブジェクトにそれ自体を永続化する方法を指示することで、巧妙なことをしていると思うかもしれませんが、この設計上の選択の結果の 1 つは、モデル オブジェクトと永続化層の間の結合です。これを行うと、永続性なしでモデル オブジェクトを使用することはできません。それらは実際には 1 つの大きくて扱いにくいパッケージになります。レイヤリングはありません。

もう 1 つの選択肢は、モデル オブジェクトが永続化されているかどうかを気にしないようにすることです。これは一方通行の依存関係です。永続性はモデル オブジェクトを認識しますが、その逆は認識しません。

他のソリューションについては Google。あの死んだ馬を再び倒す必要はありません。

于 2012-09-03T20:26:25.783 に答える
1

最初の方法は、関連付けられたアクセサーのタイプ セーフを提供するため、返されるオブジェクトのタイプを知ることができ、期待するそのタイプにキャストする必要はありません (これは、プリミティブ以外のものを提供する場合により重要になります)。 .

その理由から(さらに、結果のコードがよりシンプルで読みやすくなります)、最初のコードを選択します。大規模なアプリケーションでは、オブジェクト自体内のデバッグなどのために、パラメータ値をコードにすばやく簡単にきれいに戻すこともできます。

他の誰かがこのコードに取り組んでいる場合 (または、忘れた後に作業する予定がある場合)、最初のコードはパラメーターなどを知っているので役立ちます。

于 2012-09-03T20:28:03.943 に答える
0

最初のものは古典的な方法です。2番目のものは本当にトリッキーです。

于 2012-09-03T20:27:20.790 に答える