Попытка отделить код в модели клиент-сервер, где клиент не является доверенным и с минимальным дублированием - PullRequest
1 голос
/ 30 ноября 2010

Я работаю над клиент-серверной игрой (C # .NET), где я не хочу доверять клиенту хранение моего кода приложения на стороне сервера, но хочу делиться объектами.

Например, представьте, что у вас есть слот для правой руки и рюкзак, который может нести дополнительные предметы. Теперь есть много серверного кода, который будет контролировать, какие элементы могут идти, в какие слоты и когда вы поворачиваете правую руку, что происходит. Я не хочу помещать этот код в мой клиент по разным причинам, но я часто нахожу, что если я создаю класс на стороне клиента и класс на стороне сервера для каждого из них, я вижу много дублирования в данных и некоторое дублирование в методах. Я также должен преобразовать один класс в другой.

Другой пример - Для предметов в игре. У предметов есть способности «Использовать» (например, «Использовать ключ» или «Использовать факел») и такие свойства, как «Имя» и «Вес». Поэтому, когда я создаю Класс Предмета, я бы предпочел сделать 1 класс следующим образом:

Public Class Item  
{

  int Weight; 

  string Name;

  void Use() { //Do something interesting but not public to the client } 

}

В конечном итоге копии этого объекта сериализуются и отправляются клиенту или серверу друг от друга по мере внесения изменений. Если частичный класс мог бы охватывать проекты, это было бы очень многообещающе (для плохого они этого не делают). Я не думаю, что подклассы чувствуются прямо здесь (например, ServerItem : Item), рассматривая сериализацию / десериализацию. Я поэкспериментирую с методами Extension и посмотрю, какие последствия это имеет для подкласса, но если у кого-то есть какие-то идеи или я просто упускаю что-то очевидное, пожалуйста, дайте мне знать.

1 Ответ

1 голос
/ 30 ноября 2010

Вы действительно хотите отделить Данные от Поведения, и у вас есть просто облегченные совместно используемые классы данных, а затем (на сервере) есть серверно-ориентированные классы, которые используют данные для определения поведения. (попробуйте взглянуть на несколько дизайнерских шаблонов - возможно, «Декоратор»)

Один легкий пример того, что вы можете пожелать:

 // lightweight data class thats shared
public class Item
{
    public int Weight { get; set;  }
    public string Name { get; set; }
}

// decorator pattern class that adds behaviour
public class ServerItem
{
    private Item item;
    public ServerItem(Item item)
    {
        this.item = item;
    }

    public void Use()
    {
        // do something with item;
    }
}

ServerItem currentServerItem = new ServerItem(currentItem);
...