Форум: "Прочее";
Текущий архив: 2006.09.10;
Скачать: [xml.tar.bz2];
ВнизДрузья, поделитесь опытом Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.037 c