Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Попрошу помощи в проектировании архитектуры 
:(
    Опции темы
EvilsInterrupt
Дата 21.8.2011, 19:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

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



Суть такая, что формат есть формат файла, который весьма сложный и не простой. 
Нужно иметь  читать и писать в файлы этого формата. Однако удобно говорить не файлы, 
а файловый образ. Таким образом вводя термин "образ" и абстрагируемся от понятия "файл".

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

При реализации захотел организовать работу с "образом", чтобы последний не знал о
том, что в конечном итоге это ? Файл или память?

В виду того, что нехочу мудрить свой велосипед с И/О решил подать на вход класса образа ссылку
или указатель на некий слой абстракции имеющий И/О опреации и тут очень хорошо выступает
библиотека стримов std::iostream.

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

Пока моя архитектура выглядит так:

class Image
{
public:
    Image( std::iostream& streamRef )
        : stream( streamRef )
    {}
private:
    std::iostream& stream;
};

class Calculator
{
public:
    Calculator()
        : srcImage( srcFile )
        , destImage( destFile )
    {}

    void openSource( const std::string& filename )
    {
        int mode = fstream::in | fstream::binary;
        srcFile.open( filename.c_str(), mode );
        if( !srcFile )
        {
            throw std::runtime_error( "File wasn't opened" );
        }
    }
    
    void openOutput( const std::string& filename )
    {
        int mode = fstream::in | fstream::out | fstream::trunc | fstream::binary;
        destFile.open( filename.c_str(), mode );
        if( !destFile )
        {
            throw std::runtime_error( "File wasn't opened" );
        }
    }

private:
    std::fstream   srcFile;
    std::fstream   destFile;
    Image          srcImage;
    Image          destImage;
};

Ьожет ли кто-то просмотреть что-то лучше или дать какую-нибудь критику?
PM MAIL WWW ICQ Jabber   Вверх
mes
Дата 21.8.2011, 19:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(EvilsInterrupt @  21.8.2011,  18:32 Найти цитируемый пост)
При реализации захотел организовать работу с "образом"

ну тогда расскжите немного об образе.. чем он представлен и как с ним работать ..

Добавлено @ 19:43
Цитата(EvilsInterrupt @  21.8.2011,  18:32 Найти цитируемый пост)
При реализации захотел организовать работу с "образом", чтобы последний не знал о
том, что в конечном итоге это ? Файл или память?

ну так работайте с потоком, только не прячьте его внутрь..

Добавлено @ 19:45
Цитата(EvilsInterrupt @  21.8.2011,  18:32 Найти цитируемый пост)
  void openSource( const std::string& filename )
    {
        int mode = fstream::in | fstream::binary;
        srcFile.open( filename.c_str(), mode );
        if( !srcFile )
        {
            throw std::runtime_error( "File wasn't opened" );
        }

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

Добавлено @ 19:46
Цитата(EvilsInterrupt @  21.8.2011,  18:32 Найти цитируемый пост)
есть формат файла, который весьма сложный и не простой. 

вот с него надо и начинать.. подумать каким удобным видом можно представить этот формат пользователю.. 

Это сообщение отредактировал(а) mes - 21.8.2011, 19:46


--------------------
PM MAIL WWW   Вверх
EvilsInterrupt
Дата 21.8.2011, 19:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

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



mes, 
Цитата

ну тогда расскжите немного об образе.. чем он представлен и как с ним работать ..

Это формат файла Portable Executable. Структурно состоит из объектов служебных структур которые задекларированы
в winnt.h входящим в Microsof Platform SDK и как правило идет в поставке с любой Visual Studio.

Цитата

ну так работайте с потоком, только не прячьте его внутрь..

Так я вроде как не прячу. Класс образа ничего не знает о том чем является стрим по сути? Он просто его  берет
и использует. А вот сам стрим создается в классе более высокого уровня, который вполне имеет право знать, что за
стрим, толи stdin, толи файл?!

Цитата

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

Не совсем понял мысль. Прошу подробней
PM MAIL WWW ICQ Jabber   Вверх
mes
Дата 21.8.2011, 20:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(EvilsInterrupt @  21.8.2011,  18:52 Найти цитируемый пост)
Он просто его  берет
и использует

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

Цитата(EvilsInterrupt @  21.8.2011,  18:52 Найти цитируемый пост)
А вот сам стрим создается в классе более высокого уровня, который вполне имеет право знать, что за
стрим, толи stdin, толи файл?!

если даже и объзан знать, он не должен отбирать возможность открыть и подготовить поток так, как это требуется пользователю..

Добавлено @ 20:02
Цитата(EvilsInterrupt @  21.8.2011,  18:52 Найти цитируемый пост)
Это формат файла Portable Executable.

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



Это сообщение отредактировал(а) mes - 21.8.2011, 20:05


--------------------
PM MAIL WWW   Вверх
EvilsInterrupt
Дата 21.8.2011, 20:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

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



mes, 

Цитата

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


Класс Calculator  это уже пользовательский код, класс входящий в инфраструктуру приложения, а не библиотеки.
Сорри, что не  упомянул этого!

Цитата

если даже и объзан знать, он не должен отбирать возможность открыть и подготовить поток так, как это требуется пользователю..


Возможно сказанное мною уточнений выше улучшит понимание. 

Цитата

ну это я догадался на основе предыдущих тем.. однако до сих пор мне так ио не пришлось с ним познакомиться.. 


В принципе это уже детали. Смысл их знать? Ведь скажи я ELF или Macho-O, то суть задачи бы не поменялась! Архитектура во
всех случаях подошла бы!

При подобных уточнениях, моя архитектура логична? или можно организовать лучше?
PM MAIL WWW ICQ Jabber   Вверх
mes
Дата 21.8.2011, 20:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(EvilsInterrupt @  21.8.2011,  19:08 Найти цитируемый пост)
При подобных уточнениях, моя архитектура логична? или можно организовать лучше? 

не вижу надобности хранения потока в image.. 



--------------------
PM MAIL WWW   Вверх
EvilsInterrupt
Дата 21.8.2011, 20:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

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



mes, 
Цитата

не вижу надобности хранения потока в image.. 


Image это класс по работе с форматом. Возможно будет куда лучше его перименовать в PortableExecutable или еще во что-нить.

Цель и назначение это класса парсить служебные структуры и возвращать их на выход.
Именно он должен знать по какому смещению искать IMAGE_DOS_HEADER, именно он должен посмотреть в dosHeader взять его
член e_lfnew и используя это значение как смещение в потоке прочитать новый хидер IMAGE_NT_HEADERS32 или IMAGE_NT_HEADERS64,
а какой именно 32 или 64, опять же Image должен узнать и по результату проверки прочитать. Ну и другие действия.

Но для этого ему нужно  уметь работать с потоком! А для этого ему нужно получить как-то этот поток, как иначе, если не:
Код

public:
    Image( std::iostream& streamRef )
        : stream( streamRef )
    {}

Как иначе-то передавать в класс поток чтобы он не знал об исходном стриме? Только по указателю или ссылке на базовый, разве не так?
PM MAIL WWW ICQ Jabber   Вверх
mes
Дата 21.8.2011, 20:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(EvilsInterrupt @  21.8.2011,  19:19 Найти цитируемый пост)
Как иначе-то передавать в класс поток чтобы он не знал об исходном стриме? Только по указателю или ссылке на базовый, разве не так? 

применять поток к образу, а не хранить первый в последнем.. т.е. грубо говоря перегрузить операторы << и >> потока.. 
однако способ применения зависит от того какой инструментарий вы хотите предоставить..  вариантов много и в первую очередь судя по всему основная проблема в размере образа, что не позволяет его из целей эффективности считать за раз.. Как я понимаю Вы хотите чтоб образ был интелектуальный и сам считывал с потока когда ему это понадобится.. Но это не самое лучшее решение.. 



--------------------
PM MAIL WWW   Вверх
EvilsInterrupt
Дата 21.8.2011, 20:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

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



mes, 
Цитата

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

Да, это верно. Образ будет "умным". Думаю тема исчерпывается, но  пока тему не закрою. Кто знает, может еще один более опытный чем я товарищ
заглянет и скажет имхо.

Ну а если не привязываясь к формату PE, как бы вы сделали для ELF ?

Я бы сделал библиотеку из двух частей: 1) ELFimage и 2) инструментальные функции, к примеру addCodeSection( ELFImage &, void* , size_t ) , etc.
Но даже тут, ELF формат не такой уж и тривиальный и следовательно  класс "образа" придется делать интеллектуальным!
PM MAIL WWW ICQ Jabber   Вверх
mes
Дата 21.8.2011, 20:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(EvilsInterrupt @  21.8.2011,  19:41 Найти цитируемый пост)
Да, это верно. Образ будет "умным"

для "умного" образа желательно прямое чтение, а значит концепция потока не самое удачное решение..

Добавлено через 6 минут и 7 секунд
если хотите использовать потоки на входе, то тогда Вам нужно либо хранить все данные, либо предоставить потоковую возможность на выходе..

Добавлено через 8 минут и 41 секунду
например можно при чтении потока для каждого поля вызывать соответсвующей ему метод интерфейса.. 
тогда получится "сквозная" обработка данных.. но мне кажется это не то что Вы хотите..

Добавлено через 10 минут и 53 секунды
вначале надо попробовать представить и объяснить словами какой интерфейс нужен пользователю.. что за инструментарий он должен предоставлять, и как это должно выглядить логически,  а уж после думать как его реализовавать технически..

Добавлено через 12 минут и 24 секунды
для примера возьмите пару тройку задач по работе с нужным форматом и попробуйте привести удобный пример по работе, и если получится удачный подход, можно будет подумать как именно его реализовать..

Добавлено через 14 минут и 49 секунд
например задача условно  может быть такая : посчитать сколько секций,  и добавить еще одну.. 
вот попробуйте записать подобное вначале условным пользовательским кодом, потом с условной библиотечнойреализацией.. 
имхо должно помочь приблизится к цели.. 

 

Это сообщение отредактировал(а) mes - 21.8.2011, 20:58


--------------------
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

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


 




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


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

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