Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.08.14;
Скачать: CL | DM;

Вниз

Конструктор   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.035 c
4-1118563613
sofs
2005-06-12 12:06
2005.08.14
Как запустиь внешнюю программу на Дельфи?


4-1119342275
SamProf
2005-06-21 12:24
2005.08.14
По Handle получить класс


3-1120634051
vitzol
2005-07-06 11:14
2005.08.14
Подсветка символов в DBgrid при фильтрации


14-1122033554
Александр Иванов
2005-07-22 15:59
2005.08.14
"Искусство программирования" Кнута в "нормальном" формате


14-1121925748
Ega23
2005-07-21 10:02
2005.08.14
С днем рождения! 21 июля