c# - 直接从类更新模型中的数据
问题描述
我正在制作一个简单的游戏作为基于随机事件的练习项目,以便更容易添加新事件我决定使用关键字系统,其中每个事件都获得分配给它们的关键字,然后用于处理事件,这可以像显示消息、更改模型中的数据或在随机表上再次滚动一样简单。
我有一个随机决定事件并返回带有关键字的字符串列表的类。
我想创建一个类,其中所有关键字都存储为方法,然后可以使用列表调用。
像这样的东西:
class Keyword
{
public void InputKeywords(List<string> Ikeywords)
{
foreach (var item in Ikeywords)
{
switch (item)
{
case "keyword0":
keyword0();
break;
case "keyword1":
keyword0();
break;
case "keyword2":
keyword0();
break;
}
}
}
private void keyword0()
{
//do something
}
private void keyword1()
{
//do something
}
private void keyword2()
{
//do something
}
}
现在我面临的问题是从关键字类更新模型中的数据。因为事件是随机选择的,所以我不知道每个事件将哪些数据发送给类以使其更新。
我自己想出的解决方案:
- 让我的模型静态,访问数据不再有问题,谷歌告诉我这是不受欢迎的,应该避免。
- 将模型发送到 Keyword 类,做一些魔术,然后返回模型。这将是一个简单的解决方案,但对我来说感觉不对,从我对 MVVM 的理解来看,数据应该从视图模型中更新,但我可能会在框内思考太多。
- 将所有可能的数据收集到一个单独的类中,将其发送到关键字类,然后更新模型。这听起来很麻烦,感觉就像我只是将问题转移到其他地方。
我觉得我错过了这样做的“正确”方式。什么是“最佳”方法?
解决方案
首先,关键字类的命名在这里让人感到误导。它基本上是一个事件处理程序,所以我也将它命名为(例如 RandomEventGenerator)
对于您的问题,我也不建议您使用静态模型。你的可测试性会受到影响,因为你不会在那里使用依赖注入。话虽这么说,您的第二种方法似乎朝着正确的方向发展。我建议使用注入 EventInvoker 接口。
public interface IEventInvoker
{
public void RaiseEvent();
}
这可以在操作员中实现,该操作员可以访问您的数据模型并具有预定义的操作来修改您的数据。
public class WeatherOperator : IEventInvoker
{
private readonly WeatherEngine _weatherEngine;
public WeatherOperator(WeatherEngine weatherEngine)
{
_weatherEngine = weatherEngine;
}
public void RaiseEvent()
{
StartSunshine();
}
public void StartSunshine()
{
_weatherEngine.RemoveClouds();
_weatherEngine.SetSunPosition(DayTimes.Noon);
}
public void LetItRain()
{
_weatherEngine.SetCloudes(CloudModes.FullCover);
_weatherEngine.SetRain(RainIntesity.Medium);
}
}
有了 IEventInvoker 的列表,您就可以转到您的 EventHandler。
public class RandomEventGenerator
{
private readonly List<IEventInvoker> _eventInvoker;
private readonly Dictionary<string, Action> _eventDictionary;
public RandomEventGenerator(List<IEventInvoker> eventOperator, List<string> keywords)
{
_eventInvoker = eventOperator;
_eventDictionary = RegisterKeywordsToRandomEvents(keywords);
}
private Dictionary<string,Action> RegisterKeywordsToRandomEvents(List<string> keywords)
{
var eventDictionary = new Dictionary<string, Action>();
foreach (var keyword in keywords)
{
var random = new Random();
var index = random.Next(_eventInvoker.Count);
eventDictionary.Add(keyword,_eventInvoker[index].RaiseEvent);
}
return eventDictionary;
}
public void EventByKeyword(string Keyword)
{
_eventDictionary[Keyword].Invoke();
}
public void RandomEvent()
{
var random = new Random();
var index = random.Next(_eventInvoker.Count);
_eventInvoker[index].RaiseEvent();
}
}
请注意,为了保持小,我没有在这里使用空检查或输入验证,这是强烈推荐的。使用这种方法,您的模型/数据和视图模型/数据访问器之间有一个清晰的界限。
推荐阅读
- angular - Mat-table 多行内多行
- javascript - 单击时显示隐藏的第 n 个子项
- java - 从列表中的任何值获取键
- powerbi - 将 r 脚本添加到 power bi
- javascript - jQuery .val() 不返回选项标签的值
- java - 在android中的多个本地通知中设置操作,为广播接收器中的通知提供相同的ID
- python - 如何修复 TypeError:“NoneType”对象在 Python 中不可迭代?
- kubernetes - 将大使部署到 Kubernetes
- json - 使用 Struct 解码 JSON 响应的 Alamofire 错误
- google-cloud-dataproc - Dataproc 集群的数据融合配置失败