Как проверить, что класс имеет все свойства, настроенные перед использованием? - PullRequest
1 голос
/ 07 июня 2009

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

Например, скажем, у меня есть класс Book, и я хочу передать набор свойств о книге конструктору Book.

Book book = new Book(bookProperties);

Что я хочу убедиться, что BookProperties завершено, т. Е. Есть вся информация.

Допустим, в этом примере у меня есть следующее:

  • Название книги
  • Автор книги
  • Дата публикации книги

Одним из способов является то, что я могу создать конструктор по умолчанию, который принимает только все 3 элемента:

BookProperties bookProperties = new BookProperties("2001: A Space Odyssey",
                                                   "Arthur C. Clarke",
                                                   1968);

Теперь это нормально, если у нас есть только три значения, но, скажем, у моего класса есть 10 или более свойств, которые пользователь должен инициализировать до создания класса Book.

Я думал о том, чтобы в BookProperties был метод с именем isValid. Тогда в конструкторе класса Book я бы посмотрел, если bookProperties.isValid, и утверждал, что возвращаемое значение ложно.

Это хорошая идея или я все делаю неправильно?

Ответы [ 2 ]

3 голосов
/ 07 июня 2009

Если ему нужно 10 значений, тогда не случайно передать 10 значений в конструктор - но то, что вы описываете, звучит больше как объект-сущность. Для удобства принято просто использовать установщики свойств. В C # 3.0 вы можете использовать синтаксис инициализатора, чтобы сделать это удобно и понятно:

Book book = new Book {
    Title = "2001: A Space Odyssey",
    Author = "Arthur C. Clarke",
    PublishedYear = 1968
};

Вы можете использовать объект BookProperties (в качестве некоего строителя) - но в таком случае, почему бы не сделать конструирование методом для строителя? Затем конструктор выполняет проверку перед созданием Book (предположительно, через конструктор internal) - и выдает исключение, если возникает проблема. Я предполагаю, что использование BookProperties является (например) разрешением неизменяемого Book - но нет необходимости в том, чтобы строитель был неизменяемым:

var bookProperties = new BookProperties(); // builder?
bookProperties.Title = "2001: A Space Odyssey";
...
Book book = bookProperties.CreateBook();

Лично я бы использовал в большинстве случаев только подход Book (самый верхний из вышеперечисленных) - этот подход хорошо работает с распространенными механизмами сериализации .NET и средами привязки (оба из которых любят конструкторы без параметров и get / set свойства), например. Если вы хотите проверить, то, возможно, просто добавьте метод Validate() (или свойство IsValue {get;}) к Book. Или реализовать IDataErrorInfo.

1 голос
/ 07 июня 2009

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

10 или даже 20 параметров могут быть не очень красивыми, но лучше, чем альтернативы

...