Способ создания объекта - PullRequest
1 голос
/ 14 ноября 2010

У меня есть конструктор

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 = Track.GetInstance ();

Ответы [ 4 ]

1 голос
/ 14 ноября 2010

Ваш код правильный и с хорошим рисунком.

Однако, вы не должны бросать базу Exception класс .
Вместо этого вы должны бросить ArgumentException, InvalidDataException или InvalidOperationException.

Вы также не должны ловить базу Exception класс .
Вместо этого вы должны перехватывать любые исключения, которые может выдать метод ToGenre.

0 голосов
/ 14 ноября 2010

Я бы внес несколько небольших изменений, как показано ниже, чтобы избежать ненужной обработки исключений, а также выбрасывал более конкретное исключение при проверке аргументов.Что касается добавления конструкторов, то это нормально, поскольку это действительно просто особый тип метода.

Что касается обратной связи при создании нового Track: вы можете поместить метод GetTrack() в какой-то видменеджер (например, TagManager), если вы считаете, что создание нового Track объекта - это то, что должен обрабатывать ваш API, а не передавать ответственность потребителю.

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;
    }
}
0 голосов
/ 14 ноября 2010

Код классный.

  1. вы проверяете аргументы перед началом работы.
  2. ваш код понятен и легко читается
  3. вы справляетесь с ситуацией, когда информация не предоставляется, устанавливаязначение по умолчанию.

Все, что я могу посоветовать, это не использовать общее исключение, а бросить и поймать что-то более специфическое для контекста.Не стесняйтесь использовать ArgumentException.

Кроме того, просто для checkstyle:

Хорошей практикой является использование фигурных скобок {} всегда с if, если вы хотите добавить код в if {}блок, вы можете забыть поставить скобки.Хотя в этом нет необходимости.

0 голосов
/ 14 ноября 2010

Нет (как правило) причин, по которым статический метод должен возвращать экземпляр , если только не выполняется одноэлементный шаблон или вам не нужно повторно использовать существующие объекты вместо создания новых экземпляров.

Бросать исключения в конструкторе - это нормально, и, как правило, это правильный способ действий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...