Протокол взаимодействия сервера и клиента
От: sorc  
Дата: 19.08.11 11:17
Оценка:
Всем привет.

Возник такой спор. Сейчас попробую передать его суть. Начну из далека. Вспомните как вы пишите свои программы в стиле ООП. Создаёте классы, вызываете методы. Одни части программы (одни объекты) общаются с другими с помощью сообщений (вызовов методов). Не так давно придумали сериализацию и удалённый вызов процедур, всякие там .net remoting и прочее, чтобы сделать общение между удалёнными частями одной программной системы более естественным: вы как бы вызываете методы и создаёте классы в другой части программной системы, которая может находиться даже на другом конце планеты, через интернет или локальную сеть предприятия. Я всегда был уверен что этот подход правильный, потому что он ведёт к унификации интерфейсов, в конце концов упрощает работу программиста да и надёжность системы возрастает от того, что уменьшается количество преобразований данных из одного формата в другой.

Но сегодня мне просто порвали все шаблоны. Оказалось что то что я выше написал чуждо всем людям с которым я всё это время общался Суть драмы в следующем. Для уведомления клиента игровым сервером о появлении нового игрока или NPC, либо об изменении их атрибутов (в случае если клиент уже знает о существовании данного игрока или NPC) было предложено такое сообщение (json):

["UNITSTATUS",{"type":"PLAYER","unit":{"id":"35","name":"test","i":"5","j":"1","speed":"13"}}]

Собственно тип type может быть PLAYER, если речи идёт об игроке, или NPC, если об NPC. Набор атрибутов в unit может немного меняться в зависимости от типа.

Я уже успел привыкнуть к тому, что сообщения с сервера это как вызовы методов или конструкторов на клиенте, по типу rpc или ремотинга. Поэтому предложил свой вариант. Заменить это сообщение, которое делает 4 дела (создаёт игрока, создаёт нпц, меняет атрибуты игрока, меняет атрибуты нпц) несколькими сообщениями, каждое из которых будет делать одно осмысленное действие:

["NEWPLAYER",{"id":"35","name":"test","i":"5","j":"1","speed":"13"}]    // Если получится так что конструкторы у игрока и NPC одинаковые
["NEWNPC",{"id":"36","name":"test","i":"5","j":"1","speed":"5"}]        // то можно сделать одно сообщение NEWUNIT с указанием типа юнита.
["MOVEPLAYER",{"id":"35","i":"5","j":"1","speed":"13"}}]    // Можно было бы сделать одно сообщение MOVEUNIT и для игроков и для 
["MOVENPC",{"id":"36","i":"5","j":"1","speed":"5"}}]        // NPC если бы id у них были уникальные =\
["SETPLAYERSPEED",{"id":"36","speed":"5"}}]
...

Это как-то больше похоже на удалённый вызов методов и конструкторов. По-моему этот подход намного проще даже в реализации не говоря уже об использовании. Но все в один голос говорят что это не правильно и первый вариант лучше Рассуди нас RSDN.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.