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

Вниз

if или case   Найти похожие ветки 

 
начинающий2   (2011-07-13 14:04) [0]

функция возвращает один из трех возможный результатов. нужно написать обработчик результата функции. так возможных результатов только 3 что разумнее всего использовать if или case


 
Омлет ©   (2011-07-13 14:08) [1]

Если это не узкое место, то выбирай более читабельный вариант.


 
Сергей М. ©   (2011-07-13 14:12) [2]

А если узкое, то выбирай более оптимальный с т.з. компилятора вариант.


 
начинающий2   (2011-07-13 14:16) [3]

что значил узкое место, во код:
какой вариает лучше


function TConnectionDataModule.GoToNext: Integer;
begin
 try

 except
   on E: Exception do
   begin
     Result := -1;
     if FRecordsGroup = RG_PRODUCTS then
       FLastErrorMessage := Format(CannotGoToNextProductRecord, [E.Message])
     else
       if FRecordsGroup = RG_CATEGORIES then
         FLastErrorMessage = Format(CannotGoToNextCategoryRecord, [E.Message])
       else
         FLastErrorMessage := Format(CannotGoToNextRecord, [E.Message]);
   end;
 end;
end;



function TConnectionDataModule.GoToNext: Integer;
begin
 try

 except
   on E: Exception do
   begin
     Result := -1;
     case FRecordsGroup of
       RG_PRODUCTS:   FLastErrorMessage := Format(CannotGoToNextProductRecord,
         [E.Message]);
       RG_CATEGORIES: FLastErrorMessage := Format(CannotGoToNextCategoryRecord,
         [E.Message]);
       else
         FLastErrorMessage := Format(CannotGoToNextRecord, [E.Message]);
     end;
   end;
 end;
end;


 
начинающий2   (2011-07-13 14:22) [4]

спрашиваю потому как где-то слышал что case генерит более оптимальный код.


 
Медвежонок Пятачок ©   (2011-07-13 14:25) [5]

ты смотрел старый советский фильм "не болит голова у дятла"?


 
SQLEXPRESS   (2011-07-13 15:05) [6]

посмотрите по ctrl+alt+с

 case i of
  1: ShowMessage( "1");
  2: ShowMessage( "2");
  3: ShowMessage( "3");
  else
    ShowMessage( "123");
 end;

 if i = 1 then ShowMessage( "1") else
   if i = 2 then ShowMessage( "2") else
     if i = 3 then ShowMessage( "3") else
       ShowMessage( "123");

uReestr.pas.146: case i of
0057BCDC 8BC3             mov eax,ebx
0057BCDE 48               dec eax
0057BCDF 7408             jz +$08
0057BCE1 48               dec eax
0057BCE2 7411             jz +$11
0057BCE4 48               dec eax
0057BCE5 741A             jz +$1a
0057BCE7 EB24             jmp +$24
uReestr.pas.147: 1: ShowMessage( "1");
0057BCE9 B868BD5700       mov eax,$0057bd68
0057BCEE E8FD9EEBFF       call ShowMessage
0057BCF3 EB22             jmp +$22
uReestr.pas.148: 2: ShowMessage( "2");
0057BCF5 B874BD5700       mov eax,$0057bd74
0057BCFA E8F19EEBFF       call ShowMessage
0057BCFF EB16             jmp +$16
uReestr.pas.149: 3: ShowMessage( "3");
0057BD01 B880BD5700       mov eax,$0057bd80
0057BD06 E8E59EEBFF       call ShowMessage
0057BD0B EB0A             jmp +$0a
uReestr.pas.151: ShowMessage( "123");
0057BD0D B88CBD5700       mov eax,$0057bd8c
0057BD12 E8D99EEBFF       call ShowMessage

uReestr.pas.154: if i = 1 then ShowMessage( "1") else
0057BD17 83FB01           cmp ebx,$01
0057BD1A 750C             jnz +$0c
0057BD1C B868BD5700       mov eax,$0057bd68
0057BD21 E8CA9EEBFF       call ShowMessage
0057BD26 EB2C             jmp +$2c
uReestr.pas.155: if i = 2 then ShowMessage( "2") else
0057BD28 83FB02           cmp ebx,$02
0057BD2B 750C             jnz +$0c
0057BD2D B874BD5700       mov eax,$0057bd74
0057BD32 E8B99EEBFF       call ShowMessage
0057BD37 EB1B             jmp +$1b
uReestr.pas.156: if i = 3 then ShowMessage( "3") else
0057BD39 83FB03           cmp ebx,$03
0057BD3C 750C             jnz +$0c
0057BD3E B880BD5700       mov eax,$0057bd80
0057BD43 E8A89EEBFF       call ShowMessage
0057BD48 EB0A             jmp +$0a
uReestr.pas.157: ShowMessage( "123");
0057BD4A B88CBD5700       mov eax,$0057bd8c
0057BD4F E89C9EEBFF       call ShowMessage


 
SQLEXPRESS   (2011-07-13 15:06) [7]

по мне - case. Нагляднее.


 
stas ©   (2011-07-13 15:27) [8]

if начинающий2=нчинающий95 then exit;


 
Игорь Шевченко ©   (2011-07-13 15:28) [9]


>  except
>    on E: Exception do
>    begin


Уже за одно это надо пускать пулю в лоб тремя очередями


 
начинающий2   (2011-07-13 15:32) [10]


> Игорь Шевченко ©   (13.07.11 15:28) [9]
>
>
> >  except
> >    on E: Exception do
> >    begin
>
>
> Уже за одно это надо пускать пулю в лоб тремя очередями


а что не так? я вывожу сообщения вида:

нельзя переместиться на следующую запись, так как [сообщение эксепшена]


 
SQLEXPRESS   (2011-07-13 15:43) [11]

except
   on E:Exception do
   begin
     E.Message := E.Message + #13#10 + " поэтому думаю, что нельзя переместиться на следующую запись";
     raise;
   end;
 end;


 
начинающий2   (2011-07-13 15:44) [12]

Или вот, например, функция добавления записи (все функции храняться в DLL библиотеке).

function TConnectionDataModule.AddRecord(GroupId, CategoryId: Integer): Integer;
var
 IsProductRecord: Boolean;
begin
 IsProductRecord := GroupId <> GROUP_0;
 try
   if (SocketConnectionStatus <> SCS_CONNECTED) or
     not HasConnectedToDatabase then
     raise Exception.CreateRes(@COnnectionNotAvailable);
   if not GroupIdIsValid(GroupId) then
     raise Exception.CreateRes(@InvalidGroupId, [GroupId]);
   if not CategoryIdIsValid(CategoryId) then
     raise Exception.CreateRes(@InvalidCategoryId, [CategoryId]);
   { ... }
 except
   on E: Exception do
   begin
     Result := -1;
     if IsProductRecord then
       FLastErrorMessage := Format(CanNotAddProductRecord, [E.Message])
     else
       FLastErrorMessage := Format(CanNotAddCategoryRecord, [E.Message]);
   end;
 end;


Человек ее вызывает, смотрит, что она возвратила. Если -1, то вызывает из этой же библиотеки функцию GetLastErrorMessage и смотрит текст ошибки. Сообщения при таком механизме получаются такого плана:

- Не удалось добавить товар, так как подключение к серверу отсутствует.
- Не удалось добавить раздел, так как подключение к серверу отсутствует.
- Не удалось добавить товар, так как группа (id = 14) не найдена.
- Не удалось добавить раздел, так как группа (id = 14) не найдена.
- Не удалось добавить товар, так как раздел (id = 17) не найден.
- Не удалось добавить раздел, так как раздел (id = 17) не найден.

Что вам не нравится, не понятно.


 
Inovet ©   (2011-07-13 15:52) [13]

> [12] начинающий2   (13.07.11 15:44)
> Что вам не нравится, не понятно.

Ты скрываешь и теряешь исходное сообщение об ошибке, взамен пишешь нечто, что может совсем не указывать на причину её возникновения. Как потом это поддерживать если ошибка неустойчивая и не повторить в лабораторных условиях, а тётенька по телевону скажет "Рамочка выскочила и на ней чё-то написано - не могу перемиститься"?


 
sniknik ©   (2011-07-13 15:53) [14]

> Что вам не нравится, не понятно.
с точки зрения поддержки получив "- Не удалось добавить товар, так как подключение к серверу отсутствует." исправь ситуацию, скажи что делать "чтобы работало"???

а ведь ты перекрыл как раз самое информативное - "нет доступа", "нет сети", "блокирован сокет", и т.д. та самая причина, что нужна, и от чего "подключение отсутствует".
т.е. ты просто сообщаешь об ошибке, как о факте, с тем же успехом можно поставить везде -  "операция завершилась ошибкой, т.к. произошла ошибка."... а закрываешь причину из-за чего она произошла.

семь лет расстрела, через день до смерти!


 
stas ©   (2011-07-13 15:54) [15]

начинающий2   (13.07.11 15:32) [10]

except
 on E: Exception do MySuperProcedure (E);


Procedure MySuperProcedure (E:EException)
begin
...
end;


 
Игорь Шевченко ©   (2011-07-13 15:55) [16]


> Что вам не нравится, не понятно.


- Не удалось добавить товар, так как Access violation at ...

читать: http://delphikingdom.com/asp/viewitem.asp?catalogid=1392


 
stas ©   (2011-07-13 15:57) [17]

Inovet ©   (13.07.11 15:52) [13]
Почему скрывает?
он выводит - Format(CanNotAddCategoryRecord, [E.Message]);


 
sniknik ©   (2011-07-13 15:57) [18]

> Человек ее вызывает, смотрит, что она возвратила.
"вызывающему человеку" похрену на все твои "изящества" (проверено практикой) у него 2 состояния - работает/не работает. и если не работает то вызывает он поддержку... которая с твоей программой затр... умучается то есть, но ничего не решит.


 
начинающий2   (2011-07-13 16:15) [19]

дело в том, что библиотека с функциями (..., AddRecord, GoToNextRecord, GoToPreviousRecord, ...) - это api для работы c торговой системой, представляет из себя ком-сервер и работать с ней будет не просто тетенька, а программист (все функции должны возвращать целочисленный результат при успешном выполнении и при ошибке). Я же стараюсь придерживаться механизма как в windows api. когда для получения подробных сведений об ошибке необходимо вызывать функцию GetLastError.


 
Медвежонок Пятачок ©   (2011-07-13 16:27) [20]

тогда ты не нужен, если будет работать программист.


 
Сергей М. ©   (2011-07-13 16:31) [21]


> не просто тетенька, а программист


В смысле что-то бесполое ?)


 
stas ©   (2011-07-13 16:38) [22]

начинающий2   (13.07.11 16:15) [19]
Используй Case и не парься ))


 
Юрий Зотов ©   (2011-07-13 16:42) [23]

> начинающий2   (13.07.11 14:04)  
> что разумнее всего использовать if или case

Ни то, ни другое.

1. Делаем такие объявления:

type
 TRG = (RG_PRODUCTS, RG_CATEGORIES, ...); // тип результата FRecordsGroup
const
 ErrMsg: array[TRG] of string =
   (CannotGoToNextProductRecord, CannotGoToNextCategoryRecord, ...);

2. И теперь не нужны ни if, ни case - все стало просто и коротко:

on E: Exception do
begin
 Result := -1;
 FLastErrorMessage := Format(ErrMsg[FRecordsGroup], [E.Message]);
end;


 
Rouse_ ©   (2011-07-13 19:15) [24]


> Игорь Шевченко ©   (13.07.11 15:28) [9]
> Уже за одно это надо пускать пулю в лоб тремя очередями

Правильно - и в первую очередь в лоб всем разработчикам VCL, или отказаться от использования оного...

зы: воть на вскидку из генофонда:

 except
   on E: Exception do
     Text := SBCDOverflow;
 end;


 
KilkennyCat ©   (2011-07-14 03:12) [25]

генофонд уже давно не пример для подражания...

А на мой взгляд, в большинстве случаев, писать надо просто безглючно и удобно, базируясь на имеющихся знаниях (если их достаточно). Процессоры сейчас мощные, винчестеры большие. Заказчик интересуется лишь конечным результатом, за который и платит. Оплата позволяет некоторое время жить. Так что, если влияние на результат пренебрежимо мало, можно вместо цикла копи-пасте забабахать, а уж потом, на полученные средства купить книжку и почитать про циклы. Если же сначала купить книжку и прочитать про циклы, то прибыль меньше.


 
Dennis I. Komarov ©   (2011-07-14 08:52) [26]


> Игорь Шевченко ©   (13.07.11 15:28) [9]
>
> >  except
> >    on E: Exception do
> >    begin
>
>
> Уже за одно это надо пускать пулю в лоб тремя очередями

НЕ согласен. Софт, работает 24/7. Ну не надо мне видеть (особенно когда некому) исключения на экране, все в лог сваливается. Так за что сразу к стенке?


 
SQLEXPRESS   (2011-07-14 09:04) [27]


> Софт, работает 24/7.

тогда к программе с такими конструкциями

except
  on E:Exception do
  begin
    E.Message := E.Message + #13#10 + " поэтому думаю, что нельзя переместиться на следующую запись";
    raise;
  end;
end;

просто добавляем ApplicationEvents, где на onError все пишем в фал

а если потребуется смотреть реальные ошибки,
тогда просто достаточно один метод убрать/обойти, а не лазить по всему тексту, вставляя Raise везде, где спрятал


 
Dennis I. Komarov ©   (2011-07-14 10:12) [28]


> SQLEXPRESS   (14.07.11 09:04) [27]

Не надо передергивать. Вопрос был за что к стенке при:
except
 on E: Exception do begin
?

> просто добавляем ApplicationEvents,

Куда?

> а не лазить по всему тексту, вставляя Raise везде, где спрятал

Все что спрятал отправил в лог...


 
SQLEXPRESS   (2011-07-14 11:25) [29]


> Не надо передергивать. Вопрос был за что к стенке при:
> except
>  on E: Exception do begin?


Дэн, читай все. Стрелять за
except
 on E: Exception do
 begin
   ToLog(E);
   ToBuffer(E);  
   ToXXX(E);
 end;
без перевозбуждения если. :)

> а не лазить по всему тексту, вставляя Raise везде, где спрятал
> Все что спрятал отправил в лог...

Твой код используют, он проглотил ошибку.
Пока еще разберутся, куда он что логгирует, проклянут 3 раза.


> > просто добавляем ApplicationEvents,
> Куда?

Вот. Куда - решит тот, кто использует.
Если это гуй - то на форму, если нет, то породит что-то в реал-тайме и привяжет.
Используя чужой код, ожидаешь от него реальную ошибку. А что с ней делать - решает обработчик выше.
Если это твой обработчик(для себя пишешь), пишешь в лог.

т.е.
если надо не стопорить приложение,
то твой обработчик самого последнего, верхнего уровня может писать в лог и гасить ошибку.

но
если его убрать,
то что бы все ошибки остались не обработанными.

А
если ты их неперевозбуждаешь,
то придется по коду лазить.

Вот ты уволился, дай бог в Газпром ушел :), твой код отдали следующему.
Он решил что-то доработать, вызвал твою функцию, она съела ошибку, он гадает, что же там такое.
vs
он отменил твой обработчик верхний, и сам получает все ошибки.
Что с ними делать - сам решает.
и ставит один свой верхний, если их опять надо гасить


 
Игорь Шевченко ©   (2011-07-14 11:37) [30]

Rouse_ ©   (13.07.11 19:15) [24]
Dennis I. Komarov ©   (14.07.11 08:52) [26]


> НЕ согласен.


Для несогласных дана ссылка на статью, читайте и воздастся


 
Dennis I. Komarov ©   (2011-07-14 12:06) [31]


> Дэн, читай все. Стрелять за

А я про [9] и только. Ибо к коду [3] и т.п. не имею никакого...


> Вот. Куда - решит тот, кто использует.
> Если это гуй - то на форму, если нет, то породит что-то
> в реал-тайме и привяжет.
> Используя чужой код, ожидаешь от него реальную ошибку. А
> что с ней делать - решает обработчик выше.
> Если это твой обработчик(для себя пишешь), пишешь в лог.
>  

А вот нету даже TApplication :P

З.Ы. Так стоило быть на столько категоричним???


> Игорь Шевченко ©   (14.07.11 11:37) [30]

Не конструктивно, слишком много букв... Суть где?

З.Ы.Ы.
  Я ниразу не ЗА, чтоб ошибки прятали за своим "красивым" текстом...


 
SQLEXPRESS   (2011-07-14 12:50) [32]


> А вот нету даже TApplication :P

Джедаи помогут :)
(даже с № строки и текстом оператора ошибку покажут)

> З.Ы. Так стоило быть на столько категоричним???
Наверное, нет :)


> Я ниразу не ЗА, чтоб ошибки прятали за своим "красивым"
> текстом...

да это понятно..

я, напрмер, устал гадать.
как же надоело подключаться к юзерам и видеть надпись "Ошибка! Обратитесь разработчику"
Человек, писавший ее, безусловно, рубил в предмете, но как же напрягает после часового просмотра трейса всяких xxxMonitir от SysInternals, обнаружить, что она пробует в монопольном режиме открыть файл,
или писать в порт,
обламывается и вот так вот говорит об этом.


 
Игорь Шевченко ©   (2011-07-14 13:28) [33]

Dennis I. Komarov ©   (14.07.11 12:06) [31]


> Не конструктивно, слишком много букв...


Статья полезная, претензии по объему - к автору. Суть в статье.


 
sniknik ©   (2011-07-14 16:06) [34]

> Человек, писавший ее, безусловно, рубил в предмете
да ламер он, тот кто "рубит", имеет опыт ("книжное" "рубление" это немного не то) никогда так не напишет.


 
Rouse_ ©   (2011-07-14 16:07) [35]


> Игорь Шевченко ©   (14.07.11 11:37) [30]
> Для несогласных дана ссылка на статью, читайте и воздастся

Для несогласных есть QualityCentral где ты совершенно спокойно можешь отписаться о багах в коде VCL и прикрепить линк на статью :)


 
sniknik ©   (2011-07-14 16:11) [36]

> "книжное" "рубление" это немного не то
можно прочитать кучу книг, и даже все, что там есть хорошо выучить, знать, но не использовать в работе... просто потому что не сталкивался/не воспринимаешь всерьез последствия.


 
SQLEXPRESS   (2011-07-14 16:32) [37]


> sniknik ©   (14.07.11 16:06) [34]

не, я имел ввиду немного другое
то что он знал, что если тут такая цифра а тут такая, то тут должна быть такая
Это правила предметной области, он тут спец.
т.е. он формализовал и алгоритмизировал то, что не каждый бы не смог.

А вот как это реализовал - да :)
это оставляет желать лучшего


 
SQLEXPRESS   (2011-07-14 16:34) [38]


>  что не каждый бы не смог.

прямо по Фрейду :)
следует читать: * не каждый бы смог такое на алгоритм положить


 
Dennis I. Komarov ©   (2011-07-14 17:26) [39]


> то что он знал, что если тут такая цифра а тут такая, то
> тут должна быть такая
> Это правила предметной области, он тут спец.

Что-то там не заметно, что он генерировал собственные исключения...


 
SQLEXPRESS   (2011-07-14 17:28) [40]


> Что-то там не заметно, что он генерировал собственные исключения.


> "Ошибка! Обратитесь разработчику"


except
 тут что-то проверяет, пытается выкрутится
 и если не выкрутились то ShowMessage
end;



Страницы: 1 2 вся ветка

Текущий архив: 2011.11.06;
Скачать: CL | DM;

Наверх




Память: 0.59 MB
Время: 0.007 c
1-1271836929
pasha_golub
2010-04-21 12:02
2011.11.06
Exceptions Type to Ignore не работает


3-1265342997
Степан
2010-02-05 07:09
2011.11.06
IBDataset обновляет не все поля


2-1310730839
Anthony
2011-07-15 15:53
2011.11.06
Изменить цвет выделения в TRichEdit


3-1265443339
lock95
2010-02-06 11:02
2011.11.06
SQL запрос ADODataSet.CommandText


6-1245670490
FireMan_Alexey
2009-06-22 15:34
2011.11.06
Как получить список открытых портов на локальной машине