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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Взаимодействие объектов, с помощью сообщений 
:(
    Опции темы
Enjoy
Дата 4.2.2006, 21:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Здравствуйте!

У меня есть сложная иерархия объектов (классов), которые должны взаимодействовать между собой.

То есть:

Код

class CCharacter
{
   ...
};

class CContent
{
   vector<CCharacter> Characters;
   ...
}

class CWorld
{
   CContent WorldContent;
   ...
}


И для взаимодействия объектов я решил использовать сообщения.


Код

string SendMessage(string MsgReceiver, string MsgQuery, string MsgParameters);


К примеру команда, вызванная из CWorld: CContent.SendMessage("CCharacter", "Move", "100 100"); сначала обработается CContent, а затем он её перенаправит в CCharacter(именно такого подхода требует архитектура - CContent тоже будет выполнять кое-какие операции). Затем результат выполения передаётся в CContent, затем в CWorld.

Мои вопросы:
1. Каким образом можно оптимизировать подобную схему?
2. Где можно прочитать про подобную схему взаимодействия?
3. Насколько это эффективно с точки зрения производительности?
PM MAIL   Вверх
Dreamer_0x01
Дата 5.2.2006, 01:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


Профиль
Группа: Участник
Сообщений: 780
Регистрация: 14.4.2005
Где: Санкт-Петербург

Репутация: нет
Всего: 12



Насколько я понимаю, пока что взаимодействие идет не посредством сообщения, а вызовов функций членов классов. И задумка очень похожа на реализацию подобного с помощью вызовов виртуальных функций базовых классов. Хотя, могу конечно и ошибаться.
Вы покажите, собственно, чем будет заниматься функция SendMessage(), а то на словах трудно понять.


--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
Enjoy
Дата 5.2.2006, 08:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Вот как это у меня было реализовано ранее:
Код

сlass CServer;
class CWorld;
class CContent;
class CCharacters;


class CCharacters
{
private:
vector<CCharacter> Characters;
CContent_Dynamic *pClassParent; 
public:
    int SetParent(CContent_Dynamic *pParent);
    int AttackCharacter(WorldPositionX, WorldPositionY); 
};

class CContent
{
private:
    CWorld *pClassParent;
    CCharacters WorldCharacters;
public:    
    int SetParent(CWorld *pParent);   
    int AttackCharacter(WorldPositionX, WorldPositionY); 
};

class CWorld
{
private:
    CServer *pClassParent;
    CContent WorldContent;
public:
    int SetParent(CWorld *pParent);    
    int AttackCharacter(WorldPositionX, WorldPositionY); 
};

class CServer
{
private:
    MYSQL ServerDB;
    bool ServerUP;    
    CWorld wWorld;
public:
      //---------------------//
     //Server administration//
    //---------------------//    
    int ServerRun(const string UserName, const string Password);
    int ServerStop();
    bool IsServerUP();

      //--------------//
     //Authentication//
    //--------------//    
    int User_Login(const string UserName, const string Password);
    int User_Logout(const unsigned int SessionID);
    int User_Register(const string Login, const string Password);

        //-----------------//
     //World interaction//
    //-----------------//    
    PlayerStats GetPlayerStats(string UserName);
    int SetParent(CWorld *pParent);
    int AttackCharacter(WorldPositionX, WorldPositionY); 
};


То есть при получении сервером команды атаковать персонажа, эта команда пойдёт по этой цепочке вниз до самого CCharacters. По моему это не очень выгодно с точки зрения скорости выполнения.

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

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

С ООП я пока только знакомлюсь, поэтому прошу помочь выбрать подходящее мне решение.
PM MAIL   Вверх
Mayk
Дата 5.2.2006, 08:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



Почитайте про "паттерн command".





--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
Dreamer_0x01
Дата 5.2.2006, 11:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


Профиль
Группа: Участник
Сообщений: 780
Регистрация: 14.4.2005
Где: Санкт-Петербург

Репутация: нет
Всего: 12



Цитата(Enjoy @ 5.2.2006, 08:13 Найти цитируемый пост)

это будет приведённая выше функция SendMessage, объявленная в отдельном модуле


Я вот главного момента понять не могу - нужно привязаться к сообщениям Windows, или это не имеет кроме названия к ней никакого отношения?



--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
Enjoy
Дата 5.2.2006, 14:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Кроме названия никакого отношения к сообщениям Windows не имеет. Она вообще не будет называться SendMessage - это я дал просто для примера.


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


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Цитата(Enjoy @ 5.2.2006, 08:13 Найти цитируемый пост)

То есть при получении сервером команды атаковать персонажа, эта команда пойдёт по этой цепочке вниз до самого CCharacters. По моему это не очень выгодно с точки зрения скорости выполнения.

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


Не надо из C Smalltalk делать.

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

Во-вторых, ты сам себя лишаешь преимущества статической проверки типов и параметров функций, которая есть великое достижение C++...
Т.е. анализ правильности переданных параметров тебе придется самому писать.

В-третьих, будет не быстрее, чем передача "нормальных" вызовов по цепочке (даже очень длинной), а намного медленнее.

Оставь как есть. Или последуй совету Mayk насчет паттерна "Команда".






--------------------
...
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0471 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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