Форум: "Основная";
Текущий архив: 2005.08.14;
Скачать: [xml.tar.bz2];
Вниз
Конструктор Найти похожие ветки
← →
Dust © (2005-07-26 11:05) [0]Народ, в конструкторе объекта проверяются на правильность переданные параметры. Возможно ли откатить работу конструктора и не вернуть объект, в случае если входные параметры окажутся неверными?
← →
Ega23 © (2005-07-26 11:06) [1]Возможно. Надо вызвать исключение через raise
← →
Alexander Panov © (2005-07-26 11:14) [2]Dust © (26.07.05 11:05)
TMyClass=class
public
constructor Create(Parm: String);
class function CreateMyObj(Parm: String): TMyClass;
end;
class function CreateMyObj(Parm: String): TMyClass;
begin
Result := nil;
if Parm="" then Exit;
Result := TMyClass.Create(Parm);
end;
← →
Fay © (2005-07-26 11:24) [3]2 Alexander Panov © (26.07.05 11:14) [2]
IMHO, правильный ответ [1]
← →
Ega23 © (2005-07-26 11:25) [4]2 Fay © (26.07.05 11:24) [3]
IMHO, правильный ответ [1]
Второй ответ оригинальнее. Надо попробовать...
← →
Fay © (2005-07-26 11:32) [5]2 Ega23 © (26.07.05 11:25) [4]
Если
1) для проверки не требуется функциональность целевого класса
2) желательно избежать исключений
, то можно и попробовать.
← →
Alexander Panov © (2005-07-26 11:32) [6]Fay © (26.07.05 11:24) [3]
Можно возбуждать исключение. Но тогда его надо обрабатывать везде, где создается объект.
А можно и методом вызова классовой функции, которая вернет nil. ТОгда исключение возникать не будет. Достаточо проверить на nil, и все.
MyObj := TMyClass.CreateMyObj("");
if Assigned(MyObj) then ...
← →
Юрий Зотов © (2005-07-26 11:33) [7]Код в [2] записывается проще, без всяких class function:
if Parm = "" then R := nil else R := TMyClass.Create(Parm);
:о)
← →
Fay © (2005-07-26 11:34) [8]2 Alexander Panov © (26.07.05 11:32) [6]
[5] -> 1)...
← →
Fay © (2005-07-26 11:35) [9]2 Юрий Зотов © (26.07.05 11:33) [7]
Такая мысль возникает сразу, но если параметров много, то вид [2] может оказаться читабельнее.
← →
Думкин © (2005-07-26 11:38) [10]> Но тогда его надо обрабатывать везде, где создается объект.
> А можно и методом вызова классовой функции, которая вернет
> nil. ТОгда исключение возникать не будет. Достаточо проверить
> на nil, и все.
>
> MyObj := TMyClass.CreateMyObj("");
> if Assigned(MyObj) then ...
Ровно также как и везде где он создается придется проверять на nil.
В чем выигрыш?
← →
jack128 © (2005-07-26 11:40) [11]Думкин © (26.07.05 11:38) [10]
Ровно также как и везде где он создается придется проверять на nil.
В чем выигрыш?
как раз не давно ветка была "if vs try except" ...
← →
Юрий Зотов © (2005-07-26 11:45) [12]> Fay © (26.07.05 11:35) [9]
Смайлик видели?
:о)
Если нужна надежность - надо перекрывать конструктор и вызывать в нем исключение. Только так и никаких class function. Потому что стоит прикладному программисту (по незнанию тонкостей проекта или по забывчивости) создать объект обычным, привычным образом - и кирдык.
← →
Думкин © (2005-07-26 11:45) [13]пропустил - каюсь
← →
Alexander Panov © (2005-07-26 11:46) [14]Юрий Зотов © (26.07.05 11:45) [12]
Если нужна надежность - надо перекрывать конструктор и вызывать в нем исключение. Только так и никаких class function. Потому что стоит прикладному программисту (по незнанию тонкостей проекта или по забывчивости) создать объект обычным, привычным образом - и кирдык.
А для этого нужно еще и в конструкторе проверять параметры и возбуждать исключение-)
← →
Плохиш © (2005-07-26 11:48) [15]IMHO. Если объект не может быть создан, в конструкторе должно быть возбуждено соответствующее исключение, дающее исчерпывающую информацию о причине невозможности.
← →
Плохиш © (2005-07-26 11:50) [16]
> Alexander Panov © (26.07.05 11:46) [14]
> А для этого нужно еще и в конструкторе проверять параметры
> и возбуждать исключение-)
Хм, всегда считал, что это одна из задач конструктора :o)
← →
Alexander Panov © (2005-07-26 11:56) [17]Плохиш © (26.07.05 11:50) [16]
Ну вот представь - не хочу я возбуждать исключение при создании объекта. Для этого как раз и использую классовую функцию, где происходит проверка параметров. Если параметры ошибочны - объект не создается.
Но чтобы можно было воспользоваться и стандартным конструктором, нужно и в нем проверять параметры. И в этом случае без исключения уже не обойтись.
Так что этот подход ничем не отличается от стандартного-)
← →
Ega23 © (2005-07-26 12:03) [18]насколько я понимаю, всё дело в стиле, а он у каждого - свой. Проверять придётся и так и так. Только в одном случае это будет
try
MyObj:=TMyObj.Create(Param);
try
.....
finally
MyObj.Free;
end;
except
ShowMessage("Not Created")
end;
А в другом
MyObj:=TMyObj.CreateEx(Param);
if not Assigned(MyObj) then
begin
ShowMessage("Not Created");
Exit;
end;
try
......
finally
MyObj.Free;
end;
← →
Плохиш © (2005-07-26 12:22) [19]
> Ega23 © (26.07.05 12:03) [18]
> насколько я понимаю, всё дело в стиле, а он у каждого -
> свой. Проверять придётся и так и так. Только в одном случае
> это будет
Ну дык :-)
try
MyObj:=TMyObj.Create(Param);
try
.....
finally
MyObj.Free;
end;
except
on E:Exception do ShowMessage("Not Created: " + E.Message);
end;
← →
Fay © (2005-07-26 12:25) [20]2 Alexander Panov © (26.07.05 11:56) [17]
В таком случаеTMyClass=class
public
constructor Create(Parm: String);
class function CreateMyObj(Parm: String): TMyClass;
end;
class function CreateMyObj(Parm: String): TMyClass;
begin
try
Result := TMyClass.Create(Parm);
except
Result := nil;
end;
end;
constructor Create(Param : String);
begin
if Param = "" then
raise Exception.Create("Опаньки!");
end;
← →
Fay © (2005-07-26 12:26) [21]в смысле
constructor TMyClass.Create(Param : String);
begin
...
8)
← →
Alexander Panov © (2005-07-26 12:43) [22]Fay © (26.07.05 12:25) [20]
Это дополнительные затраты на блок try..except-)TMyClass=class
private
FParam: String;
class function CheckParam(const aParam: String): Boolean;
public
constructor Create(const aParam: String);
class function CreateObj(const aParam: String): TMyClass;
end;
class function TMyClass.CheckParam(const aParam: String): Boolean;
begin
Result := (aParam<>"");
end;
constructor TMyClass.Create(const aParam: String);
begin
if not CheckParam(aParam) then raise Exception.Create("Bad parameters format");
FParam := aParam;
end;
class function TMyClass.CreateObj(const aParam: String): TMyClass;
begin
if CheckParam(aParam)
then Result := TMyClass.Create(aParam)
else Result := nil;
end;
← →
Думкин © (2005-07-26 12:47) [23]> Alexander Panov ©
А если в предке вызывается исключение в конструкторе? Ведь тогда мы до проверки на нил и не дойдем - получим то, что и не хотели - исключение.
← →
Alexander Panov © (2005-07-26 13:02) [24]Думкин © (26.07.05 12:47) [23]
А если в предке вызывается исключение в конструкторе?
Ну тогда ничего не поделаешь, если только предок не свой.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.08.14;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.014 c