+ Reply to Thread
Results 1 to 4 of 4

Thread: [Архитектурное решение] Как лучше по вашему мнению поступить?

  1. #1

    Default [Архитектурное решение] Как лучше по вашему мнению поступить?

    Доброго времени суток.

    Представим себе ситуацию, что есть у нас 4 класса: Parser, Info1, Info2, InfoHolder.
    Парсер ,соотвесвенно, парсит какие-то данные и собирает их в классы Info1, Info2, которые являюся членами класса InfoHolder. Схематично код выглядит так:
    class InfoHolder {
    public:
    ....
    void getSomeInterestingInfo(...);

    void addDataToInfo1(...);
    void addDataToInfo2(...);

    private:
    Info1 m_info1;
    Info2 m_info2;
    };

    Собственно, Парсер каким-то образом заполняет классы Info1, Info2...

    Код используется приблизиельно так:
    Parser parser;
    InfoHolder holder;
    parser.start(someFilename, &holder);

    holder.getSomeData();

    Что мне в этом всем не нравится? То, что далее используя экзмемляр holder я могу вызвать методы, отвечающие за заполнение классов Info1, Info2, что не есть хорошо!!!

    Как лучше в этой ситуации сделать? Может вообще есть какой-то хороший шаблон программирования?

    Думал методы по добавлению данных в Info1 и Info2 сделать тоже приватными, но тогда надо будет делать другом класса класс Парсер, а фрнеды - это не очень есть хорошо....=(
    Last edited by coldfire; 03-03-2013 at 19:45.

  2. #2
    root's Avatar

    Default Re: [Архитектурное решение] Как лучше по вашему мнению поступить?

    То что сразу в голову пришло.

    В класс InfoHolder, добавить конструктор:

    Code:
    InfoHodler::InfoHodler(Info1 *info1, Info2 *info2) {m_info1 = info1, m_info2 = info2;}
    И удалить из него функции void addDataToInfo1(...) и void addDataToInfo2(...).

    Сам объект InfoHolder, пусть создает функция start.

    Code:
    InfoHolder * Parser::start(string & someFilename);
    Last edited by root; 03-03-2013 at 20:46.
    Успех – это путь от провала до провала без потери энтузиазма. (В. Черчиль)

    Не бойся идти медленно, бойся остановиться. (Китайская пословица)

    When you lose fun and start doing things only for the payback, you're dead. (c) TCLH (Phrack 65, Intro)

  3. Пользователь сказал cпасибо:
    coldfire (03-03-2013)
  4. #3

    Default Re: [Архитектурное решение] Как лучше по вашему мнению поступить?

    а сами Info1 Info2 сделать членами класса Parser я так понимаю? И память по прежнему будет тогда чистить InfoHolder?

  5. #4
    root's Avatar

    Default Re: [Архитектурное решение] Как лучше по вашему мнению поступить?

    а сами Info1 Info2 сделать членами класса Parser я так понимаю?
    Не так, просто создавай их внутри функции start! Псевдо код:

    Code:
    start() {
        что-то там делается.
        ...
        // Создаем элемементы
        Info1 *info1 = new Info1(data1);
        Info2 *info2 = new Info2(data2);
    
        // Создаем и возвращаем InfoHolder
        return new InfoHolder(info1, info2);
    }
    Чистку элементов Info1, Info2 делаешь в деструкторе InfoHolder'a.
    Успех – это путь от провала до провала без потери энтузиазма. (В. Черчиль)

    Не бойся идти медленно, бойся остановиться. (Китайская пословица)

    When you lose fun and start doing things only for the payback, you're dead. (c) TCLH (Phrack 65, Intro)

  6. Пользователь сказал cпасибо:
    coldfire (03-03-2013)
+ Reply to Thread

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
All times are GMT. The time now is 01:33
vBulletin® Copyright ©2000 - 2018
www.reverse4you.org