所以基本上,在游戏中,我有一个“墙验证器”,它检查墙是否满足所有要求。然后,根据哪个需求失败,程序调用相应的消息函数。
<块引用>这是我调用墙验证器的代码:
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,希望我以你能理解的方式解释了我能做的一切。
答案 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 层。将检查逻辑放在较低层可能有利于单元测试等。