10

あるプロジェクトのために書いている DAO ライブラリの返品の正しい処理に関連する質問があります。このライブラリはおそらく別の人が使用する予定であり、私はそれを正しく行いたいと考えています。DAO の関数の return ステートメントをどのように処理すればよいですか?

例 1 String を返す関数 getCustomer があります。クエリが結果を返さない場合、null、空の文字列を返すか、何らかの例外をスローする必要がありますか?

例 2getCutomerList ArrayList<String> 型の値を返す 関数 があります。クエリが結果を返さない場合、null を返すか、空の ArrayList を返すか、例外をスローする必要がありますか?

例 3 いくつかの SQL 例外が検出されました。どうすればよいですか、例外をスローtryするcatchか、それが発生する可能性のあるブロックを実行しますか?

私の場合に適用する「良い」プラクティスまたは「ベスト」プラクティスは何ですか?

4

4 に答える 4

10

ライブラリがデータベースのような呼び出しを行っているようです。その場合は、JPA2仕様で実装されていることを正確に実行します。

つまり、 JPA APIのfind()メソッドを見て、そこで行っていることを正確に返します。

    /**
     * Find by primary key.
     * @param entityClass
     * @param primaryKey
     * @return the found entity instance or null
     *    if the entity does not exist
     * @throws IllegalStateException if this EntityManager has been closed.
     * @throws IllegalArgumentException if the first argument does
     *    not denote an entity type or the second
     *    argument is not a valid type for that
     *    entity's primary key
     */
    public <T> T find(Class<T> entityClass, Object primaryKey);

ここにあるのはあなたのメソッドにfind似ていると思いますが、何も見つからない場合は返され、引数が無効な場合にのみスローされます。getCustomer()nullIllegalArgumentException

find()メソッドが目的に近づかない場合は、 getSingleResult()getCustomer()と同じ動作を実装する必要があります。

    /**
     * Execute a SELECT query that returns a single result.
     * @return the result
     * @throws EntityNotFoundException if there is no result
     * @throws NonUniqueResultException if more than one result
     * @throws IllegalStateException if called for a Java 
     *    Persistence query language UPDATE or DELETE statement
     */
    public Object getSingleResult();

EntityNotFoundException結果が見つからないNonUniqueResultException場合、複数のインスタンスが見つかっIllegalStateExceptionた場合、またはSQLが間違っている場合にスローされます。

どの動作が自分に最も適しているかを判断する必要があります。

getResultList()についても同じことが言えます。

/**
 * Execute a SELECT query and return the query results
 * as a List.
 * @return a list of the results
 * @throws IllegalStateException if called for a Java 
 *    Persistence query language UPDATE or DELETE statement
 */   
public List getResultList();

getResultList()何も見つからない場合はnullを返し、SQLが不正な場合にのみ例外をスローします。

この動作に従うことで、一貫性が保たれ、ユーザーはライブラリがどのようになっているのかを知ることができます。


別の動作は、の代わりに空のコレクションを返すことですnull。これがGoogleGuavaがAPIを実装した方法であり、これが本当に好ましい理由です。しかし、私は一貫性が好きであり、それでもライブラリをstandardできるだけ近くに実装する必要があると思います。


資力

Joshua Blochは、優れたAPIを設計する方法とそれが重要である理由を説明するビデオを作成しました

于 2011-02-07T14:59:25.587 に答える
2
  1. ヌル。ただし、メソッドgetCustomer()はCustomerを返す必要があります。文字列を返す場合は、おそらく呼び出されるgetCustomerName()か、getCustomerId()
  2. 空のリスト
  3. 例外をスローします。おそらく、アプリケーション層の例外でラップします。
于 2011-02-07T15:01:39.890 に答える
1

これはAPIであるため、一貫性があり、適切に文書化されていることを確認する限り、どのアプローチでも問題ありません。

1と2の場合:ただし、nullを返すと、クライアントコードは次のようなチェックを実行し続けることになります。

result = yourAPICall();
if(result != null){
   // do something
}

空のオブジェクトやコレクションを返す方が好きなのはそのためです

3の場合:それはAPIの設計によって異なります。ただし、最初に、コールスタックに低レベルの例外をスローしないでください。API用に設計されたカスタム例外クラスでそれらをラップする必要があります。これにより、クライアントコードは、さまざまな下位レベルの例外(SQLException、IOExceptionなど)ではなく、API例外のみをキャッチする必要があります。

次に、最初に例外がスローされることにメリットがあるかどうかを判断する必要があります。例外をスローすると、クライアントコードは、APIの依存関係で発生した問題を処理する方法をカスタマイズできます。ただし、これをスローすると、API設計者として、コードが問題から回復する可能性のある内部の不測の事態を設計することもできなくなります(APIの堅牢性が低下します)

于 2011-02-18T11:01:31.613 に答える
1

例1:何も取得されないため、nullを返す必要があります。または、Null-Objectパターンを選択することもできます。

例2: nullよりも空のArrayListを優先します。「有効なJava」を参照してください。項目43:nullではなく空の配列またはコレクションを返す

例3:SQLExceptionをより高い例外に変換してスローします。「有効なJava」を参照してください。項目61:抽象に適切な例外をスローします。

于 2011-02-07T15:01:29.453 に答える