Класс со свойствами, которые не были установлены - PullRequest
4 голосов
/ 29 апреля 2010

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

Спасибо

Ответы [ 8 ]

12 голосов
/ 29 апреля 2010

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

4 голосов
/ 29 апреля 2010

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

1 голос
/ 29 апреля 2010

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

1 голос
/ 29 апреля 2010

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

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

1 голос
/ 29 апреля 2010

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

0 голосов
/ 30 апреля 2010

Можете ли вы использовать .NET 4? В этом случае потребитель может использовать именованные параметры, если вы хотите, чтобы это было ясно. Так что со свойствами у вас будет:

new Class
{
    Prop1 = 123,
    Prop2 = 123,
    ...
};

И с именованными параметрами:

new Class(
    param1: 123,
    param2: 123,
    ...
);

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

0 голосов
/ 30 апреля 2010

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

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

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

За исключением всего вышесказанного, должно быть сгенерировано исключение. Кроме того, вы упоминаете "Бросить исключение и ожидать, что пользователь его поймает?" Назначение исключения не должно состоять в том, что вы ожидаете, что вызывающие его перехватят, вы должны ожидать, что они удостоверится, что свойство установлено. Поймать его следует в крайнем случае, когда они не могут разумно убедиться, что свойство установлено, и им все равно, если в результате ваш метод завершится неудачей.

0 голосов
/ 29 апреля 2010

Хороший дизайн мешает делать неправильные вещи. Возможно, в этом случае API должен принимать все входные данные в качестве параметров метода, которые, вероятно, будут статическими.

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