Как конструктор должен действовать когда данный недопустимые параметры?

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

class SomeClass
{
    private SomeData _data; 
    public SomeClass(SomeValueObject obj)
    {
        _data = obj.Data;
    }
}

Это - один пример, но в целом: Как конструктор должен действовать, если этому дают недопустимые параметры и поэтому не может сделать конструкции правильно? Это должно просто возвратиться, не делая никакой инициализации? Установить параметры на некоторые значения по умолчанию? Выдать исключение? Что-то еще?

Я уверен, что ответ на это, "Он зависит", но является там какими-либо лучшими практиками и т.д.?

16
задан MattDavey 28 August 2012 в 09:12
поделиться

6 ответов

Ронни,

Прежде всего синтаксис timestamp устарел Microsoft, поэтому необходимо использовать rowversion , во-вторых, rowversion всегда связан со строкой.

Из документации:

rowversion

Каждая база данных имеет счетчик, который увеличивается для каждой операции вставки или обновления, выполняемой для таблицы, содержащей столбец rowversion в базе данных. Этот счетчик является строковой версией базы данных .

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

Примерно так:

CREATE TRIGGER tgUpdateParentRowVersion ON ChildTable FOR INSERT, DELETE, UPDATE
AS
BEGIN
   /*
    * The updates below force the update of the parent table rowversion
    */
   UPDATE ParentTable
      SET ChildUpdate = ChildUpdate + 1
     FROM ParentTable a 
     JOIN inserted    i on a.pkParentTable = i.fkParentTable

   UPDATE ParentTable
      SET ChildUpdate = ChildUpdate - 1
     FROM ParentTable a 
     JOIN deleted     d on a.pkParentTable = d.fkParentTable
END
-121--3894448-

Многое зависит от вашей бизнес-логики. Если бизнес-логика требует, чтобы SomeGroupObject не имел значения null, что означает, что SomeClass не может быть создан без SomeStartObject Object , то конструктор должен определенно выдать исключение, вероятно, IllegalArgumentException .

-121--2578805-

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

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

15
ответ дан 30 November 2019 в 21:10
поделиться

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

1
ответ дан 30 November 2019 в 21:10
поделиться

Похоже, что это Java, но в C ++ он должен окончательно бросить (A STD :: Unvice_argument даже).

См. C ++ FAQ Lite 17.2 .

Я думаю, что для Java это точно так же.

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

3
ответ дан 30 November 2019 в 21:10
поделиться

бросить нулевой аргумент исключения.

2
ответ дан 30 November 2019 в 21:10
поделиться

Если объект может иметь неверные значения по умолчанию, то он должен инициализировать на значения по умолчанию и дождаться инициализации. E.G., foo.set_values ​​(...) . В этом случае должен быть запрос IS_READY () или IS_Valid () , чтобы разрешить проверку перед использованием.

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

Оба этих случая, которые я представлял.

1
ответ дан 30 November 2019 в 21:10
поделиться

Многое зависит от вашей бизнес-логики. Если ваша бизнес-логика требует, чтобы SomeValueObject не был нулевым, то есть SomeClass не мог быть создан без SomeValueObject , тогда конструктор определенно должен выдать исключение, вероятно IllegalArgumentException .

6
ответ дан 30 November 2019 в 21:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: