Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> посоветуйте, как организовать алгоритм 
V
    Опции темы
NieL
Дата 12.1.2011, 16:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 214
Регистрация: 10.2.2008

Репутация: 1
Всего: 1



приложение, в определенные моменты извлекает из zip-архивов файлы и выполняет определенные действия с ними. В ТЗ сказано, если не удалось извлечь файл, райсить эксепшен - "Не удалось извлечь файл "<имя_файла_в_пакете_обновления>" из пакета обновления" "<имя_файла_пакета_обновления>". Вопрос: Как более гибко и оптимально организовать алгоритм извлечения.

1. Написать отдельную процедуру, возвращающую в качестве out-параметра TStream (извлекаемый файл)

Код

procedure pack_file_get(APack: TZipFoge; const Afile_name: string;
 out AStream: TStream);
begin
 AStream := TMemoryStream.Create;
 try
   APack.ExtractToStream(AStream);
 except
  AStream.Free; 
  raise Exception.CreateFmt(C_CANNOT_LOAD_FILE,
     [Afile_name, APack.FileName]);
 end;

end;



2. Обойтись без процедуры, и напряму в коде создавать TStream, извлекать в него и обрабатывать try..except

3. Как бы сделали вы?

Это сообщение отредактировал(а) NieL - 12.1.2011, 17:05
PM MAIL   Вверх
Poseidon
Дата 12.1.2011, 16:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 53
Всего: 133



Я бы создал булиновскую функцию. True - все чики. False - не все чики smile А уже в коде вызывал бы функцию и на основании ее значения выдавал бы Exception.


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
NieL
Дата 12.1.2011, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 214
Регистрация: 10.2.2008

Репутация: 1
Всего: 1



при таком подходе придется дублировать одни и те же эксепшены в нескольких местах каждый раз когда будет возвращаться false. Я потому и задумался о необходимости вынесения в отдельную процедуру, чтобы избежать захламления кода одними и тем же эксепшенами, а так мог бы просто обернуть в try..except и прописать эксепшн.
PM MAIL   Вверх
0x0027
Дата 12.1.2011, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 29.1.2010

Репутация: нет
Всего: -1



я бы оставил как есть, только процедуру заменил бы на функцию с возвращаемым булевым значением.
и не забудь поменять строки 8 и 10 местами, иначе у тебя будет мемлик. 
PM MAIL   Вверх
NieL
Дата 12.1.2011, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 214
Регистрация: 10.2.2008

Репутация: 1
Всего: 1



спс. не заметил. 

а зачем возвращать bool значение? какой смысл возвращать true или false если при неудачном извлечении сработает эксепшен?, который при необходимости я могу обернуть в try..except, и обработать

Это сообщение отредактировал(а) NieL - 12.1.2011, 17:13
PM MAIL   Вверх
0x0027
Дата 12.1.2011, 17:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 29.1.2010

Репутация: нет
Всего: -1



ну это уже тонкости реализации, которые известны только автору, так что решать тебе. 
главная идея в том, что должна быть единая процедура\функция.
PM MAIL   Вверх
Poseidon
Дата 12.1.2011, 17:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 53
Всего: 133



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

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


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
Snowy
Дата 12.1.2011, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Стрим должен создаваться вне процедуры.
Алгоритм должен быть таким:
1. Создали стрим.
2. Вызвали процедуру распаковки.
3. Использовали стрим.
4. Уничтожили стрим.
Именно в таком виде код будет легко читаем.
Не придётся гадать, где что создаётся и почему умирает именно тут, если мы вообще не забыли прибить этот стрим после использования, т.к. мы его и не создавали.
Это по поводу out параметра.
А взрываться или не взрываться - зависит только от политики партии.
Нужно взрываться - взрывайся.
Только убрать за собой не забудь.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0979 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.