Привет,
вопрос к общественности, может что-нибудь посоветуете... Казалось бы проблема должна быть известна, но что-то придумать решения у меня не получается. Итак имеем:
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 теперь приходится редко, что хорошо. Но вот легко можно забыть его собрать в нужный момент.
Неужели нет какого-нибудь более элегантного способа?
Дмитрий
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 riskPosted via RSDN NNTP Server 2.0