Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#关于扩展大型类以提高可读性_C#_Extension Methods_Abstract_Readability - Fatal编程技术网

C#关于扩展大型类以提高可读性

C#关于扩展大型类以提高可读性,c#,extension-methods,abstract,readability,C#,Extension Methods,Abstract,Readability,我有一个很大的抽象类来处理游戏中的武器。通过基本功能列表进行作战循环: OnBeforeSwing OnSwing OnHit || OnMiss 我的想法是将所有与战斗伤害相关的计算转移到另一个文件夹中,以处理这些计算。战斗伤害相关计算 我想知道通过将OnHit方法作为扩展方法来实现这一点是否正确,或者实现这一点的最佳方法是什么 还有。定期修改部分命中代码,命中伤害公式很大,因为它考虑了很多条件,如抵抗、转化法术、物品奖励、特殊属性和其他类似的游戏元素 最后是一个500行的OnHit函数,这

我有一个很大的抽象类来处理游戏中的武器。通过基本功能列表进行作战循环:

OnBeforeSwing
OnSwing
OnHit || OnMiss
我的想法是将所有与战斗伤害相关的计算转移到另一个文件夹中,以处理这些计算。战斗伤害相关计算

我想知道通过将
OnHit
方法作为扩展方法来实现这一点是否正确,或者实现这一点的最佳方法是什么

还有。定期修改部分命中代码,命中伤害公式很大,因为它考虑了很多条件,如抵抗、转化法术、物品奖励、特殊属性和其他类似的游戏元素

最后是一个500行的OnHit函数,这让我很害怕。即使使用区域指令,也很难通过它而不迷失在迷宫中,甚至分散自己的注意力

如果我用这个函数来扩展武器,而不是仅仅使用OnHit函数,我可以尝试将攻击的不同部分分离成其他函数

再说一次,也许我可以通过在武器类的OnHit中调用类似于
CombatSystem.HandleWeaponHit的东西来实现这一点,而不使用扩展方法。这可能更合适


基本上,我的问题是,让它保持这样是否真的是最好的解决方案,或者我是否可以(应该?)将这部分代码移动到一个扩展方法或一个单独的帮助器类中来处理损坏模型,以及我是否应该尝试将函数拆分为更小的“任务”提高可读性的函数。

首先,OnHit应该是一个事件处理程序。任何被命中的对象都应该引发一个命中事件,然后您可以有一个或多个与该事件关联的事件处理程序


如果无法将当前OnHit函数拆分为多个事件处理程序,则可以将其拆分为单个事件处理程序,但可以将其重构为多个较小的方法,每个方法都执行特定的测试或特定的计算。它将使您的代码更具可读性和可维护性。

我将冒险指出,您的引擎可能还不够抽象。请注意,除了你在OP中告诉我的以外,我在不知道任何关于你的系统的情况下提出这个建议

在我设计的类似系统中,有动作和效果。这些是基类。每个特定动作(机关枪攻击、特定法术等)都是从动作派生的类。行动有一个可以应用于目标的一个或多个特定效果的列表。这是通过依赖注入实现的

战斗引擎本身并没有做所有的计算。本质上,它要求目标计算其防御等级,然后循环所有主动行动,并要求他们确定其任何影响是否适用于目标。如果它们适用,它要求该行动将其相关效果应用于目标

因此,战斗引擎很小,每个效果都很小,并且易于维护


如果你的系统是一个巨大的整体结构,你可能会考虑一个类似的体系结构。

< P> IHO Mike Hofer给出了线索。

真正的问题不在于它是否是一个扩展方法的问题。真正的问题是,对于如此复杂的一系列计算来说,单一(扩展或常规)方法是不可想象的

在考虑最佳实现之前,您显然需要重新考虑整个问题,以确定对象上责任的最佳分配。每个元素计算都必须由它所应用的对象完成。始终记住,尤其是信息专家低耦合高内聚

通常,项目中的每个方法都应该只有几行代码,而不是更多。对于每一项计算,请考虑哪些是该计算适用的所有类。然后将此计算作为它们的公共基类的一种方法

如果没有公共基类,则创建一个新接口,并使所有这些类实现该接口。接口可能有方法也可能没有:它可以作为一个简单的标记来标识所提到的类,并使它们具有一些共同点

然后您可以构建一个元素扩展方法,如下面的示例所示:

public interface IExploding { int ExplosionRadius { get; } }

public class Grenade : IExploding { public int ExplosionRadius { get { return 30; } } ... }

public class StinkBomb : IExploding { public int ExplosionRadius { get { return 10; } } ... }

public static class Extensions
{
    public static int Damages(this IExploding explosingObject)
    {
        return explosingObject.ExplosionRadius*100;
    }
}
此示例非常简单,但其目的只是提供以更抽象和可维护的方式重新设计系统的线索


希望这对你有帮助

根据命中来自何处(即咒语、武器),处理方式完全不同,我将如何使用事件处理程序在代码中反映这一点?