首页 > 解决方案 > 在向系统添加新功能时,如何避免不断更改界面?

问题描述

在我的工作中,我试图创建更多的模块化系统,因为我们倾向于在游戏中使用类似的机制,但差异很小。为此,我一直在使用接口,但一直被某些问题所困扰,尤其是与添加小功能有关的问题。

例子:

以我们的进化系统为例。我创建了 IEvolvable 接口,它具有进化级别的属性和 Evolve() 方法。

public interface IEvolvable
{
    int evolution { get; }

    bool IncreaseEvolution(int numEvolutions);
}

然后,我在 Character 类上实现了这个接口,并且通过我的 Evolution 处理类基于某些条件,我想进化我的角色。

public class EvolutionHandler
{
    public IEvolvable evolvable;

    public void TryEvolveCharacter
    {
        if(someCondition)
        {
            evolvable.IncreaseEvolution(1);
        }
    }
}

然后,稍后我们会说,我们希望角色根据等级进化!极好的。我们有一个 ILevellable 接口,其中包含 Level、xp 等。

public interface ILevellable
{
    int Level{ get; }
    int MaxLevel{get;}
    int XP {get;}
    bool LevelUp(int numLevels);
}

我们可以根据级别的变化使用这些数据来控制进化发生的时间。但这是我的问题:

我的进化处理程序类与 IEvolvable... 不是 ILevellable... 接口... 那我该怎么办?

我可以让 IEvolvable 扩展 ILevellable 或反之亦然...或者我可以创建一个扩展 IEvolvable 和 ILevellable 的新接口。现在我还必须修改我的进化处理程序以适应这些变化。

但是,如果我们不想让进化处理程序在我们的新游戏中再考虑关卡,会发生什么?使用旧代码吗?我是否应该扩展我的旧代码以包含 Ilevellable 接口?

public interface ILevelEvolver : ILevellable, IEvolvable
{
}

public class EvolutionHandler2
{
     public ILevelEvolver levelEvolvable;

    public void TryEvolveCharacter
    {
        if(levelEvolvable.Level > 10)
        {
            evolvable.IncreaseEvolution(1);
        }
    }
}

标签: c#interfacearchitecture

解决方案


关键词是:

  • 区分不同的和保持不变的
  • SOLID原则之一:开放扩展封闭修改

最后在您的情况下将使用策略模式:

public interface IEvilutionChecker{

    bool AllowEvolution();
}


public class EvolutionCheckerA : IEvilutionChecker{
    private ILevellable levelEvolvable;
    public EvolutionCheckerA(ILevellable levelEvolvable){
        this.levelEvolvable = levelEvolvable;
    }
    public bool AllowEvolution(){
        return levelEvolvable.Level > 10;
    }
}

public class EvolutionCheckerB : IEvilutionChecker{
    private IEvolvable evolvable;
    public EvolutionCheckerB(IEvolvable evolvable){
        this.evolvable = evolvable;
    }
    public bool AllowEvolution(){
        return someCondition;
    }
}

public class EvolutionHandler2
{
    public IEvolvable evolvable; 
    public IEvilutionChecker EvolutionChecker {get;set;};

    public void TryEvolveCharacter
    {
        if(EvolutionChecker.AllowEvolution())  
        {
            evolvable.IncreaseEvolution(1);
        }
    }
}

推荐阅读