Сбор и хранение информации из объемного объекта
От: borech Россия  
Дата: 15.09.06 16:36
Оценка:
Привет,
вопрос к общественности, может что-нибудь посоветуете... Казалось бы проблема должна быть известна, но что-то придумать решения у меня не получается. Итак имеем:

class Storage
{
  ...
}

class Global
{
  Storage store;

  void doFirst()     - меняет store
  void doSecond()    - меняет store
  void doThird()     - меняет store
  
  ...
}


Сам код (безусловно в реале он гораздо сложнее и запутанен):

{
    doFirst()
        
    {
        получить актуальную Info на основе текущего значения store
        ...        
    }
    {
        получить актуальную Info на основе текущего значения store
        ... 
    }
        
    doSecond()
        
    {
        получить актуальную Info на основе текущего значения store
        ...        
    }
        
    doThird()
        
    {
        получить актуальную Info на основе текущего значения store
        ...        
    }
    {
        получить актуальную Info на основе текущего значения store
        ...        
    }
    {
        получить актуальную Info на основе текущего значения store
        ...        
    }
    {
        получить актуальную Info на основе текущего значения store
        ...        
    }
}


Вопрос заключается в том, как удобно, эффективо и красиво реализовать "получить актуальную Info на основе текущего значения store"?


Вариант1.
сделать метод Info Global::collectInfo()
Но во-первых Info будет собираться несколько раз подряд, хотя store не изменилось между вызовами. Во-вторых постоянное копирование при возврате из collectInfo() (можно возвращать указатель, хотя тоже постоянно создавать-удалять Info* накладно)

Вариант2.
Поле Info info в Global, которое обновляется вызовом void Global::collectInfo() и возвращается с помощью Info Global::getInfo()
Лишний раз объект создаваться не будет, а собирать Info теперь приходится редко, что хорошо. Но вот легко можно забыть его собрать в нужный момент.

Неужели нет какого-нибудь более элегантного способа?

Дмитрий
Re: Сбор и хранение информации из объемного объекта
От: MaximE Великобритания  
Дата: 17.09.06 13:24
Оценка:
borech wrote:

[]

> Привет,

> вопрос к общественности, может что-нибудь посоветуете... Казалось бы
> проблема должна быть известна, но что-то придумать решения у меня не
> получается. Итак имеем:
>
> class Storage
> {
>   ...
> }
> 
> class Global
> {
>   Storage store;
> 
>   void doFirst()     - меняет store
>   void doSecond()    - меняет store
>   void doThird()     - меняет store
>   
>   ...
> }

>
>
>
> Сам код (безусловно в реале он гораздо сложнее и запутанен):
>
> {
>     doFirst()
>         
>     {
>         получить актуальную Info на основе текущего значения store
>         ...        
>     }
>     {
>         получить актуальную Info на основе текущего значения store
>         ... 
>     }
>         
>     doSecond()
>         
>     {
>         получить актуальную Info на основе текущего значения store
>         ...        
>     }
>         
>     doThird()
>         
>     {
>         получить актуальную Info на основе текущего значения store
>         ...        
>     }
>     {
>         получить актуальную Info на основе текущего значения store
>         ...        
>     }
>     {
>         получить актуальную Info на основе текущего значения store
>         ...        
>     }
>     {
>         получить актуальную Info на основе текущего значения store
>         ...        
>     }
> }

>
>
>
> Вопрос заключается в том, как удобно, эффективо и красиво реализовать
> "получить актуальную Info на основе текущего значения store"?
>
>
> /Вариант1./
> сделать метод Info Global::collectInfo()
> Но во-первых Info будет собираться несколько раз подряд, хотя store не
> изменилось между вызовами. Во-вторых постоянное копирование при возврате
> из collectInfo() (можно возвращать указатель, хотя тоже постоянно
> создавать-удалять Info* накладно)
>
> /Вариант2./
> Поле Info info в Global, которое обновляется вызовом void
> Global::collectInfo() и возвращается с помощью Info Global::getInfo()
> Лишний раз объект создаваться не будет, а собирать Info теперь
> приходится редко, что хорошо. Но вот легко можно забыть его собрать в
> нужный момент.
>
> Неужели нет какого-нибудь более элегантного способа?

Второй вариант, мне кажется, совсем неплох.

От забычивости можно написать тоненький объект-аксессор (proxy design pattern):

class info
{
private:
     struct data
     {
         int x, y, z;
     } d;
     void update();
public:
     struct get
     {
         info* p;
         get(info& i) : p(&i) { p->update(); }
         data* operator->() const { return &p->d; }
     };
};

int main()
{
     info i;
     info::get g(i);
     int x = g->x;
     int y = g->y;
     int z = g->z;
}


--
Maxim Yegorushkin

No Microsoft product was used in any way to write or send this text.
If you use a Microsoft product to read it, you're doing so at your own risk
Posted via RSDN NNTP Server 2.0
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.