如何重构这些功能?

时间:2021-07-09 20:57:20

标签: c# design-patterns refactoring

所以基本上,在游戏中,我有一个“墙验证器”,它检查墙是否满足所有要求。然后,根据哪个需求失败,程序调用相应的消息函数。

<块引用>

这是我调用墙验证器的代码:

ArrayList<Image> images = Arrays.asList(Image1, Image2, Image3, Image4, Image5, Image6, Image7, Image8, Image9, Image10);


static void setAllVisible(ArrayList<Image> images) {

    for (int i = 0; i < images.size(); i++) {

        images.get(i).setVisible(true);

    }}
<块引用>

现在我在两个不同的函数中检查所有要求两次,它们在墙验证器中:

    internal void PlaceWall(Vector2 wallStartPosition, Vector2 wallEndPosition)
    {
        _wallStartPosition = wallStartPosition;
        _wallEndPosition = wallEndPosition;

        _wallValidator.InitializeVectors(wallStartPosition, wallEndPosition);
        if (_wallValidator.WallDoesNotMeetTheRequirements())
        {
            _wallValidator.SendAppropriateMessage();
            return;
        }

        PlaceNewWall();
    }

您将如何重构这些功能?
我试过创建一个“Requirement”类,它在它的构造函数中接受“检查函数”和“要发送的消息”,但失败了。此选项在测试环境中不起作用。原因是我使用的是 NUnit 测试框架,当我尝试在没有分配“ConsoleOutput”(实现所有消息功能的类)的情况下测试墙壁放置时,我总是会在“需求”类初始化。
所以,基本上,我想在代码中说的是“将适当的消息发送到输出如果它不是空,但如果是,那么就返回真的”。但是对于当前状态下的每个新要求,我需要在两个不同的地方添加检查功能。
我真的不喜欢这个“双重检查要求并发送消息”的选项,我觉得我错过了这个问题的简单答案。
附注对不起,我的英语蹩脚;D,希望我以你能理解的方式解释了我能做的一切。

1 个答案:

答案 0 :(得分:0)

如评论中所述,制作一个返回操作结果的枚举,包括不同的错误情况。

public enum WallPlacementResult{
    Success,
    NotOnTheSameLine,
    TooLong
    ...
}

WallPlacementResult CheckWallRequirements(){
      if (WallIsNotOnTheSameLine()) return WallPlacementResult.NotOnTheSameLine;
      if (WallIsTooLong()) return WallPlacementResult.TooLong;
      ...
    return WallPlacementResult.Success;
}

void SendAppropriateMessage(WallPlacementResult result)
{
    switch(result){
        case WallPlacementResult.NotOnTheSameLine:
             _player.output?.DisplayWallHasPositionBeyondBoardMessage();
        break;
        case WallPlacementResult.TooLong:
        ...
    }
}

另一种选择可能是使用 generic result object 之类的东西。总的来说,我建议将任何 UI 任务(例如显示消息)委托给 UI 层。将检查逻辑放在较低层可能有利于单元测试等。