3

私は Java Web アプリケーションに取り組んでおり、設計に関していくつか質問があります。

基本的に現在のバージョンでは、例外のキャッチに大きく依存して制御の流れを決定しています。

たとえば、Spring サービス クラスの 1 つには、パラメーターとして指定された電子メールがデータベースに存在するかどうかを確認する次のメソッドがあります。

@Override
public boolean validateEmailAddressDoesNotExist(String accountEmailAddress) {
    try {
         return !dao.checkIfEmailAddressAlreadyExists(accountEmailAddress);
    } catch (NoResultException re) {
        log.error("NoResultException", re);
    } catch (RuntimeException re) {
        log.error("RuntimeException", re);
    }
    return true;
}

//from "dao" class
public boolean checkIfEmailAddressAlreadyExists(String accountEmailAddress) {
    return (loadAccountFromAccountEmailAddress(accountEmailAddress) == null ? false : true);
}

//also from "dao" class
public Account loadAccountFromAccountEmailAddress(String accountEmailAddress) {
    return entityManager.createNamedQuery("Account.findByEmailAddress", Account.class).setParameter("accountEmailAddress", accountEmailAddress).getSingleResult();
}

私の現在の設計はおそらく間違っているのではないかと思いますが、それについてのコメントや意見を読んで、どの程度欠陥があると考えているかを読んでいただければ幸いです.

4

4 に答える 4

4

一般的な経験則では、例外は「例外的な」条件に対するものです。

したがって、データ項目が存在する可能性があるか、合理的に存在しない可能性がある場合は、ブール値を返す方がより正常です。また、通常は、コードがよりシンプルで明確になります。

次に、ネットワーク障害などの真に例外的な条件の例外を保存できます。

場合によっては、サード パーティのライブラリでは選択の余地がないことがあります。サード パーティのライブラリが例外をスローする場合は、それらに対処する必要があります。

于 2012-02-16T15:53:09.753 に答える
3

私は、checkIfEmailAddressAlreadyExists などのメソッドからブール値を返し、戻り値に基づいてフローを制御し、データベースに接続できないなど、真に例外的な条件のために例外を残すことを好みます。

于 2012-02-16T15:52:23.777 に答える
3

サービス モデルの検証メソッドが例外をキャッチしないようにする必要があります。それはいくつかの理由で悪いです:

  • 例外的な状態ではありません。「結果が出ない」というのはよくあることです。

  • これは、検証をフレームワークのデータ取得メソッドの実装に間接的に結合します。それが良くない理由を理解するために、フレームワークが変更されてEmptyResultSetException. すべての検証方法を更新する必要があります。うわぁ!

基礎となるフレームワークが「結果なし」を示す例外を発生させる場合、必ずしもそれを助けることはできませんが、何をするかを制御することは確かにできますcheckIfEmailAddressAlreadyExists

このメソッドを変更してtrue、アドレスが存在する場合、存在falseしない場合、または結果が見つからない場合に返すようにします。

于 2012-02-16T15:54:33.150 に答える
1

私は Java プログラマーではなく、実際に使用したことはありません。

しかし、C# の世界では、例外を発生させてキャッチするのは非常にコストがかかることを私は知っています。したがって、それらを使用してフローを制御することは、 DNAが言ったように、自分で物事をチェックし、思いもよらなかったことを例外として残すのとは対照的に、非常に非効率的です。

于 2012-02-16T16:01:02.037 に答える