4

この特定のアプリケーションでは、別個のデータ層はなく、データ アクセス コードはエンティティ自体にあります。たとえば、Customer エンティティを考えてみましょう。メンバーとプロパティが定義されている Customer.cs ファイルには、以下のように Customer オブジェクトを読み込むメソッドがあります。

public bool TryLoad(int customerID, out Customer customer)
{
    bool success = false
    try
    {
        //code which calls the db and fills a SqlDataReader
        ReadDataFromSqlDataReader(reader);
        success = true;
    }
    catch(Exception ex)  
    {
      LogError();
      success = false;
    }
    return success;
}

現在、ReadDataFromSqlDataReader(reader) では、tryparse を使用してリーダーからオブジェクトにデータをロードしています。例えば

public void ReadDataFromSqlDataReader(reader)
{
   int.TryParse(reader["CustomerID"].ToString(), out this.CustomerID);
   PhoneNumber.TryParse(reader["PhoneNumber"].ToString(), out this.PhoneNumber);
   ... similar TryParse code for all the other fields..
}

TryParse を使用してリーダーからすべてのプロパティを読み取るのは良い方法ですか? TryParse は int.Parse よりもパフォーマンスが優れているため、開発者はこの方法で行われたと私に言いました。しかし、データベースから読み取っている値がコードが期待するものと一致しない場合に、例外をスローしたくありませんか? この場合、データベースに間違った電話番号がある場合、空の電話番号でオブジェクトをロードする代わりに、オブジェクトをまったく初期化しないでください。

4

6 に答える 6

4

はい、フェイルファストの原則に従って、期待される型に変換できない値が返された瞬間に例外をスローする必要があります。

これらの操作のいずれかが失敗し、何も起こらなかったかのように続行すると、キャッチするのも特定するのも難しい奇妙なエラーが発生する可能性があります: 既存の行を更新するはずのオブジェクトがデータベースに追加され、データが不思議なことに消える、犬と猫が一緒に住んでいる...あなたはアイデアを得る。

一方、例外をすぐにスローすると、問題の場所が正確にわかり、問題が悪化する前にキャッチして修正できます。

TryParseParse例外をスローする必要がないため (コストがかかる可能性があります)、失敗した場合よりも高速に動作しますが、物事が成功すると仮定している場合 (このコードは解析の結果を使用しないことでこれを行っています) )、 を使用して同等のパフォーマンスが得られるはずですParse

于 2012-04-17T14:41:20.330 に答える
1

そのためにTryParseを使用することはありません。私のデータベースにゴミが含まれている場合は、それに対処したいと思います。データが解析に関してあいまいな場合(たとえば、文字列としてintまたはdoubleが含まれるVarchar)、スキーマを整理したい場合は、型検出としてのTryParseをすばやく簡単にハックします。

于 2012-04-17T14:52:25.423 に答える
1

データがデータベースに挿入されるときに、効果的な検証が実行されます。これは、データベースに不正なデータを入力する可能性のある優れた設計ではありません。データベースに不正な電話番号が含まれている場合、必須の場合はユーザーに電話番号の再入力を求める必要があります。電話番号がそれほど重要でない場合は、不正なデータの場合に電話番号をnullに初期化できます。

于 2012-04-17T14:46:43.510 に答える
0

として、TryParseブール値を返します。だから、私は価値に基づいByPass/Continueて要求することができます。私はそのようなシナリオで例外を発生させません。そのためにロギングなどを行います。Upcoming Logic/Any DatabaseBoolean

解析

  1. 例外をスローします。
  2. 値が有効であることが確実な場合に使用してください

TryParse

  1. 成功したかどうかを示すブール値を返します
  2. なぜそれが高速であるように例外なく実装されているのかを内部で試して/キャッチするだけです
  3. 値が無効である可能性がある場合に使用します
于 2012-04-17T14:45:21.373 に答える
0

データが挿入または更新されているときに、どのような検証を行っていますか?

ここで何らかの形式の検証を適用している限り、有効なデータのみを入力していると確信できるはずなので、個人的にはデータベースから出力されるデータを検証することはありません。

于 2012-04-17T14:42:07.053 に答える
0

あなたがそれを処理するなら、そうです、例外をスローする必要があります。ただし、例外を気にせず、適切なデータをフィルタリングして使用する場合 (この場合はゼロ以外) はスキップできます。

于 2012-04-17T14:43:43.420 に答える