Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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.47 MB
Время: 0.044 c
15-1155918518
Ketmar
2006-08-18 20:28
2006.09.10
DMClient -- диверсант.


1-1154061576
Константин_
2006-07-28 08:39
2006.09.10
Можно ли запретить перерисовку формы до определенного момента?


2-1155821025
Wolferio
2006-08-17 17:23
2006.09.10
Запущена ли ДОС программа


15-1155926486
TImage1
2006-08-18 22:41
2006.09.10
Уменьшение изображения


5-1139313370
Нулевой
2006-02-07 14:56
2006.09.10
Как добавить BS_FLAT в BitBtn и GroupBox, CheckBox.





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