Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > посоветуйте, как организовать алгоритм


Автор: NieL 12.1.2011, 16:06
приложение, в определенные моменты извлекает из 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. Как бы сделали вы?

Автор: Poseidon 12.1.2011, 16:31
Я бы создал булиновскую функцию. True - все чики. False - не все чики smile А уже в коде вызывал бы функцию и на основании ее значения выдавал бы Exception.

Автор: NieL 12.1.2011, 16:53
при таком подходе придется дублировать одни и те же эксепшены в нескольких местах каждый раз когда будет возвращаться false. Я потому и задумался о необходимости вынесения в отдельную процедуру, чтобы избежать захламления кода одними и тем же эксепшенами, а так мог бы просто обернуть в try..except и прописать эксепшн.

Автор: 0x0027 12.1.2011, 17:01
я бы оставил как есть, только процедуру заменил бы на функцию с возвращаемым булевым значением.
и не забудь поменять строки 8 и 10 местами, иначе у тебя будет мемлик. 

Автор: NieL 12.1.2011, 17:12
спс. не заметил. 

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

Автор: 0x0027 12.1.2011, 17:15
ну это уже тонкости реализации, которые известны только автору, так что решать тебе. 
главная идея в том, что должна быть единая процедура\функция.

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

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

Автор: Snowy 12.1.2011, 17:59
Стрим должен создаваться вне процедуры.
Алгоритм должен быть таким:
1. Создали стрим.
2. Вызвали процедуру распаковки.
3. Использовали стрим.
4. Уничтожили стрим.
Именно в таком виде код будет легко читаем.
Не придётся гадать, где что создаётся и почему умирает именно тут, если мы вообще не забыли прибить этот стрим после использования, т.к. мы его и не создавали.
Это по поводу out параметра.
А взрываться или не взрываться - зависит только от политики партии.
Нужно взрываться - взрывайся.
Только убрать за собой не забудь.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)