Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
14-1122200731
P.N.P.
2005-07-24 14:25
2005.08.14
Работа операторов :))


14-1121928072
Noxa
2005-07-21 10:41
2005.08.14
IBExpert. Русский язык интерфейса.


14-1121638929
Andy BitOff
2005-07-18 02:22
2005.08.14
Удивительная клавиатура от Артемия Лебедева. Офигеть!


14-1121778131
oldman
2005-07-19 17:02
2005.08.14
Ну надо же было так прогнуться...


11-1105130752
Slay
2005-01-07 23:45
2005.08.14
2Владимир Кладов: Не работает DecInt64()





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский