【问题标题】:Is it good practice to create classes for specific settings?为特定设置创建类是一种好习惯吗?
【发布时间】:2016-04-01 03:22:11
【问题描述】:

我目前正在编写一个 Windows 窗体应用程序。

现在,此应用程序将通过 TextBox 等方式与用户交互。

我设计了 4 个类来保存所有需要的设置(这将是 DirectorySettings、LoopSettings、AttackSettings 和 AutoPotSettings),这将用于保存来自文本框等的值。

我将它们全部设为可序列化。

我的计划是保存这些类以便以后恢复它们并加载对它们定义的设置,这样它们就可以在各种应用程序会话期间持续存在。

我的问题是,这是一种好的做法还是有其他方法可以做到这一点?

此设置值将在运行时多次使用,我希望我的用户能够保存它们以供以后的会话使用。

编辑:当我阅读 Properties.Settings 以保存设置时,出现了这个问题。我不确定是否应该使用该功能,或者是否应该使用自己的类来保存这些功能。

【问题讨论】:

  • 您可以使用自己的类在Properties.Settings中保存设置

标签: c# class serialization settings


【解决方案1】:

有道理。也许创建一个 userprofile 类,其中包含有关游戏状态的所有用户相关事物。然后序列化该对象。你可以绑定到用户代码,所以当他们登录时,他们会得到所有与状态相关的信息

它允许人们拥有多个用户/游戏等而不是单一状态

【讨论】:

  • 此应用程序将用于单个游戏,但可以有各种用户设置,但我想保存信息,例如:购买 500 Hp Pots。这将保存在 LoopSettings 上,如果用户关闭应用程序并再次打开它,我希望加载该数字,因此用户不必多次配置应用程序。根据我的理解,您的意思是告诉我创建一个新类,它将容纳每个此类的实例,然后我将序列化该单个类?
  • 正确。具有您的类的整体对象
  • 我编辑了我的主要帖子以添加我提出问题的原因。你能解释一下我是否应该使用我的方式(每种设置类型的多个类,将它们保存为包含所有设置类的对象)还是应该使用 Properties.Settings 来保存这些?
  • 序列化对象的危险在于你可能会大幅更改类以使反序列化在理论上很麻烦
  • 嗯我明白了,所以进行“多版本”范围的设置会很麻烦吗?如 In,将这些类从 v0.01 更改为 v0.02(类中的其他内容)可能会使以前的用户设置无用?
【解决方案2】:

在类设计方面,你可以使用接口/抽象类来定义保存/读取行为,比如下面提到的IGameState接口。它有 2 种方法 a) SaveState b) ReadState 用于保存和读取状态。

那么你的类DirectorySettings、LoopSettings、AttackSettings、AutoPotSettings就可以实现接口了。在您的主程序中,您将能够定义如下 Main 方法中突出显示的抽象,以便主程序代码与设置列表分离。

如果您有很多设置并且需要更多控制,这种方法应该有助于轻松扩展系统。

 class Program
    {
        static void Main(string[] args)
        {
            List<IGameState> lstSaveState = new List<IGameState>();
            // For Saving State
            lstSaveState.ForEach(x=>x.SaveState());

        // For Reading State
        lstSaveState.ForEach(x => x.ReadState());
    }

}

public interface IGameState
{
    void SaveState();

    IGameState ReadState();
}


public class DirectorySettings : IGameState
{
    public void SaveState()
    {
        // Serialize
    }

    public IGameState ReadState()
    {
        // Deserialize
        throw NotImplementedException();
    }
}

public class LoopSettings : IGameState
{
    public void SaveState()
    {
        // Serialize
    }

    public IGameState ReadState()
    {
        // Deserialize
        throw NotImplementedException();
    }
}

【讨论】:

  • 我明白了!非常感谢您的代码。它将帮助我解决我的问题。我会尝试实现我自己的这种想法。
猜你喜欢
  • 2019-05-27
  • 1970-01-01
  • 2020-12-14
  • 2014-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多