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

Вниз

Друзья, поделитесь опытом   Найти похожие ветки 

 
DillerXX ©   (2006-08-20 18:00) [0]

Если нужно быстро написать какую-то программу для себя - можно просто написать весь алгоритм, заставить его работать, прикрутить к нему события визуальных компонентов и всё. Когда же пишешь программу нацеленную на обычного юзера и при этом пытаешься сделать её красивой - неизбежно возникают проблемы с дополнительным и не малым кодом. Нужно проверить все введённые данные, все необходимые файлы, в случае ошибки доступа сказать об этом, а так же вообще перехватывать исключения и не дать программе упасть. + обновление выводимой информации, продвижение ProgressBar"ов и прочее прочее прочее... Если это просто последовательно выполнять в теле основного алгоритма, то кол-во строк кода вырастает чуть ли не в 2-3 раза. Такой способ может и удобен для разового написания, но для дебага или добавления новых функций это ужасно... У меня к сожалению нет большого опыта написания подобных дружелюбных программ, но приходится экстренно учиться.
Я пока что усвоил основные положения которых нужно придерживаться:
1. При нажатии кнопки запускающей основной процесс нужно сначала вызвать функцию проверки всех и вся, и если функция возвращает false то не продолжаться алгоритм. Вопрос номер 1 - что делать если проверку никак нельзя произвести до начала работы алгоритма? Как лучше и компактнее с точки зрения основного функционального кода произвести проверки в теле основного алгоритма и оповестить юзера?
2. Что делать с реалтаймовым или конечным обновлением выводимой юзеру информации? Я решил что лучше всего вызывать коллбэки вроде vsSetProgressBar1(Percent) или vsSetStatusBar(CURRENT_STEP). В них соответственно будут исполняться функции присвоения и рефреша компонент. Тогда вопрос: будет ли вообще рационально использовать подобного рода "удобства"?
3. Если я вынесу основное начало алгоритма в отдельную функцию, то откуда он будет получать данные? Лучше передавать все данные вместе с вызовом функции или считывать её с визуальных компонент? Конечно удобнее и быстрее при написании использовать обращения к компонентам, но если я изменю её тип, то изменятся и имена параметров, а значит придётся исправлять программу сразу в нескольких местах. Но если делать всё через параметры вызова функции, то при необходимости добавления нового параметра, опять же придётся менять объявление функции и её вызов. Опять же обращаюсь с советом к вам, что лучше. Но всё же мне кажется, что код независящий от визуальных компонент лучше и нагляднее. Тем более при полном переработке дизайна в будущем, возни будет заметно меньше
4. Пример из жизни. Нужно было читать из файла некие данные, и заносить каждую новую строчку в массив. Но размер файла может довольно сильно меняться, поэтому статично выделять 10мб памяти я думаю неприемлемо. Но тогда при использовании динамических массивов, мы не можем установить точно его длину пока не прочитаем весь файл. Собственно вопрос: что лучше – читать файл 2 раза или вызывать SetLength() при прочтении каждой новой строчки? Как это отразится на скорости?
В общем жду ваших ответов и советов, надеюсь подскажите что-то такое, что сэкономит мне в будущем кучу времени :)


 
Джо ©   (2006-08-20 18:04) [1]


> или вызывать SetLength() при прочтении каждой новой строчки?

Ни в коем случае.
Выходов по меньшей мере 3:
1. В начале файла записывать кол-во элементов.
2. Произвести предварительный подсчет строк, выделить память, затем считывать.
3. Выделять память "с запасом", в конце чтения подкорректировать размер.


 
Джо ©   (2006-08-20 18:09) [2]

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


procedure A;
begin
 if not ADataValid then
   raise EMyException.Create("Неверные данные А");
 ...
end;

procedure B;
begin
 if not BDataValid then
   raise EMyException.Create("Неверные данные B");
 ...
end;

procedure Proceed;
begin
 A;
 B;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 try
   Proceed
 except
   on E: EMyException do
     ShowMessage (E.Message)
   else
     raise
 end;

end;



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

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

Наверх




Память: 0.48 MB
Время: 0.037 c
15-1155899398
Труп Васи Доброго
2006-08-18 15:09
2006.09.10
Пока!


15-1155806124
Rouse_
2006-08-17 13:15
2006.09.10
Каждому спамеру по бульдозеру :)


2-1156161877
Delphi basic
2006-08-21 16:04
2006.09.10
Как добавить в набор данных номера записей?


2-1156314634
Андрей Пазик
2006-08-23 10:30
2006.09.10
Создание кросс-массива


3-1151943933
SergP
2006-07-03 20:25
2006.09.10
Oracle --> dbf. Как сделать попроще?