尝试在客户端服务器模型中分离代码,其中客户端不受信任且复制最少

时间:2010-11-30 09:04:48

标签: c# extension-methods subclass client-server

我正在开发一个客户端/服务器游戏(C#.NET),我不想让客户端保留我的任何服务器端应用程序代码,但想要共享对象。

例如,想象一下你有一个右手武器插槽和一个可以携带额外物品的背包。现在有很多服务器端代码可以控制哪些项目可以进入哪个插槽,当你摆动右手时会发生什么。我不想出于各种原因将此代码放在我的客户端中,但我经常发现,如果我为每个代码生成客户端类和服务器端类,我会看到很多数据重复和一些重复在方法。我还必须将1个类转换为另一个。

另一个例子是游戏中的物品。物品具有“使用”能力(如使用键,或使用火炬)和属性,如名称和重量。因此,当我创建Item类时,我更愿意像这样创建一个类:

Public Class Item  
{

  int Weight; 

  string Name;

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

}

最终,此对象的副本将被序列化,并在进行更改时相互发送给客户端或服务器。如果一个部分类可以跨越非常有希望的项目(坏的,他们不会)。考虑序列化/反序列化,我不认为子类在这里感觉(如ServerItem : Item)。我将使用扩展方法玩一些,看看有什么影响子类,但如果有人有任何想法,或者我只是遗漏了一些明显的东西,请告诉我。

1 个答案:

答案 0 :(得分:1)

您确实希望将数据与行为分开,并且只拥有轻量级可共享数据类,然后(在服务器上)具有以服务器为中心的类,这些类使用数据来确定行为。 (试着看一些设计模式 - 也许是'装饰者')

您可能需要的一个轻量级示例是:

 // 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);