Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.01.2010, 08:55   #1
megachuhancer
Форумчанин
 
Регистрация: 16.04.2009
Сообщений: 247
По умолчанию Улучшение кода

Как можно переписать кусок кода такого типа, чтобы не пришлось писать одно и то же дважды?
Код:
   if e <> nil then begin
      if e.ClassType <> TSomeclass then begin
         DoSomething;
      end;
   end else begin
       DoSomething;
   end;
Дело в том, что если e = nil, программа упадёт на проверке условия e.ClassType <> TSomeclass. И поэтому нельзя использовать что-то типа
Код:
if (e = nil) or (e.ClassType <> TSomeclass)...
Можно конечно вырубить Complete Boolean Eval, но нет ли лучшего способа?
megachuhancer вне форума Ответить с цитированием
Старый 25.01.2010, 09:41   #2
psycho-coder
Участник клуба
 
Аватар для psycho-coder
 
Регистрация: 06.04.2009
Сообщений: 1,524
По умолчанию

По идее в условии
Код:
if (e = nil) or (e.ClassType <> TSomeclass)...
с начала выполняется проверка на e = nil, а потом на e.ClassType <> TSomeclass.
Но условие or, мне кажется не подходит для этой проверки. Попробуйте and
Код:
if (e = nil) and (e.ClassType <> TSomeclass)...
psycho-coder вне форума Ответить с цитированием
Старый 25.01.2010, 09:46   #3
megachuhancer
Форумчанин
 
Регистрация: 16.04.2009
Сообщений: 247
По умолчанию

Цитата:
с начала выполняется проверка на e = nil, а потом на e.ClassType <> TSomeclass.
Это при выключенном Complete Boolean Eval. Я писал про это.
Цитата:
Но условие or, мне кажется не подходит для этой проверки. Попробуйте and
Нет, здесь именно or.

И вообще, если использовать and, то при e = nil, даже при выключенном Complete Boolean Eval'е, будет неоднозначность результата, а значит будет попытка вычислить e.ClassType <> TSomeclass (e = nil).

Последний раз редактировалось megachuhancer; 25.01.2010 в 09:54.
megachuhancer вне форума Ответить с цитированием
Старый 26.01.2010, 02:47   #4
maxionans
Форумчанин
 
Аватар для maxionans
 
Регистрация: 02.01.2010
Сообщений: 254
По умолчанию

Если не нравится без Complete Boolean Eval, тогда
Код:
  if ( e = nil ) or ( Assigned( e ) and ( e.ClassType <> TSomeclass ) ) then
    DoSomething;
А вообще, зачем в данном случае нужна эта опция, почему нельзя её просто выключить? У меня она всегда выключена. И может было бы лучше DoSomething сделать абстрактным методом предка семейства классов, которому принадлежит e, и в классах-потомках переопределять этот метод на необходимое поведение. Тогда не будет нужна эта лишняя проверка ( e.ClassType <> TSomeclass ).
maxionans вне форума Ответить с цитированием
Старый 26.01.2010, 03:49   #5
megachuhancer
Форумчанин
 
Регистрация: 16.04.2009
Сообщений: 247
По умолчанию

Короче, я понял. Лучше просто вырубить Complete Boolean Eval, и всё.
Цитата:
А вообще, зачем в данном случае нужна эта опция, почему нельзя её просто выключить?
Да ни за чем. Просто было интересно узнать, нет ли какого-нибудь другого способа. Может, с обработкой исключений можно что-то придумать...
Справедливости ради надо отметить, что и ваш код не будет нормально работать, если эта опция включена.
megachuhancer вне форума Ответить с цитированием
Старый 27.01.2010, 00:42   #6
maxionans
Форумчанин
 
Аватар для maxionans
 
Регистрация: 02.01.2010
Сообщений: 254
По умолчанию

Цитата:
Сообщение от megachuhancer Посмотреть сообщение
Справедливости ради надо отметить, что и ваш код не будет нормально работать, если эта опция включена.
Да, действительно!

А с обработкой исключений можно как-то так:
Код:
var
  NeedProcessing : Boolean
begin
  try
    NeedProcessing := ( e.ClassType <> TSomeClass );
  except
    NeedProcessing := True;
  end;

  if NeedProcessing then DoSometing;
end;
Но делать подобные вещи через обработку исключений это дурная практика .

Последний раз редактировалось maxionans; 27.01.2010 в 00:48.
maxionans вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Улучшение кода The riddle Помощь студентам 2 07.12.2009 10:00
Продвижение, раскрутка и улучшение сайтов Viteef Обсуждение статей 3 08.12.2008 13:56
Улучшение DBLookUpComboBox 1sal1 БД в Delphi 0 20.08.2008 16:11
Улучшение зрения Манжосов Денис :) Свободное общение 13 30.04.2008 13:21