1


0

オブジェクトを作成する方法

コンストラクターがあります

public Track(string path)
{
        if (!File.Exists(path))
            throw new FileNotFoundException("File not found", path);
        if (!IsAudioFile(path))
            throw new Exception("Illegal Audio Format");

        _path = path;
        _id = Guid.NewGuid();
        _rate = 0;
        _length = GetTrackLength(path);

        TagLib.File file = TagLib.File.Create(path);
        if (!file.Tag.IsEmpty)
        {
            try
            {
                _artist = file.Tag.Artists[0];
            }
            catch (Exception e)
            {
                _artist = "";
            }
            _title = file.Tag.Title;
            try
            {
                _genre = file.Tag.Genres[0].ToGenre();
            }
            catch (Exception e)
            {
                _genre = Genre.NoGenre;
            }
        }
        else
        {
            _artist = "Unknown";
            _title = "Unknown";
            _genre = Genre.NoGenre;
        }
 }

例外をスローする必要がありますか、オブジェクトを作成する別の方法を選択する必要がありますか? 例えば:
トラックtrack = new Track(path); + track = Track.GetInstance();

4 Answer


1


あなたのコードは正しく、パターン化されています。

ただし、http://msdn.microsoft.com/en-us/library/ms182338%28v=VS.100%29.aspx [基本の Exception`クラスをスローすべきではありません]。 +代わりに、 `ArgumentException、` InvalidDataException`、または `InvalidOperationException`をスローする必要があります。

また、http://msdn.microsoft.com/en-us/library/ms182137.aspx [基本の `Exception`クラスをキャッチすべきではありません]。 +代わりに、 `ToGenre`メソッドがスローできる例外をキャッチする必要があります。


0


(一般的に)静的メソッドがインスタンスを返す理由はありません_unless_シングルトンパターンを実行しているか、新しいインスタンスを作成する代わりに既存のオブジェクトを再利用する必要があります。

コンストラクターで例外をスローすることは問題ありませんが、一般的に正しい方法です。


0


コードはクールです。

  1. 作業を開始する前に引数を確認します。

  2. コードが明確で読みやすい

  3. デフォルトを設定して情報が提供されない場合の状況を処理します 値。

私がアドバイスできるのは、汎用の例外を使用することではなく、コンテキストに固有の何かをスローしてキャッチすることです。 ArgumentExceptionを自由に使用してください。

また、チェックスタイルのためだけに:

if \ {}ブロックにコードを追加する場合は、中括弧\ {}を常にif causeで使用することをお勧めします。中括弧を忘れることがあります。 ここでは必要ありませんが。


0


不必要な例外処理を避けるために、以下のようにいくつかのマイナーな修正を行い、引数のチェックでより明確な例外をスローします。 コンストラクターのスローに関する限り、それは実際には単なる特別なタイプのメソッドであるため、問題ありません。

新しい Track`の作成に関するフィードバックについて: Track`オブジェクトの新規作成がAPIで処理する必要があると思われる場合は、何らかの種類のマネージャー(たとえば、TagManager)に `GetTrack()`メソッドを配置できます。消費者に責任を与える代わりに。

public Track(string path)
{
    if (!File.Exists(path))
        throw new FileNotFoundException("File not found", path);
    if (!IsAudioFile(path))
        throw new InvalidOperationException("Illegal Audio Format");

    _path = path;
    _id = Guid.NewGuid();
    _rate = 0;
    _length = GetTrackLength(path);

    TagLib.File file = TagLib.File.Create(path);
    if (!file.Tag.IsEmpty)
    {
        _title = file.Tag.Title;

        if (file.Tag.Artists != null && file.Tag.Artists.Count > 0)
            _artist = file.Tag.Artists[0];
        else
            _artist = "";


        if (file.Tag.Genres != null && file.Tag.Genres.Count > 0)
            _genre = file.Tag.Genres[0].ToGenre();
        else
            _genre = Genre.NoGenre;
    }
    else
    {
        _artist = "Unknown";
        _title = "Unknown";
        _genre = Genre.NoGenre;
    }
}