我目前正在做一个项目Unity。简而言之,这是一款关于太空的游戏,玩家控制一颗行星“绕”其恒星运行,并保护其免受各种危险。
在我的项目中,我有一个抽象类AbstractMovementSystem,其中的类PlanetMovementSystem和MoveToTargetSystem.这样做是因为在上面的类中仍然会有方法Move和字段_maxSpeed,_currentSpeed并且创建抽象类可以让您遵守该原则DRY。
这些类仅负责将对象“移动”到新位置。在这种情况下,这个新位置的计算发生在实现该接口的PlanetMovementCalc和类中。这就是问题开始的地方:MoveToTargetCalcIMoveCalculator
要计算新位置,MoveToTargetCalc需要两个向量和一个速度,以及 PlanetMovementCalc-input以 类型值的形式表示float轨道半径和速度。正如您可以想象的,如果我添加两种方法来计算 中的新位置IMoveCalculator,那么我将必须实现为MoveToTargetCalc, 设计的方法,PlanetMovementCalc反之亦然。什么PlanetMovementCalc,什么MoveToTargetCalc——这当然是没有必要的。如果你将方法实现为空,那么这将违反里氏原则,而如果你以正常方式实现方法,那么它只是一堆不会被使用的额外代码。
问题:该怎么办?一般来说,从项目中删除接口,因为PlanetMovementCalc根据 MoveToTargetCalc设计它们不应该互换?或者说使用接口有什么意义吗?如果是,那么如何正确使用它们呢?
(我为这个愚蠢的问题道歉,我只是没有太多经验,而且我无法“记录”自己)
奇怪的是,建筑是从命名开始的!如果你的架构以类开始
GameManager,任何人都会说你的架构是ShinimaHuina,甚至没有指定这个类到底做什么。abstract。private。 。publicETC。这些是访问修饰符,而不是名称成员!Manager或者说System,在 99% 的情况下,当一个人无法表述该实体到底在做什么时,这些词是寄生的吗?缩写绝对是邪恶的,但缩写是可以接受的,就像在特定领域中普遍接受的那样,例如Str在Agi电子Int游戏中,尽管当一个单词在某些情况下被缩写而在其他情况下不被缩写时,就会变得一团糟。除了它有两个字段这一事实之外
AbstractMovementSystem,您还没有写过有关其业务流程的任何文字。为什么叫它AbstractMovementSystem?因为鬼知道什么是抽象的,而是与运动相关的东西!如果不同的实体仅通过属性和方法的名称联合起来,那么它们通过一个公共接口联合起来,因为它们不继承任何逻辑,就像单元和可破坏的装饰一样,它们都处理IDamagable,但收到的伤害处理方式不同由每个。基于 和 两个属性Speed,MaxSpeed您只能挑选出界面ISpeed,尽管行星以可变速度移动并且具有速度上限,这非常奇怪。在这些情况下,我诚实地将类命名为ala...
XXX并且已经实现了我需要的功能,我在方法名称的上下文中给出了反映此功能的名称,或者鉴于多重职责将实体划分为多个实体。我实在不明白为什么运动的逻辑要分类,为什么星球的运动不描述到星球的收银台上?在某些情况下,我们将逻辑从类中取出,例如在模式中
State,因为它发生了变化,但为什么会在这里呢?如果太阳系中的所有物体都按照牛顿力学运动,就会有一个 type 类
CelestialBody,所有物体都继承自该类,以及某种NewtonPhysics.你的情况并非如此,游戏不需要真实的物理,恒星不会移动,行星严格地沿圆周移动,而飞船则可以随心所欲地飞行,它们实际上没有任何共同点与彼此。你的问题不在于接口,也不在于抽象,而在于事实上你无法阐明你需要做什么......以及为什么你应该这样做......而你只是跑在机车前面,所以奔跑而不去思考,因为思考会让人痛苦!