Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2008.03.02;
Скачать: [xml.tar.bz2];

Вниз

Delphi типы исключений.   Найти похожие ветки 

 
Черный Шаман   (2008-01-27 17:41) [0]

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

Связано с веткой
http://delphimaster.net/view/15-1201268375/


 
Palladin ©   (2008-01-27 17:42) [1]


> Неужели только лезть в код?

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


 
Игорь Шевченко ©   (2008-01-27 17:43) [2]


> Как в Delphi узнать, какие исключения могут прийти при вызове
> данного метода/функции, чтобы в обработчике обрабатывать
> уже по типу исключения


Exception и не мучиться


 
Черный Шаман   (2008-01-27 17:49) [3]


> Palladin ©   (27.01.08 17:42) [1]
>
>
> > Неужели только лезть в код?
>
> ага, если доступен и в справку, если она доступно и там
> указано


Если там прописаны только типы исключений, около 100, то на каждый метод писать простыню

try
catch on E: Exception do
begin
if E is тип исключения then;
if E is тип исключения then;
... и так 100 раз
end;
end;

Тоесть я обрабатываю исключения которые мне нужны, но зачем мне все остальные, если я сейчас не представляю что с ними делать?


 
Palladin ©   (2008-01-27 17:51) [4]

ну так и ни делай ничего, кто тебя заставляет то? если знаешь как реагировать - реагируй, незнаешь делай Raise выше по уровню либо игнорируй... хотя правильней делать Raise дальше


 
Семеныч   (2008-01-27 17:53) [5]

> Черный Шаман   (27.01.08 17:49) [3]

Значит, их и не надо обрабатывать. Пусть идут наверх.


 
Palladin ©   (2008-01-27 17:53) [6]


> catch on E: Exception do


кстати это в какой Делфи такая конструкция появилась?


 
Семеныч   (2008-01-27 17:55) [7]

> Palladin ©   (27.01.08 17:53) [6]

Это из Jelphi или из Celphi, видимо...
:о)


 
Черный Шаман   (2008-01-27 18:00) [8]


> Palladin ©   (27.01.08 17:53) [6]
>
>
> > catch on E: Exception do
>
> кстати это в какой Делфи такая конструкция появилась?


Ну в общем слегка проглючило меня. Сейчас и с делфийский и и сишным кодом колупаюсь, вот и вылазят монстры сознания :)


 
iZEN ©   (2008-01-27 18:03) [9]


> Palladin ©   (27.01.08 17:51) [4]
>
> ну так и ни делай ничего, кто тебя заставляет то? если знаешь
> как реагировать - реагируй, незнаешь делай Raise выше по
> уровню либо игнорируй... хотя правильней делать Raise дальше

Чем правильней? Из-за простого эксепшена типа "DevisionByZero" или "EndOfFile", который неизвестно откуда из недр чужого кода (например, не описан нигде, кроме как в исходниках)  приходит в наш, и вылетает всё приложение?
Не уследили...


 
Черный Шаман   (2008-01-27 18:04) [10]


> Palladin ©   (27.01.08 17:51) [4]
>
> ну так и ни делай ничего, кто тебя заставляет то? если знаешь
> как реагировать - реагируй, незнаешь делай Raise выше по
> уровню либо игнорируй... хотя правильней делать Raise дальше


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

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

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


 
Черный Шаман   (2008-01-27 18:06) [11]


> iZEN ©   (27.01.08 18:03) [9]
>
>
> > Palladin ©   (27.01.08 17:51) [4]
> >
> > ну так и ни делай ничего, кто тебя заставляет то? если
> знаешь
> > как реагировать - реагируй, незнаешь делай Raise выше
> по
> > уровню либо игнорируй... хотя правильней делать Raise
> дальше
>
> Чем правильней? Из-за простого эксепшена типа "DevisionByZero"
> или "EndOfFile", который неизвестно откуда из недр чужого
> кода (например, не описан нигде, кроме как в исходниках)
>  приходит в наш, и вылетает всё приложение?
> Не уследили...



> ketmar ©   (26.01.08 23:25) [111]
>
> >[110] Черный Шаман (26.01.08 22:27)
> если я пишу программу, то обычно до «верхнего уровня» никто
> не доползает, ибо ловится там, где полагается. а если что-
> то доползло — делается post mortem дамп и всё схлопывается.
>  ибо это fatal error.

http://delphimaster.net/view/15-1201268375/


 
Семеныч   (2008-01-27 18:16) [12]

> iZEN ©   (27.01.08 18:03) [9]

> Чем правильней?

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

> Из-за простого эксепшена типа "DevisionByZero" или "EndOfFile", который
> неизвестно откуда из недр чужого кода

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


 
Palladin ©   (2008-01-27 18:17) [13]

Это он пошутил... настолько жестко контролировать исключения может только тот - кто не использует ничего стороннего, кроме своего...


 
Anatoly Podgoretsky ©   (2008-01-27 18:18) [14]

> Черный Шаман  (27.01.2008 18:04:10)  [10]

О да, именно так и поступают, пишут - не удалось подключиться, а ты как дурак думай к чему и почему.
Верный последователь Вредных заветов и советов.


 
Anatoly Podgoretsky ©   (2008-01-27 18:20) [15]

> Palladin  (27.01.2008 18:17:13)  [13]

То есть Дельфи написал с нуля.


 
DVM ©   (2008-01-27 18:25) [16]


> Семеныч


> Если же исключение просто подавить, то программа, скорее
> всего, работать будет неверно, но знать об этом никто не
> будет. Такая программа в миллион раз хуже.

Ну конечно. Кому должен сигналить сервер об исключении и останавливаться?


 
Семеныч   (2008-01-27 18:36) [17]

> DVM ©   (27.01.08 18:25) [16]

Здравый смысл говорит о том, что не стоит все понимать буквально. Он же говорит о том, что и сервер надо строить по той же схеме: исключение должно либо обрабатываться там, где известно, как его обрабатывать, либо проходить на самый верх. Но если мы пишем сервер, то на самом верху все необработанные исключения тоже перехватываются и пишутся в лог (поскольку ничего другого все равно не остается).


 
Anatoly Podgoretsky ©   (2008-01-27 18:38) [18]

> DVM  (27.01.2008 18:25:16)  [16]

Ты хочешь обсудить "конкретную" программу?
Тогда приводи код и описание работы, с учетом всех неожиданных ситуаций.


 
DVM ©   (2008-01-27 18:43) [19]


> Семеныч


> то на самом верху все необработанные исключения тоже перехватываются
> и пишутся в лог

Т.е. все таки они подавляются.


> Anatoly Podgoretsky ©


> Ты хочешь обсудить "конкретную" программу?

Конкретную программу обсуждать здесь только флуд плодить.


 
Palladin ©   (2008-01-27 18:44) [20]


> [19] DVM ©   (27.01.08 18:43)

подавление - не делать ничего, а это, извини меня, немножко отличается от записи в лог (и, в случае возможности, уведомления клиента)


 
DVM ©   (2008-01-27 18:47) [21]


> подавление - не делать ничего, а это, извини меня, немножко
> отличается от записи в лог

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


 
Palladin ©   (2008-01-27 18:52) [22]

ааа, батенька :) вот тот и приходит необходимость определения пресловутого "верх"... исключение нужно гнать наверх настолько насколько это необходимо, если логика приложения требует, то всегда определен свой "верх", отличный от по умолчанию, там то и прописана реакция на все непойманные "ниже" исключения... и конечно после записи в лог его сразу давить нужно... свое предназначение оно выполнило... но нужно осозновать что в лог писать нужно его как раз на том самом "верху"... ведь за ним Москва!


 
Anatoly Podgoretsky ©   (2008-01-27 18:53) [23]

> DVM  (27.01.2008 18:43:19)  [19]

Не подавляются, а пишутся в ЛОГ, а это большая разница и такова природа серверов, нельзя давить исключение, оно должно быть как то обработано, что бы не потерялось, и что бы при этом сервер не вылетел по исключению.


 
DVM ©   (2008-01-27 18:54) [24]


> Palladin ©   (27.01.08 18:52) [22]

А, ну да. Вобщем верно.


 
DVM ©   (2008-01-27 18:57) [25]


> Anatoly Podgoretsky ©


> Не подавляются, а пишутся в ЛОГ, а это большая разница и
> такова природа серверов, нельзя давить исключение

В моем понимании "давить" это

try
 ...
except
 что-то делаем
end;

Не пустой try...except...end;


 
Anatoly Podgoretsky ©   (2008-01-27 19:08) [26]

> DVM  (27.01.2008 18:57:25)  [25]

Это не давить, а что то делать, например: написать в лог и по интервалу послать письмо админу.


 
Черный Шаман   (2008-01-27 19:08) [27]


> Anatoly Podgoretsky ©   (27.01.08 18:18) [14]
>
> > Черный Шаман  (27.01.2008 18:04:10)  [10]
>
> О да, именно так и поступают, пишут - не удалось подключиться,
>  а ты как дурак думай к чему и почему.
> Верный последователь Вредных заветов и советов.


Ну зачем так. Для того кто разбирается есть лог ошибок, где все исключения даже обрабатываемые туда заносятся. Для обычного пользователя оно(почему не удалось подключится) и не нужно.


 
DVM ©   (2008-01-27 19:09) [28]

> Anatoly Podgoretsky ©

> Это не давить, а что то делать,

Тогда значит мы о разном говорили.


 
Черный Шаман   (2008-01-27 19:12) [29]


> Anatoly Podgoretsky ©   (27.01.08 18:38) [18]
>
> > DVM  (27.01.2008 18:25:16)  [16]
>
> Ты хочешь обсудить "конкретную" программу?
> Тогда приводи код и описание работы, с учетом всех неожиданных
> ситуаций.


Пример, данные с устройства взаимодействующего по TCP/IP ловятся и пишутся в базу. Иногда устройство пропадает из видимости, иногда сервер базы данных то что делать -
1. программе упасть
2. программе упасть вместе с перезагрузкой сервера
3. логировать исключения и пытаться переподключится к базе или устройству до остановки сервиса или появления работоспособности.


 
Семеныч   (2008-01-27 19:12) [30]

> DVM ©   (27.01.08 18:43) [19]
> Т.е. все таки они подавляются.
Нет, они обрабатываются. Запись в лог - это и есть обработка.

> DVM ©   (27.01.08 18:47) [21]
> почему бы просто не записать в лог по месту и там же его подавить, а не
> гнать исключение "наверх"?

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

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

> DVM ©   (27.01.08 18:57) [25]
> В моем понимании "давить" это
> ... Не пустой try...except...end;

В Вашем -возможно. А в обычном, непустой try-except - это не "давить", а "обрабатывать".


 
Anatoly Podgoretsky ©   (2008-01-27 19:13) [31]

> DVM  (27.01.2008 19:09:28)  [28]

Я давить понимаю одназначно


try
 ...
except
end;


Программа работает без ошибок.
Обработка ошибок


try
  ...
except
  ...
end;

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


 
Черный Шаман   (2008-01-27 19:17) [32]


> Anatoly Podgoretsky ©   (27.01.08 19:08) [26]
>
> > DVM  (27.01.2008 18:57:25)  [25]
>
> Это не давить, а что то делать, например: написать в лог
> и по интервалу послать письмо админу.


Нет уж, это давить. лог - частный случай исключения показываемого в messagebox.

А обрабатывать, тоесть выполнять код который пытается логическо-физически исправить ситуацию удаётся довольно редко.


 
Игорь Шевченко ©   (2008-01-27 19:20) [33]

Черный Шаман   (27.01.08 19:17) [32]


> А обрабатывать, тоесть выполнять код который пытается логическо-
> физически исправить ситуацию удаётся довольно редко.


Ситуацию нельзя исправить никогда.


 
Семеныч   (2008-01-27 19:21) [34]

> Anatoly Podgoretsky ©   (27.01.08 19:13) [31]

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

"Произошла ошибка класса " + e.ClassName + ": " + e.Message + ""."#13#10 +
"Обратитесь к тому-то."


 
Черный Шаман   (2008-01-27 19:22) [35]


> Anatoly Podgoretsky ©   (27.01.08 19:13) [31]
>
> > DVM  (27.01.2008 19:09:28)  [28]
>
> Я давить понимаю одназначно
> И ни в коем случае не срывать подлинную ошибку, заменяя
> ее своей - Проишла ошибка, обратитесь к программисту.


Я до этого работал в НИИ, так вот там было требование - все ошибки должны быть только на украинском языке, а лог никому был не нужен, даже пришлось убрать. Так что была конструкция

try
except on E:Exception do
MessageBoxA(...Не вдалося запис в базу елемента меню...)
end;

Так что иногда такой код - code standart.


 
DVM ©   (2008-01-27 19:25) [36]


> Семеныч   (27.01.08 19:21) [34]

Юзер будет глядеть на это сообщение как баран на новые ворота.


 
Черный Шаман   (2008-01-27 19:25) [37]


> Игорь Шевченко ©   (27.01.08 19:20) [33]
>
> Черный Шаман   (27.01.08 19:17) [32]
>
> > А обрабатывать, тоесть выполнять код который пытается
> логическо-
> > физически исправить ситуацию удаётся довольно редко.
>
> Ситуацию нельзя исправить никогда.


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


 
Anatoly Podgoretsky ©   (2008-01-27 19:25) [38]

> Черный Шаман  (27.01.2008 19:17:32)  [32]

Чудна твоя терминология, отличается от общепринятой.


 
Семеныч   (2008-01-27 19:27) [39]

> Игорь Шевченко ©   (27.01.08 19:20) [33]

Юзер ввел в Edit заведомо неверные данные и жмякнул ОК. Программа обнаружила его ошибку и вместо того, чтобы принять данные и закрыть диалог ввода, выдала ему вразумительное сообщение и попросила либо исправить данные, либо нажать "отмену".

Данные программа не исправила, она этого и не могла сделать. А ситуацию - исправила. И совершенно спокойно может продолжать работать.


 
DVM ©   (2008-01-27 19:30) [40]

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

Выдача различных MessageBox - это плохой вариант. Лучше посвечивать место ошибки (Edit) и делать подпись рядом с ним. Юзеры адекватнее реагируют.


 
Семеныч   (2008-01-27 19:30) [41]

> DVM ©   (27.01.08 19:25) [36]

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


 
Petr V. Abramov ©   (2008-01-27 19:34) [42]


> Семеныч   (27.01.08 19:30) [41]

"те-то" могут не понять такой подход :)


 
DVM ©   (2008-01-27 19:35) [43]


> Там четко написано - обратись к тому-то.

И что там указано? ФИО, должность, телефон?


 
DVM ©   (2008-01-27 19:36) [44]


> Petr V. Abramov ©   (27.01.08 19:34) [42]


> "те-то" могут не понять такой подход :)

А, я понял, там врагов можно указывать.


 
Черный Шаман   (2008-01-27 19:37) [45]


> Семеныч   (27.01.08 19:27) [39]
>
> > Игорь Шевченко ©   (27.01.08 19:20) [33]
>
> Юзер ввел в Edit заведомо неверные данные и жмякнул ОК.
> Программа обнаружила его ошибку и вместо того, чтобы принять
> данные и закрыть диалог ввода, выдала ему вразумительное
> сообщение и попросила либо исправить данные, либо нажать
> "отмену".
>
> Данные программа не исправила, она этого и не могла сделать.
>  А ситуацию - исправила. И совершенно спокойно может продолжать
> работать.


А зачем для этого исключения если достаточно кода возврата?


 
DVM ©   (2008-01-27 19:39) [46]


> Черный Шаман   (27.01.08 19:37) [45]

Вот я того же мнения. Наверное это навеяно довольно долгим моим общением с "чиста WinAPI", где исключения это редкость. Я как то не принимаю эту (не спорю, неплохую по сути своей) идею с исключениями.


 
Семеныч   (2008-01-27 19:43) [47]

> DVM ©   (27.01.08 19:35) [43]
> И что там указано? ФИО, должность, телефон?

Должность. А ФИО и телефон этой должности юзер должен знать сам. Это уже вопросы организационные, а не технические. Их программа не решает и решать не должна.

> Черный Шаман   (27.01.08 19:37) [45]
> А зачем для этого исключения если достаточно кода возврата?

Хорошо, пусть диалог вернул код возврата. И что с ним дальше делать?


 
Anatoly Podgoretsky ©   (2008-01-27 19:43) [48]

> Семеныч  (27.01.2008 19:21:34)  [34]

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


 
DVM ©   (2008-01-27 19:44) [49]


> И что с ним дальше делать?

Как что? Исключение генерить, а затем давить :)


 
Anatoly Podgoretsky ©   (2008-01-27 19:44) [50]

> Черный Шаман  (27.01.2008 19:22:35)  [35]

И Виндоус и прочие посторонние программы вы хакали?
А то требование не выполнимо или двойные стандарты, или как там у вас.


 
Anatoly Podgoretsky ©   (2008-01-27 19:45) [51]

> DVM  (27.01.2008 19:25:36)  [36]

Такой дурной пользователь, что не в состоянии прочитать это - "Обратитесь к тому-то."


 
Семеныч   (2008-01-27 19:46) [52]

> DVM ©   (27.01.08 19:39) [46]

> Я как то не принимаю эту (не спорю, неплохую по сути своей) идею с
> исключениями.

Ее надо просто понять. Прочувствовать, так сказать. Кодов возврата никто не отменял и в некоторых ситуациях они действительно удобнее и логичнее, чем исключения. А в некоторых - наоборот. Все хорошо в свое время в своем месте.


 
DVM ©   (2008-01-27 19:47) [53]


> Такой дурной пользователь, что не в состоянии прочитать
> это - "Обратитесь к тому-то."

Зачем ему там про тип исключения писать?


 
Anatoly Podgoretsky ©   (2008-01-27 19:48) [54]

> Семеныч  (27.01.2008 19:27:39)  [39]

Ситуацию она не исправила, данные как были неправильными, так ими и остались, исправить она поручила пользователю.


 
DVM ©   (2008-01-27 19:49) [55]


> Семеныч   (27.01.08 19:46) [52]


> Ее надо просто понять.

Да я не сказть, что ее не понимаю, скорее не принимаю как то. Несмотря на это использую как положено чаще всего.


 
Anatoly Podgoretsky ©   (2008-01-27 19:53) [56]

> DVM  (27.01.2008 19:47:53)  [53]

Затем, что я могу ответить ему по телефону, а что делать на голое "Обратитесь к тому-то."


 
Anatoly Podgoretsky ©   (2008-01-27 19:54) [57]

> Palladin  (27.01.2008 18:52:22)  [22]

Напоминает, как обрабатывались исключения в Нортон Антивирус, догадались же при каждом вирусе в почте выдавать сообщения, первое же исключение поставило сервер на колени.
Правда и у админов хватило ума поставить антивирус на сервере и выдавать окошки с исключениями, но и пользователям не сладко тоже было, я помню ту эпидемию, мне за час свалилось несколько тысяч писем с вирусами.
Исключение в виде сообщения должно быть только там, где есть читатель.


 
Семеныч   (2008-01-27 19:54) [58]

> DVM ©   (27.01.08 19:47) [53]
> Зачем ему там про тип исключения писать?
Чтобы "тому-то", когда он придет, было легче разбираться.

> Anatoly Podgoretsky ©   (27.01.08 19:48) [54]
> Ситуацию она не исправила, данные как были неправильными,
> так ими и остались, исправить она поручила пользователю.

Она исправила ситуацию в смысле, наиболее часто в программизме  понимаемом - в смысле конечного автомата. Недопустимое состояние было сведено к допустимому и поэтому программа может работать дальше.


 
Черный Шаман   (2008-01-27 19:58) [59]


> Anatoly Podgoretsky ©   (27.01.08 19:44) [50]
>
> > Черный Шаман  (27.01.2008 19:22:35)  [35]
>
> И Виндоус и прочие посторонние программы вы хакали?
> А то требование не выполнимо или двойные стандарты, или
> как там у вас.


Нет, украинское правительство не выделило денег на UAOS полностью на украинском языке, так что заказчики(украинские военные) использовали русскую тыреную Win2000. У нас все таки нет газа и денег на национальную ОС.


 
DVM ©   (2008-01-27 19:58) [60]


> Семеныч   (27.01.08 19:54) [58]


> Чтобы "тому-то", когда он придет, было легче разбираться.

Все таки, тому кто придет (если вообще придет, лучше бы по почте) больше бы помог подробный лог. Пользователя только пугать такими сообщениями.
Кстати, подмечено, если программа выдает сообщения об ошибках с кучей технической инфы, непонятной пользователю (типа Access Violation), то она слывет глючной. А понятные сообщения, без лишних подробностей - нет.


 
Черный Шаман   (2008-01-27 20:00) [61]


> Семеныч   (27.01.08 19:46) [52]
>
> > DVM ©   (27.01.08 19:39) [46]
>
> > Я как то не принимаю эту (не спорю, неплохую по сути своей)
> идею с
> > исключениями.
>
> Ее надо просто понять. Прочувствовать, так сказать. Кодов
> возврата никто не отменял и в некоторых ситуациях они действительно
> удобнее и логичнее, чем исключения. А в некоторых - наоборот.
>  Все хорошо в свое время в своем месте.


Единственный случай когда исключение полезно - в конструкторе объекта если создание объекта в данном случае нелогично. Объект автоматически буде уничтожен(прервано создание). Вот здесь исключение полезнее кода возврата.


 
Anatoly Podgoretsky ©   (2008-01-27 20:03) [62]

> Черный Шаман  (27.01.2008 19:58:59)  [59]

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


 
Семеныч   (2008-01-27 20:06) [63]

> Черный Шаман   (27.01.08 20:00) [61]

Повторю вопрос: после нажатия ОК форма диалога проверила введенные юзером данные, обнаружила в них заведомую ошибку, закрылась и вернула код возврата. Что программа должна с этим кодом дальше делать?


 
Черный Шаман   (2008-01-27 20:06) [64]


> Anatoly Podgoretsky ©   (27.01.08 20:03) [62]
>
> > Черный Шаман  (27.01.2008 19:58:59)  [59]
>
> Газ у вас есть и по словам одного академика больше, чем
> у кого либо в мире.


Так и академики у нас разработали тепловой котёл с КПД 112%. Законы физики можно изменять, доказано НАНУ.


 
Anatoly Podgoretsky ©   (2008-01-27 20:07) [65]

То то я вашим политикам и академикам не верю.


 
Черный Шаман   (2008-01-27 20:08) [66]


> Семеныч   (27.01.08 20:06) [63]
>
> > Черный Шаман   (27.01.08 20:00) [61]
>
> Повторю вопрос: после нажатия ОК форма диалога проверила
> введенные юзером данные, обнаружила в них заведомую ошибку,
>  закрылась и вернула код возврата. Что программа должна
> с этим кодом дальше делать?


В зависимости от кода возврата процедуры проверки. Обычно у меня код возврата булевый. Например при false стереть edit и установить фокус на него.


 
Anatoly Podgoretsky ©   (2008-01-27 20:09) [67]

> Черный Шаман  (27.01.2008 20:08:06)  [66]

> при false стереть edit

Ну ты и зверь


 
Черный Шаман   (2008-01-27 20:10) [68]


> Anatoly Podgoretsky ©   (27.01.08 20:07) [65]
>
> То то я вашим политикам и академикам не верю.


Ну политики у нас даже часто сами немного верят в то, что и говорят. У нас истинно европейские политики.


 
Petr V. Abramov ©   (2008-01-27 20:10) [69]


> Например при false стереть edit и установить фокус на него.

жестоко :)
а если там ошибка в одной букве?


 
Черный Шаман   (2008-01-27 20:12) [70]


> Anatoly Podgoretsky ©   (27.01.08 20:09) [67]
>
> > Черный Шаман  (27.01.2008 20:08:06)  [66]
>
> > при false стереть edit
>
> Ну ты и зверь


Ну так у меня в окне логина сделано - стандартное решение.


> Petr V. Abramov ©   (27.01.08 20:10) [69]
>
>
> > Например при false стереть edit и установить фокус на
> него.
>
> жестоко :)
> а если там ошибка в одной букве?


Там тоже есть - фокус устанавливается на первый Edit в котором неправильное значение + опционально(по требованиям заказчика) выдаётся messagebox с перечислением ошибок.


 
DVM ©   (2008-01-27 20:13) [71]


> Ну ты и зверь

Типичный пример номер кредитки. Я б убил того, кто мне сотрет набранное, если после проверки ошибка была в одной цифре.


 
Черный Шаман   (2008-01-27 20:13) [72]


> Petr V. Abramov ©   (27.01.08 20:10) [69]
>
>
> > Например при false стереть edit и установить фокус на
> него.
>
> жестоко :)
> а если там ошибка в одной букве?


А если бы процедура вернула не код а exception, то что бы изменилось?


 
Черный Шаман   (2008-01-27 20:14) [73]


> DVM ©   (27.01.08 20:13) [71]
>
>
> > Ну ты и зверь
>
> Типичный пример номер кредитки. Я б убил того, кто мне сотрет
> набранное, если после проверки ошибка была в одной цифре.


А я бы после трех ошибок заблокировал IP и отправил письмо в СБ.


 
DVM ©   (2008-01-27 20:16) [74]


> А я бы после трех ошибок заблокировал IP и отправил письмо
> в СБ.

А если программа для банка и предназначена? Имхо все же стирать - это жестоко. Лучше подсветить, а еще лучше подписать в чем ошибка.


 
Anatoly Podgoretsky ©   (2008-01-27 20:26) [75]

> Черный Шаман  (27.01.2008 20:12:10)  [70]

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


 
Anatoly Podgoretsky ©   (2008-01-27 20:27) [76]

> Черный Шаман  (27.01.2008 20:13:12)  [72]

А точно также, не трогай - не твое.
А код или исключение роли не играет.


 
Игорь Шевченко ©   (2008-01-27 20:40) [77]

Черный Шаман   (27.01.08 19:25) [37]


> Иногда можно - если формат хранилища  невосстановимо разрушен,
>  пересоздать его, если данные в реестре некорректны пересоздать
> их с чистого листа...


Если винт не отформатирован - отформатировать его.
Если формат хранилища разрушен, это не исключительная ситуация, а возврат кода ошибки методом проверки формата хранилища.
Разницу чувствуешь ?

Семеныч   (27.01.08 19:27) [39]


> Юзер ввел в Edit заведомо неверные данные и жмякнул ОК.
> Программа обнаружила его ошибку и вместо того, чтобы принять
> данные и закрыть диалог ввода, выдала ему вразумительное
> сообщение и попросила либо исправить данные, либо нажать
> "отмену".
>
> Данные программа не исправила, она этого и не могла сделать.
>  А ситуацию - исправила. И совершенно спокойно может продолжать
> работать.


Тут можно долго бодаться с терминологией, я согласен с А.П. [54]


 
Семеныч   (2008-01-27 20:51) [78]

> Черный Шаман   (27.01.08 20:08) [66]

> при false стереть edit и установить фокус на него.

Какой Edit? Никаких Edit"ов уже нет - диалог-то уже закрылся. Иначе как он мог вернуть код возврата, не закрываясь? Диалоги - же они по сути своей должны быть модальными. Или второй раз поднимать тот же диалог? А зачем такие сложности городить?

Но если использовать не код возврата, а исключение, то диалог может и не закрываться. Диалог проверяет ввод, обнаруживает ошибку и выдает исключение. Юзер видит сообщение, где по-русски сказано, что у него в таком-то поле такая-то ошибка (причем одновременно видит и само это поле, и ошибочный текст в нем - то есть, юзеру легче понять свою ошибку). Уяснив, в чем дело, юзер жмет ОК в сообщении и оно гаснет. Потом юзер правит текст и жмет ОК в диалоге. Тот снова проверяет данные, видит, что ошибок нет и закрывается. А вызывающий код только  проверяет ModalResult - и наверняка знает, что если он равен mrOK, то данные точно правильные и их можно смело принимать (а если mrCancel, то ничего делать не надо).

И все логично, и все просто, и все всем удобно.


 
DVM ©   (2008-01-27 20:58) [79]


> И все логично, и все просто, и все всем удобно.

Я все то же самое делаю, без привязки к исключениям.


 
DVM ©   (2008-01-27 21:00) [80]


> Семеныч

В диалоге кнопки OK и Отмена. Нажатие кнопки Ок проверяет поля и если что не так сообщает пользователю об ошибках и предлагает исправить. Если ошибок нет, то ModalResult:=mrOk;


 
Черный Шаман   (2008-01-27 21:01) [81]


> Игорь Шевченко ©   (27.01.08 20:40) [77]
> > Юзер ввел в Edit заведомо неверные данные и жмякнул ОК.
>
> > Программа обнаружила его ошибку и вместо того, чтобы принять
> > данные и закрыть диалог ввода, выдала ему вразумительное
> > сообщение и попросила либо исправить данные, либо нажать
> > "отмену".
> >
> > Данные программа не исправила, она этого и не могла сделать.
>
> >  А ситуацию - исправила. И совершенно спокойно может продолжать
> > работать.
>
>
> Тут можно долго бодаться с терминологией, я согласен с А.
> П. [54]


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


 
Черный Шаман   (2008-01-27 21:02) [82]


> Семеныч   (27.01.08 20:51) [78]
>
> > Черный Шаман   (27.01.08 20:08) [66]
>
> > при false стереть edit и установить фокус на него.
>
> Какой Edit? Никаких Edit"ов уже нет - диалог-то уже закрылся.
>  Иначе как он мог вернуть код возврата, не закрываясь? Диалоги
> - же они по сути своей должны быть модальными. Или второй
> раз поднимать тот же диалог? А зачем такие сложности городить?
>
>
> Но если использовать не код возврата, а исключение, то диалог
> может и не закрываться
.


if then Exit?


 
Anatoly Podgoretsky ©   (2008-01-27 21:04) [83]

> DVM  (27.01.2008 21:00:20)  [80]

Именно там и желательно подсветить все поля, а не только первое которое неверное, а фокус установить на первое неверно, по TabOrder
Если это не сделать, то пользователь возможно долго будет устранять ошибки.


 
Семеныч   (2008-01-27 21:27) [84]

> Черный Шаман   (27.01.08 21:02) [82]

> if then Exit?

???????????

Пусть мы имеем N разных диалоговых форм ввода. Делам их предка. В нем ставим стиль "диалог", кнопки ОК (с Default=True) и Отмена (с Cancel=True и ModalResult=mrCancel), абстрактный метод validate и обработчик OK.OnClick. В этом обработчике 2 строчки:

Validate;
ModalResult := mrOK;

Все это значит, что диалог закроется только если:
- юзер нажал кнопку Отмена (вызывающий код получит mrCancel);
- юзер ввел верные данные и нажал ОК (вызывающий код получитmrOK) .

От этого предка плодим конкретные формы ввода. Каждая форма знает свои поля и какие данные в них допустимы, а какие заведомо недопустимы. Поэтому каждая конкретная форма может свои данные проверить. Это она делает в методе Validate. Если код этого метода обнаружил ошибку, то он просто поднимает Exception с вразумительным текстом. Например:

procedure TSomeForm.Validate;
begin
 if TargetName = "" then
   raise EInvalidInput.Create("Необходимо указать наименование");
 if StartDate > FinishDate then
   raise EInvalidInput.Create("Дата начала не может быть позже даты окончания");
 ... // и т.п.
end;

Это единственный метод, который должна реализовать каждая форма ввода, весь остальной функционал уже зашит в предке. Вызывающий код тоже единообразен и прост до невозможности:

with TSomeForm.Create(nil) do
try
 if ShowModal = mrOK then
 begin
   ... // Забираем введенные юзером данные
 end;
finally
 Free;
end;

Какие Exit? Все просто, как веник.


 
Семеныч   (2008-01-27 21:31) [85]

> DVM ©   (27.01.08 21:00) [80]

Так и я о том же. И никакие коды возврата не нужны. А сообщение об ошибке удобно выдавать юзеру именно через Exception - тогда код валидации становится максимально простым (см. выше).


 
DVM ©   (2008-01-27 21:37) [86]


> тогда код валидации становится максимально простым (см.
> выше).

Ну простым или нет это спорный вопрос. Короче он точно сильно не становится. А вот читабельнее - это кому как нравится. Кому то удобнее выдавать сообщения об шибке по месту и потом делать Exit, кому то складировать все сообщения об ошибках после except.


 
Черный Шаман   (2008-01-27 21:46) [87]


>
> Пусть мы имеем N разных диалоговых форм ввода. Делам их
> предка. В нем ставим стиль "диалог", кнопки ОК (с Default=True)
> и Отмена (с Cancel=True и ModalResult=mrCancel), абстрактный
> метод validate и обработчик OK.OnClick. В этом обработчике
> 2 строчки:
>
> Validate;
> ModalResult := mrOK;


if Validate then
ModalResult := mrOK;


 
Игорь Шевченко ©   (2008-01-27 21:56) [88]

Семеныч   (27.01.08 21:27) [84]


> Пусть мы имеем N разных диалоговых форм ввода. Делам их
> предка. В нем ставим стиль "диалог", кнопки ОК (с Default=True)
> и Отмена (с Cancel=True и ModalResult=mrCancel), абстрактный
> метод validate и обработчик OK.OnClick. В этом обработчике
> 2 строчки:
>
> Validate;
> ModalResult := mrOK;


При вводе я примерно также делаю, за одним исключением:

if Validate then
 ModalResult := mrOk

Мне необработанные конкретной формой исключения совсем неинтересны.


> Это единственный метод, который должна реализовать каждая
> форма ввода, весь остальной функционал уже зашит в предке.
>  Вызывающий код тоже единообразен и прост до невозможности:
>
>
> with TSomeForm.Create(nil) do
> try
>  if ShowModal = mrOK then
>  begin
>    ... // Забираем введенные юзером данные
>  end;
> finally
>  Free;
> end;


Я бы Free убрал.


 
Семеныч   (2008-01-27 21:58) [89]

> Черный Шаман   (27.01.08 21:46) [87]

Угу. И вот ТОГДА как раз в Validate и придется писать Ваши if - exit:

if Чих1 then
begin
 MessageBox(...);
 Result := False;
 Exit;
end;

Вместо:

if Чих1 then
 raise EInvalidInput.Create(...);

И таких "Чихов" будет не один. Что проще и короче?


 
DVM ©   (2008-01-27 22:01) [90]


> И таких "Чихов" будет не один. Что проще и короче?

Конечно проще и короче второй, но EInvalidInput надо где то определить - это раз, потом это напоминает какую-то современную реинкарнацию goto


 
Семеныч   (2008-01-27 22:01) [91]

> Игорь Шевченко ©   (27.01.08 21:56) [88]

> Я бы Free убрал.

От задачи зависит. Если форма не должна хранить последние введенные в нее данные, то и держать ее незачем.


 
Семеныч   (2008-01-27 22:03) [92]

> DVM ©   (27.01.08 22:01) [90]
> напоминает какую-то современную реинкарнацию goto

А Exit ее не напоминает?
:о)


 
DVM ©   (2008-01-27 22:03) [93]


> А Exit ее не напоминает?

А можно и без него.


 
Игорь Шевченко ©   (2008-01-27 22:04) [94]

Семеныч   (27.01.08 22:01) [91]


> От задачи зависит. Если форма не должна хранить последние
> введенные в нее данные, то и держать ее незачем.


Безусловно


 
DVM ©   (2008-01-27 22:05) [95]


> От задачи зависит. Если форма не должна хранить последние
> введенные в нее данные, то и держать ее незачем.

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


 
Семеныч   (2008-01-27 22:22) [96]

> Игорь Шевченко ©   (27.01.08 21:56) [88]
> Мне необработанные конкретной формой исключения совсем неинтересны.
Они приходят в дефолтный обработчик. Нормально.

> DVM ©   (27.01.08 22:01) [90]
> EInvalidInput надо где то определить
Одна строчка на всю программу. Не вопрос.

> DVM ©   (27.01.08 22:03) [93]
Можно и без Exit. Но многоступенчатый if-then-else вдохновляет еще меньше.

DVM ©   (27.01.08 22:05) [95]
> Более красиво в конструктор передать...
Тоже от задачи зависит. Да и к сабжу не относится.


 
DVM ©   (2008-01-27 22:27) [97]


> Семеныч   (27.01.08 22:22) [96]


> Тоже от задачи зависит.

Я думаю, что не зависит, за редким исключением.

Обращение к полям другой формы - это лишние зависимости между формами. А если передать структуру в конструктор, то общение с такой формой будет сведено к одной единственной функции. Ну да это действительно к сабжу не относится.


 
DVM ©   (2008-01-27 22:28) [98]


> Семеныч   (27.01.08 22:22) [96]


> Можно и без Exit. Но многоступенчатый if-then-else вдохновляет
> еще меньше.

Будучи должным образом отформатирован, он воспринимается без проблем.
И не похож на Goto.


 
Семеныч   (2008-01-27 22:35) [99]

> DVM ©   (27.01.08 22:28) [98]

goto ReturnPoint воспринимается с еще меньшими проблемами, чем двадцатиэтажный if.
:о)


 
DVM ©   (2008-01-27 22:40) [100]


> Семеныч   (27.01.08 22:35) [99]

Ну я ж говорю в [86] - кому как нравится.  Да и против Goto я тоже ничего особого не имею, даже один у меня есть в одной программе - с ним красивее даже.


 
ketmar ©   (2008-01-27 22:57) [101]

>[13] Palladin ©(27.01.08 18:17)
>Это он пошутил… настолько жестко контролировать исключения может только
>тот — кто не использует ничего стороннего, кроме своего…

это он не пошутил. это у него привычка для production code так делать. потому что есть не падать с post mortem dump, то узнать, что там у заказчика произошло — невозможно. максимум, на что стоит раасичтывать — это на невнятное «ну, тут это, какое-то окошко вылезло с непонятными словами, которые я не читал». ни точного описания, ни состояния программы на данный момент обычно добиться не возможно. а в дампе я хоть глянуть могу, что было-то. ну и, натурально, пока я пишу и тестирую, куча «неучтённых» исключений таки находит «последние приюты».

>[78] Семеныч (27.01.08 20:51)
>иалоги — же они по сути своей должны быть модальными.
это идиотская идея. к тому же — а кто тебе виноват, что кнопочка «OK» у тебя разрешена с неверным вводом? сей кнопкой должен управлять валидатор. который тупо не сделает ей Enabled := true, пока юзер не настучит верных данных. это ежели простой диалог. ежели сложный — то по нажатию «OK» мы опять же не закрываемся, а вызываем внешний валидатор, временно задизаблив все диалоговые контролы, если процесс ожидается долгий. а когда валидатор срыгнёт местом с неверным вводом — поясняем юзеру, что с такими консервами консерватория не работает.

зачем тут какие-то исключения и прочие извраты — не ясно.


 
Игорь Шевченко ©   (2008-01-27 23:01) [102]

Семеныч   (27.01.08 22:22) [96]


> Они приходят в дефолтный обработчик. Нормально.


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


 
Игорь Шевченко ©   (2008-01-27 23:03) [103]

ketmar ©   (27.01.08 22:57) [101]

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


> сей кнопкой должен управлять валидатор. который тупо не
> сделает ей Enabled := true, пока юзер не настучит верных
> данных. это ежели простой диалог. ежели сложный — то по
> нажатию «OK» мы опять же не закрываемся, а вызываем внешний
> валидатор, временно задизаблив все диалоговые контролы,
> если процесс ожидается долгий. а когда валидатор срыгнёт
> местом с неверным вводом — поясняем юзеру, что с такими
> консервами консерватория не работает.


Примерно так. Только что нельзя делать enabled:=false по первоначальному вызову формы, ибо пугаются.


 
DVM ©   (2008-01-27 23:07) [104]

Да не нужны там игры с Enabled, достаточно ModalResult нужный присваивать в обработчике нажатия кнопки и все. Свойство ModalResult для кнопки по умолчанию не назначать.


 
Семеныч   (2008-01-27 23:14) [105]

> ketmar ©   (27.01.08 22:57) [101]

> это идиотская идея.

Наоборот. Идиотская идея - это вот что:
- юзер выбирает какую-то запись в каком-то списке и жмет "Изменить";
- выводится немодольный диалог изменения полей этой записи;
- и юзер имеет возможность выбрать другую запись, не закрыв диалога. К какой записи теперь относится диалог - непонятно.

> кнопочка «OK» у тебя разрешена с неверным вводом? сей кнопкой
> должен управлять валидатор. который тупо не сделает ей Enabled
> := true, пока юзер не настучит верных данных.

И бедняга юзер сидит и не понимает, почему у него ОК недоступна. Он же не знает, что TargetName может содержать только буквы и цифры.

> ежели сложный — то по нажатию «OK» мы опять же не закрываемся,
> а вызываем внешний валидатор

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

> зачем тут какие-то исключения и прочие извраты — не ясно.

Нет, дружище, изврат - это как раз то, что ты предлагаешь.


 
ketmar ©   (2008-01-27 23:17) [106]

>[103] Игорь Шевченко ©(27.01.08 23:03)
>Я мыло отсылаю с ошибкой. Включая стек вызовов, N последних действий
>пользователя, расположение звезд и плотность потока альфа-частиц.

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

>Только что нельзя делать enabled:=false по первоначальному вызову формы,
>ибо пугаются.

это от юзеров зависит. потом привыкают к тому, что при кривых данных у них «OK» не нажмётся. даже благодарят за такую фичу. натурально, позиционирования на контрол, где надо бы поправить ошибку, и большого хинта с намёком на тухлые консервы это не отменяет.

>[104] DVM©(27.01.08 23:07)
>Да не нужны там игры с Enabled

кнопочка «OK» тоже не нужна. да и весь GUI не нужен — есть же консоль, нафига?


 
DVM ©   (2008-01-27 23:19) [107]


> кнопочка «OK» тоже не нужна. да и весь GUI не нужен — есть
> же консоль, нафига?

Не перегибай палку. Я говорил только об Enabled.


 
Семеныч   (2008-01-27 23:23) [108]

> Игорь Шевченко ©   (27.01.08 23:01) [102]

> неплохо бы спозиционироваться на контрол, где что-то неверно,
> что в дефолтном обработчике сделать несколько напряжнее

А это и не надо делать в дефолтном обработчике:

constructor EInvalidUserInput.Create(Control: TWinControl; Message: string);
begin
 Control.SetFocus;
 inherited Create(Message);
end;


procedure TSomeForm.Validate;
begin
 if TargetName = "" then
   raise EInvalidUserInput.Create(TargetNameEdit, "Не задано наименование");
end;


 
ketmar ©   (2008-01-27 23:24) [109]

>[105] Семеныч (27.01.08 23:14)
>- и юзер имеет возможность выбрать другую запись, не закрыв диалога.
а зачем он имеет эту возможность? O_o

>И бедняга юзер сидит и не понимает, почему у него ОК недоступна. Он же не
>знает, что TargetName может содержать только буквы и цифры.

а отчего он это не знает? ты, как автор, забыл сообщить? сообщи.

>И этот внешний валидатор должен каким-то волшебным образом определить
ты бы почитал меня внимательно. ну где я написал, что внешний валидатор должен что-то знать о формах? не знает он о них. для него информацию собрали в кучку и отдали на рассмотрение. заодно не забыли подписаться на событие «я, бляха номер 2857, рассмотрение пришедших данных закончил и имею вам сообщить, что…»

более того: чуть-чуть изменив точку зрения, можно заметить, что на самом деле такие вещи удобно пишутся в модели MVC. отчего я давно мечтал о сборщике мусора.


 
Семеныч   (2008-01-27 23:35) [110]

> ketmar ©   (27.01.08 23:24) [109]

> а зачем он имеет эту возможность? O_o

А затем, что диалог немодальный. Прикажешь Enabled переключать? Можно, только на фига себе геморрой устраивать? Не проще сделать диалог модальными не иметь никаких проблем?

> а отчего он это не знает? ты, как автор, забыл сообщить? сообщи.

А на фига мне лишние страниц доки писать? Которую он, к тому же  все равно читать не будет. Вот нажмет ОК - тогда все и увидит.

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

Угу. И правила проверки в ту же кучку запихнуть не забыли (а то откуда он узнает, что Дата1 должна быть строго меньше Даты2?). А эти правила еще как-то и формализовать надо - сиди, изобретай способ формализации. Потом пиши все это, потом отлаживай.

Ты прикинул, сколько лишнего геморроя ты предлагаешь поиметь? На фига?


 
sdts   (2008-01-27 23:40) [111]

Почему ветка еще не в "Начинающим"?


 
ketmar ©   (2008-01-27 23:41) [112]

>[110] Семеныч (27.01.08 23:35)
>Не проще сделать диалог модальными не иметь никаких проблем?
не проще. в достаточно сложной программе (а не той, где одна форма да три контрола) модальный диалог перекрывает доступ ко ВСЕМУ фкнуционалу. что в большинстве случаев на редкость идиотично. да возьми хотя б окошки preferences, которые всякие идиоты делают модальными. удобно — аж жуть.

>Угу. И правила проверки в ту же кучку запихнуть не забыли
не забыли, потому что модель — она в курсе, что у неё внутри должно быть и как. а вот GUI как раз об этом знать совершенно не надо.

>Ты прикинул, сколько лишнего геморроя ты предлагаешь поиметь? На фига?
для такой штуки, как «разделение внешнего вида и внутреннего представления данных». в программе с парой форм, как я писал, оно, может, и не надо. но когда программа вырастает — становится мучительно больно от того, что сразу такие вещи друг от друга не отделил.


 
Семеныч   (2008-01-27 23:56) [113]

> ketmar ©   (27.01.08 23:41) [112]

> для такой штуки, как «разделение внешнего вида и внутреннего
> представления данных».

Не сотвори себе кумира. Отделение слоя данных от гуя - штука хорошая, но только до тех пор, пока она не превращается в самоцель.

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

При разумном проектировании- не становится. Не сотвори себе кумира.


 
ketmar ©   (2008-01-28 00:20) [114]

>[113] Семеныч (27.01.08 23:56)
это не кумир, а опыт. когда заказчик сам не знает, чего хочет (то есть, всегда) — задолбёшься гуя перебирать. к тому же такое отделение даёт и другие выгоды. можно и в hex-кодах писать, только зачем?

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


 
Игорь Шевченко ©   (2008-01-28 00:54) [115]

Семеныч   (27.01.08 23:23) [108]


>
> constructor EInvalidUserInput.Create(Control: TWinControl;
>  Message: string);
> begin
>  Control.SetFocus;
>  inherited Create(Message);
> end;


Все бы было хорошо (сам так делаю часто), но не всегда мне надо прерывать ввод (а часть контролов проверяется еще и по мере ввода).
Так что увы, мне приходится применять мой способ. В ряде случаев без Exceptions, в ряде случаев с ними. Все от задачи зависит.


 
Игорь Шевченко ©   (2008-01-28 00:57) [116]

ketmar ©   (27.01.08 23:17) [106]


> это от юзеров зависит. потом привыкают к тому, что при кривых
> данных у них «OK» не нажмётся. даже благодарят за такую
> фичу.


Они не привыкают потом. Они не покупают сейчас. Между сейчас и потом есть временной интервал.


 
Черный Шаман   (2008-01-28 01:07) [117]


> быстро-быстро сдать и поиметь вечный геморрой с поддержкой.


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


 
ketmar ©   (2008-01-28 01:17) [118]

>[116] Игорь Шевченко ©(28.01.08 00:57)
я обычно пишу то, что уже есть кому продать. так что мне такое сообрежание не очень важно. %-)

>[117] Черный Шаман (28.01.08 01:07)
ну, если ты предпочитаешь кактусы — переубеждать не буду. я предпочитаю, чтобы мне оплачивали не гемор, а работу. заказчики — они тоже, отчего-то, ценят скорость внесения изменений и надёжность. не такие они тупые, как иногда кажется.


 
Семеныч   (2008-01-28 01:23) [119]

> ketmar ©   (28.01.08 00:20) [114]

> это не кумир, а опыт

Ты пропустил одно слово...
:о)

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

Вот разделил ты все. ОК. Заказчик меняет задачу. Поле в таблицу добавилось. Теперь тебе слой данных надо менять? Надо. Гуевый редактор этой таблицы менять надо? Надо. Новое поле в правила проверки добавлять надо? Надо.

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

И что же ты выиграл? Ничего. А лишнего геморроя - поимел.

================

В основной ветка интересная есть. Тоже человек теорий начитался - и вот ломает голову, как бы ему все покрасивше да построже сделать. А проблем-то на самом деле и нет никаких. Если не забывать, что умные книжки - штука хорошая, но делать из них догму не следует. Не сотвори себе кумира.


 
defunct ©   (2008-01-28 01:31) [120]

> Игорь Шевченко ©   (27.01.08 19:20) [33]
> Ситуацию нельзя исправить никогда.

Иногда можно - попытаться повторить операцию.
И иногда это помогает - пример intermittent bad block на диске.


 
Игорь Шевченко ©   (2008-01-28 01:37) [121]

Семеныч   (28.01.08 01:23) [119]


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


Хорошо вам. На одну данную одну форму используете. А данная возьми да приди еще из пары источников, откуда ее тоже надо проверять, да не просто проверять, а всячески преобразовывать, то есть конвертировать.

И придется кроме формы еще в паре месте менять, да не забыть сделать ошибок :)


 
Игорь Шевченко ©   (2008-01-28 01:45) [122]

defunct ©   (28.01.08 01:31) [120]

Конечно можно повторить. В свое время (еще до тырнета) ходила статья "Записки парасистемного программиста". Хорошая, кстати, статья. О программном обеспечении IBM S/360, почему это у них такое обеспечение - чуть ошибка в оборудовании - оно, обеспечение, завершается с ошибкой.
Вместо того, чтобы попытаться повторить операцию, произвести диагностику аппаратуры и тому подобные действия.

Так там была хорошая фраза - что программа должна обладать способностью при любом сбое не произвести во внешней среде необратимых изменений. Например не дергать винтом почем зря, в надежде на то, что bad block исправится.


 
Семеныч   (2008-01-28 01:59) [123]

> Игорь Шевченко ©   (28.01.08 01:37) [121]

Вот неплохой вариант (в общих чертах, детали опускаю).

Есть таблица БД. Пишем невизуальный класс, который эту таблицу отображает на свои свойства. В нем же - метод валидации данных (поскольку он сам про себя все знает, пусть сам себя и проверяет). В нем же - проверки допустимости операций (методы типа CanBeModified). И все такие классы - потомки одного (а в нем - базовый функционал).

Далее - пишем универсальный диалог редактирования таких классов. В его конструкторе есть параметр - экземпляр такого класса. Диалог создает свои контролы не из DFM, а динамически, используя RTTI полученного объекта. Когда диалогу нужно что-то проверить - вызывается нужный метод редактируемого объекта.

Изменилась задача - вносим изменения в тот самый невизуальный класс. И все, код GUI не меняется. И разделение данных с GUI имеется. И кумира нет.
:о)


 
ketmar ©   (2008-01-28 02:16) [124]

>[119] Семеныч (28.01.08 01:23)
а ты меня опять читал невнимательно. ты описал случай классической «задачи с одной формой». для которой, как я говорил, подобное разделение может быть и избыточным.

>[123] Семеныч (28.01.08 01:59)
оно всё очень красиво выглядит, пока до практики не доходит. пока юзер не скажет: «хочу вот тут кнопочку, тут перделочку, а на фоне — бабу голую». после чего наш «универсальный гуй» начинает обрастать дикими костылями, за которыми универсальности уже и не видно.


 
Семеныч   (2008-01-28 02:24) [125]

> ketmar ©   (28.01.08 02:16) [124]

> с одной формой

Какая там одна форма... их десятки, а может и за сотню уже перевалило... и ничего, живет...

> которыми универсальности уже и не видно.

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


 
Семеныч   (2008-01-28 02:31) [126]

Ладно, пошел я спать. Всем спасибо, интересно было.


 
ketmar ©   (2008-01-28 02:31) [127]

>[125] Семеныч (28.01.08 02:24)
>их десятки, а может и за сотню уже перевалило
и что, нигде логика от отображения не отделена? хорошо, ай, как хорошо-то…

>еуниверсальную бабу можно и в наследнике рисовать.
тогда зачем городить какой-то автопостроитель форм в рантайме, если всё равно напильником работать? я бы сделал специализированный редактор a-la сама Delphi, где есть пункт «создать прототип на основе модели» и дальше ты его руками доводишь, если надо. указывая связи и прочее. заодно эту ерундень можно продать особо умным юзерам, которые достаточно подкованы для создания своих вариантов UI.


 
Семеныч   (2008-01-28 02:41) [128]

> ketmar ©   (28.01.08 02:31) [127]

Блин... хрен тут уйдешь...
:o)

> нигде логика от отображения не отделена?

Отделена, конечно, не полные же идиоты проектировали. Не нужно же так уж совсем буквально все понимать. Смысл в том, что при отделении не стоит и до маразма доходить. Это как с нормализацией - меру знать надо.


 
ketmar ©   (2008-01-28 04:22) [129]

>[128] Семеныч (28.01.08 02:41)
а что такое «отделение до маразма»? нет, серьёзно. давай сначала определимся, а то сложно дальше говорить.


 
Семеныч   (2008-01-28 10:49) [130]

> ketmar ©   (28.01.08 04:22) [129]

Маразм - это когда в крайности впадают. Когда гуи от данных не отделяют совсем - один маразам. Когда отделяют во что бы то ни стало (только потому что так в умных книжках написано) - другой маразм.

Чтобы не залезать в дебри, возьмем самый простой пример отделения данных от гуи - датамодули. Один вариант - все компоненты доступа к данным лежат на датамодулях, все DB-контролы лежат на формах (будем считать, что в этом случае разделение полное). Другой вариант - датамодулей нет, все лежит на формах (будем считать, что в этом случае разделения нет совсем).

Когда разделения нет совсем - плохо. Хотя бы уже потому, что код визуалки смешивается с кодом бизнес-логики. Плохо обозримо, неудобно в поддержке и модификации, формы взаимосвязаны и т.п.

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

Но вот появляется какая-то маленькая табличка, которая будет редактироваться раз в год, с другими не связана, никаких сложных бизнес-правил не имеет. Для нее есть гуевый редактор, датасет и датасорс. Надо ли эти датасет и датасорс кидать на датамодуль, или их можно кинуть прямо на форму редактора?

Начитавшийся умных книжек и не думающий своей головой кидает их на датамодуль. На вопрос "почему" ответ один - а так положено. Кем, когда, почему, в каких случаях положено - на эти вопросы ответа нет. Положено - и все. Это один маразм.

Не читавший книг совсем швыряет все на форму и на вопрос "почему" отвечает - а на фига вообще нужны эти датамодули? Это другой маразм.

Человек же, который не только читает, но и еще думает, соображает так: хоть оно и положено, но нельзя же все стричь под одну гребенку. На фига для такой простейшей подзадачки, которая сложнее заведомо не станет, таскать еще и целый компонент (датамодуль)? Ресурсы - они все же не резиновые.

И тоже все кладет на форму. Но на вопрос "почему" имеет логичный ответ.


 
isasa ©   (2008-01-28 11:01) [131]

Семеныч   (28.01.08 10:49) [130]
:)
Я тут эта, извиняюсь, а куда класть то, вообще?
А если у меня еще не один поток? Здоровый датасет, сволочь, долго грузится. Нада зайчиков по форме пускать, что-бы не скучно было ...


 
isasa ©   (2008-01-28 11:04) [132]

ЗЫ. С удивлением обнаружил, что большинство книг по программированию, не библия. И заветов не содержит ...


 
Семеныч   (2008-01-28 11:08) [133]

> isasa ©   (28.01.08 11:01) [131]
> а куда класть то, вообще?

А вот туда, куда задача диктует и здравый смысл с опытом подсказывают. Главное - в маразмы не впадать.


 
Игорь Шевченко ©   (2008-01-28 11:19) [134]

Семеныч   (28.01.08 01:59) [123]


> Есть таблица БД. Пишем невизуальный класс, который эту таблицу
> отображает на свои свойства. В нем же - метод валидации
> данных (поскольку он сам про себя все знает, пусть сам себя
> и проверяет). В нем же - проверки допустимости операций
> (методы типа CanBeModified). И все такие классы - потомки
> одного (а в нем - базовый функционал).
>
> Далее - пишем универсальный диалог редактирования таких
> классов. В его конструкторе есть параметр - экземпляр такого
> класса. Диалог создает свои контролы не из DFM, а динамически,
>  используя RTTI полученного объекта. Когда диалогу нужно
> что-то проверить - вызывается нужный метод редактируемого
> объекта.
>
> Изменилась задача - вносим изменения в тот самый невизуальный
> класс. И все, код GUI не меняется. И разделение данных с
> GUI имеется. И кумира нет.


Я за подобную динамику отрывал бы руки. По самую голову.
Дабы неповадно было динамику писать


 
Семеныч   (2008-01-28 11:23) [135]

> Игорь Шевченко ©   (28.01.08 11:19) [134]

Так руки с головой можно и за статику отрывать. Причем столь же необоснованно, как и за динамику.


 
isasa ©   (2008-01-28 11:23) [136]

Игорь Шевченко ©   (28.01.08 11:19) [134]

И я догадываюсь за что. :)

Через год, когда забудется "На фига я это сделал" в этой динамической RTTI каше(которую, кстати, можно наглядно отобразить) фиг чего найдешь.


 
Игорь Шевченко ©   (2008-01-28 11:25) [137]

Семеныч   (28.01.08 11:23) [135]

За статику отрывать - вообще одни безрукие останутся.

isasa ©   (28.01.08 11:23) [136]


> И я догадываюсь за что. :)


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


 
Семеныч   (2008-01-28 11:29) [138]

Есть объект. У него есть свойство с именем PropName типа Integer. Надо динамически создать визуальный редактор этого поля.

Ах, какая сложнейшая задача, не так ли?


 
ketmar ©   (2008-01-28 11:33) [139]

>[130] Семеныч (28.01.08 10:49)
это вот называется «эклектика». прикольно, но неудобно. имо.


 
isasa ©   (2008-01-28 11:34) [140]

Семеныч   (28.01.08 11:29) [138]

Тут эта, динамически создается объект класса, а описать сам класс можно визуально в IDE или через ж... ручками. Что легче?


 
Семеныч   (2008-01-28 11:39) [141]

> isasa ©   (28.01.08 11:34) [140]

Описать ОДИН раз ручками (и ОДИН раз отладить), или до фига раз в IDE (а потом и еще много раз, когда новые редакторы появляться начнут), и КАЖДЫЙ редактор отлаживать.

Что легче? Где будет ошибок меньше?


 
ketmar ©   (2008-01-28 12:00) [142]

>[141] Семеныч (28.01.08 11:39)
меньше ошибок будет, если один раз сделать свой редактор.


 
Игорь Шевченко ©   (2008-01-28 12:22) [143]

Семеныч   (28.01.08 11:29) [138]


> Ах, какая сложнейшая задача, не так ли?


Это не сложнейшая задача. Это ненужная задача.


 
Семеныч   (2008-01-28 12:51) [144]

> ketmar ©   (28.01.08 12:00) [142]

Вот так и сделано (читай выше).

> Игорь Шевченко ©   (28.01.08 12:22) [143]

Игорь, вот скажи: сидели мы, сидели - и вдруг решили ненужную задачу сделать. То есть - или нам больше делать нечего, или мы такие дураки, что ее ненужность не поняли. Ты какой вариант имел в виду? Или оба сразу?

Ты нашу задачу знаешь? Ты архитектуру программы знаешь? Почему и зачем она именно такая - знаешь? Так как же ты можешь судить, что в ней нужно а что не нужно?

И (что интересно) - никаких "может быть". И никаких "потому что". Ненужная - и все. Без сомнений, без аргументации.

Я в восторге.

=================

Вообще, заявления типа "это так, потому что это так" на этом сайте встречаются нередко. Это такой стиль дискуссий здесь принят, что ли?

Ув. мастера - а вы, часом, не замастерились ли?

Все, достаточно. Уже неинтересно. Пойду-ка я лучше ненужную задачу себе придумывать.


 
Игорь Шевченко ©   (2008-01-28 12:52) [145]

Семеныч   (28.01.08 12:51) [144]

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


 
ketmar ©   (2008-01-28 12:54) [146]

>[144] Семеныч (28.01.08 12:51)
«своего редактора» я выше не заметил.


 
ketmar ©   (2008-01-28 12:54) [147]

а, да. я, конечно, имел в виду не «редактор свойств», а «конструктор форм».


 
ANB ©   (2008-01-28 13:32) [148]


> Есть таблица БД. Пишем невизуальный класс, который эту таблицу
> отображает на свои свойства.

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


 
Palladin ©   (2008-01-28 13:37) [149]


> [57] Anatoly Podgoretsky ©   (27.01.08 19:54)

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


> Ketmar



> это он не пошутил. это у него привычка для production code
> так делать. потому что есть не падать с post mortem dump,
> то узнать, что там у заказчика произошло — невозможно.

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


 
Anatoly Podgoretsky ©   (2008-01-28 15:46) [150]

> Palladin  (28.01.2008 13:37:29)  [149]

Разные приложения, разные требования.
Если приложение серверное, а зная наших админов, так они читать не будут, поскольку лень, мол и так работает, то послать оповещение, раз в сутки, обобщеное - мол есть 12 критических и 40 некритических сообщение благое дело.
Далее по вкусу или смотреть лог или запросить его по почте.



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

Форум: "Прочее";
Текущий архив: 2008.03.02;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.94 MB
Время: 0.07 c
2-1202134325
alexsashkan
2008-02-04 17:12
2008.03.02
Проблема с выборкой из базы


2-1202406703
Nemeziz
2008-02-07 20:51
2008.03.02
try..except


2-1201674180
repus
2008-01-30 09:23
2008.03.02
Помогите с сохранением в файл


2-1202464753
Artem
2008-02-08 12:59
2008.03.02
Abstract Error в ListBox


15-1201506814
toto
2008-01-28 10:53
2008.03.02
ASP3





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский