当前位置: 首页 > 编程语言 > C#

关于在C#中重构一个大开关的建议Share

时间:2023-04-10 22:08:14 C#

在C#中重构一个大开关的建议它有几个用于放置瓷砖/灯/门/实体等的工具。目前我只使用一个枚举来存储当前选择的工具,并有一个switch语句来运行每个工具代码。随着我一直在向应用程序添加更多工具,它开始感觉像意大利面条一样,有很多重复代码。这是我的编辑器类中的鼠标点击下函数的缩小版:publicvoidOnEditorViewMouseDown(PointmousePos){//检查点击是否越界。如果(IsLocationOOB(mousePos))返回;if(CurrentTool==ToolType.GroundTile){//只允许沿着整个图块拖动。m_DragManager.DragType=DragManager.DragTypeEnum.Tile;m_DragManager.StartDrag(mousePos);}elseif(CurrentTool==ToolType.WallTile){//只允许沿着网格边缘拖动。m_DragManager.DragType=DragManager.DragTypeEnum.Edge;m_DragManager.StartDrag(mousePos);}elseif(CurrentTool==ToolType.PostTile){//只允许沿着网格点拖动。m_DragManager.DragType=DragManager.DragTypeEnum.Point;m_DragManager.StartDrag(mousePos);}elseif(CurrentTool==ToolType.AreaLight){//允许拖动到任何地方。IE。没有以某种方式捕捉到网格。m_DragManager.DragType=DragManager.DragTypeEnum.FreeForm;m_DragManager.StartDrag(mousePos);}elseif(CurrentTool==ToolType.PointLight){m_CurrentWorld.AddLight(TranslateToWorldCoords(mousePos));}elseif(CurrentTool==ToolType.PlaceEntity){m_CurrentWorld.PlaceEntity(TranslateToWorldCoords(mousePos));这个开关用于其他几个函数(OnMouseMove,OnMouseUp),看起来设计不好(大开关在几个函数中重复)任何建议以更清晰和更具可扩展性的方式重构这样的东西?我目前正在考虑使用工具基类,让每个工具都有自己的类来覆盖它使用的函数(OnMouseDown()等)。这听起来合理吗?谢谢阅读。你有很好的直觉。通常,在OOP中,当你有一行if或很多开关时,它会产生强烈的代码味道。消除这种气味的最好方法是使用多态性。你应该继续你的想法,使用基础抽象类BaseTool,将不同的OnXXX方法实现为nops(只返回,所以你只需要指定行为,如果你的工具知道如何作用于那个方法),并且每个工具继承来自BaseTool并通过覆盖相关方法来实现自己的行为。所以你的方法最终是publicvoidOnEditorViewMouseDown(PointmousePos){currentTool.OnEditorViewMouseDown(mousePos);}根据您的设计,您还应该考虑将DragManager传递给该方法,以免绑定到存在的实例变量。一个EditorContext(包含DragManager)可以满足方法所需的一切,而无需获取“全局”变量,这将使您的方法在重构时更加独立且不那么脆弱。设计本身将取决于责任:谁负责什么。听起来是使用策略模式的好地方:http://www.google.com/search?id=1q=c%23+strategy+pattern是的,你应该绝对有一个基类(或至少一个接口)定义了所有工具所需的所有常用方法。尝试使这段代码工作,它会让您对如何设计您的类有一个很好的了解:m_DragManager.DragType=CurrentTool.DragType;m_DragManager.StartDrag(mousePos);其中“CurrentTool”是基类或接口的实例。Sobasically,whenselecting"tool",atthatpointyoudeterminewhichderivedtoolyouaredealingwith,butfromthenon,youonlydealwiththebaseclass,andforgetaboutanyenumsorsimilartodeterminethecurrentlyselectedtool.合理的?是的,多态性就是你想要的。您应该定义一个抽象基类Tool或一个接口ITool,具体取决于您是否需要向基类添加实现(即,如果所有工具之间有共同的功能,您可以使用抽象基类)。当需要做某事时,您的经理应该使用工具或ITool。您的工具将实现一个Drag函数,该函数获取它需要的信息,并返回它需要返回的内容或执行它需要执行的操作。或者,您可以实现Manager和Tool之间的控制反转,通过属性注入(Tool.Manager=dragManager)将Manager注入到Tool中,让Tool做它需要与Manager做的事情。http://www.refactoring.com/catalog/replaceConditionalWithPolymorphism.html我不太熟悉C#的语法,但一般来说,您可以使用接受DragManager作为参数的方法StartDrag、EndDrag使CurrentTool成为一个对象。然后当鼠标在视图上时,您只需调用CurrentTool.StartDrag(m_DragManager)。尝试标记枚举。每个位都是一个不同的特征,并且允许更好地堆叠每个单元格的特征。然后你甚至可以不同地检查每一位。以上就是C#学习教程:重构C#大开关的建议分享全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场,如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处: