Всем привет.
Возник такой спор. Сейчас попробую передать его суть. Начну из далека. Вспомните как вы пишите свои программы в стиле ООП. Создаёте классы, вызываете методы. Одни части программы (одни объекты) общаются с другими с помощью сообщений (вызовов методов). Не так давно придумали сериализацию и удалённый вызов процедур, всякие там .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.