2011-05-25 42 views
1

延伸的大型类我有一个处理武器在我的游戏大抽象类。通过基本功能列表战斗循环:C#在赞成可读性

OnBeforeSwing 
OnSwing 
OnHit || OnMiss 

我心里有被移动的所有战斗伤害相关的计算到处理只是另一个文件夹。与伤害相关的计算。

我想知道是否通过使OnHit方法成为扩展方法来做到这一点是正确的,或者什么是最好的方法来实现这一点。

另外。周期性地有被修改的代码OnHit的部分,命中伤害公式大是因为它考虑到了大量的象电阻,变换咒语,项目奖金,特殊性能和其它的,类似的游戏元素的条件。

这结束了一个500行OnHit函数,哪种令我感到恐慌。即使有地区指令,也很难在迷宫中迷失方向,甚至分散注意力。

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

然后,也许我可以通过从武器类中的OnHit调用诸如CombatSystem.HandleWeaponHit之类的东西,而不使用扩展方法。这可能更合适。

基本上我的问题是,如果离开它像真的是最好的解决方案,或者如果我可以(应该?)移动这部分代码到一个扩展方法或处理该损伤模型单独的辅助类,以及是否我应该尝试将这个功能分成更小的“任务”功能以提高可读性。

回答

2

我打算出去走走,并建议你的引擎可能不够抽象。请注意,除了您在OP中告诉我的信息之外,我只是在不了解您系统的其他任何信息的情况下提出此建议。

在类似的系统,我已经设计的,有作用和效果。这些是基础类。每个特定的动作(机枪攻击,特定咒语等)都是从Action派生出来的类。行动有一个或多个可应用于目标的特定效果列表。这是使用依赖注入实现的。

战斗引擎没有做所有的数学本身。从本质上讲,它要求的目标来计算它的防御等级,然后通过所有活动的操作循环,并要求他们以确定是否适用于目标任何影响的。如果他们申请,它会要求该行动将其相关效应应用于目标。

因此,战斗引擎很小,而且每个效果都非常小,且易于维护。

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

1

OnHit应的事件处理程序,对于初学者。任何被击中的对象应该引发一个Hit事件,然后你可以有一个或多个事件处理程序与该事件相关联。

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

+0

取决于命中的来源(咒语,武器),它的处理方式截然不同,我如何使用事件处理程序来反映我的代码? – bevacqua 2011-05-25 18:08:12

0

恕我直言Mike Hofer给出了线索​​。

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

在考虑最佳实施之前,您显然需要重新思考整个事情,以确定对物体的最佳责任分配。每一项基本计算必须由它适用的对象来完成。请务必记住GRASP design patterns,特别是信息专家,低耦合高凝聚力

一般而言,您项目中的每种方法应该总是只有几行代码,不再多。对于每一项计算,请考虑哪些是适用此计算的所有类。然后让这个计算成为它们的通用基类的一个方法。

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

然后你就可以建立一个元素扩展方法就像这个假例如:

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; 
    } 
} 

该样品是完全俗气而只是旨在使导线重新设计你的系统更抽象和maintenable方式。

希望这会帮助你!