Если класс имеет конструктора, который берет некоторый объект значения в качестве параметра и полагается на это, чтобы сделать его инициализацию. Как это должно реагировать, если этот объект является несуществующим?
class SomeClass
{
private SomeData _data;
public SomeClass(SomeValueObject obj)
{
_data = obj.Data;
}
}
Это - один пример, но в целом: Как конструктор должен действовать, если этому дают недопустимые параметры и поэтому не может сделать конструкции правильно? Это должно просто возвратиться, не делая никакой инициализации? Установить параметры на некоторые значения по умолчанию? Выдать исключение? Что-то еще?
Я уверен, что ответ на это, "Он зависит", но является там какими-либо лучшими практиками и т.д.?
Ронни,
Прежде всего синтаксис 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
.
Программист должен иметь возможность предположить, что объект был создан успешно, если не было создано исключение. Тип исключения зависит от аргумента, но, тем не менее, должен быть снят. Последнее, что нужно - конструктор не может построить допустимый объект и не сообщить об этом вызывающему.
Я думаю, что использование значений по умолчанию в конструкторе - опасная привычка.
Если поле имеет решающее значение, он должен изменить исключение, чтобы указать, что объект не должен использоваться. Если его не критично, вы можете назначать значения по умолчанию.
Похоже, что это Java, но в C ++ он должен окончательно бросить (A STD :: Unvice_argument
даже).
См. C ++ FAQ Lite 17.2 .
Я думаю, что для Java это точно так же.
В редких случаях, когда бросание исключений представляет собой слишком большую верхнюю часть, вы должны вернуться и установить флаг в объекте, который он не построил должным образом. После этого проверяйте функцию ISVALID ()
.
Если объект может иметь неверные значения по умолчанию, то он должен инициализировать на значения по умолчанию и дождаться инициализации. E.G., foo.set_values (...)
. В этом случае должен быть запрос IS_READY ()
или IS_Valid ()
, чтобы разрешить проверку перед использованием.
Если объект может совсем не быть в неверном состоянии данных, то он должен выбрасывать исключение.
Оба этих случая, которые я представлял.
Многое зависит от вашей бизнес-логики. Если ваша бизнес-логика требует, чтобы SomeValueObject
не был нулевым, то есть SomeClass
не мог быть создан без SomeValueObject
, тогда конструктор определенно должен выдать исключение, вероятно IllegalArgumentException
.