【问题标题】:logic check on a dto and class object对 dto 和类对象进行逻辑检查
【发布时间】:2018-11-20 16:51:38
【问题描述】:

我继承了维护一个小型战斗游戏的工作。

游戏可以运行,但是当用户点击浏览器中的“结束”按钮时,游戏永远不会保存到数据库中。

通过API接收到“HttpPut”请求后调用该方法:

   protected override TroopMappingSession UpdateGameModel(TroopMappingSession g, TroopMappingSessionDto dto)
    {
        var retval = base.UpdateGameModel(g, dto);
        if (dto.IsActiveBattle != null && dto.IsActiveBattle == false) {
            GameService.SaveToDatabase(g);
        }
        return retval;
    }

“dto”代表TroopMappingSessionDto,是一个数据传输对象。

“g”代表TroopMappingSession类的模型。

“retval”表示TroopMappingSession类的更新模型。

就像这样,dto.IsActiveBattle 始终为“真”并且从未调用过 GameService.End()。

如果我将 dto.IsActiveBattle == false 更改为 retval.IsActiveBattle == false,那么它确实被调用了。

我的问题是,同时检查 dto.IsActiveBattle 和 retval.IsActiveBattle 是否有意义?

我不确定为什么最初的开发者同时检查 dto.IsActiveBattle != null 和 dto.IsActiveBattle == false。

谢谢!

【问题讨论】:

  • dto.IsActiveBattle 可能是数据库中可以为空的布尔值,因此检查是否为空
  • @ozzy432836 我刚刚检查过,它是一个可为空的布尔值。
  • 您应该只需要检查三种可能性中的一种......永远。只是最初的编码员想要明确拒绝,而不是通过接受隐含,如果这有意义的话。此外,他们可能希望明确处理 Null 值。就个人而言,我认为有一个 == 真的很奇怪,它已经是一个布尔值了!!为什么要检查布尔值是否是某物,只需在 if 构造中按原样使用它。 (如果它可以为空,它将具有 HasValue 和 Value 属性)

标签: c# asp.net-mvc asp.net-web-api dto


【解决方案1】:

试试这个

  protected override TroopMappingSession UpdateGameModel(TroopMappingSession g, TroopMappingSessionDto dto)
    {
        var retval = base.UpdateGameModel(g, dto);
        //if (dto.IsActiveBattle != null && dto.IsActiveBattle == false) {
            GameService.SaveToDatabase(g);
        //}
        return retval;
    }

检查游戏是否保存。这证明您的 retval 和 GameService 正在工作

然后您可以添加一些逻辑以确保它仅在 dto.IsActiveBattle 为 false 时保存。

当 var retval = base.UpdateGameModel(g, dto); 时,可能 dto.IsActiveBattle 被更改为 true被调用了。

【讨论】:

  • 是的,在调用 UpdateGameModel() 之后,retval.IsActiveBattle 已更改为“true”。但是,在单步执行代码时,dto.IsActiveBattle 始终为“真”,这就是它没有保存到数据库的原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-04
  • 2013-01-20
  • 2010-12-04
  • 1970-01-01
  • 2018-02-19
相关资源
最近更新 更多