Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

if или case


Страницы:   1 2 3

начинающий2 ©   (2011-07-13 14:04:00) 

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


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

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


sniknik   (2011-07-13 15:57:00) [42]

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


stas   (2011-07-13 15:57:00) [43]

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


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


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


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

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


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

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

except
 on E: Exception do MySuperProcedure (E);


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


sniknik   (2011-07-13 15:53:00) [46]

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

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

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


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

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

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


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

Или вот, например, функция добавления записи (все функции храняться в 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) не найден.

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


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

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


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


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


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

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


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


>  except
>    on E: Exception do
>    begin


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


stas   (2011-07-13 15:27:00) [52]

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


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

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


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

посмотрите по 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


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

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


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

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


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

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


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;


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

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


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

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


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо