gpt4 book ai didi

c# - 对象是否包含有关使用它们的上下文的信息的代码气味?

转载 作者:行者123 更新时间:2023-12-03 23:46:11 25 4
gpt4 key购买 nike

假设我正在制作一个有很多关卡的游戏,当你通过关卡时,会引入新类型的敌人。如果开发人员有敌人并且想要获得可以找到敌人的级别,我能想到的最直观的方法是让他们这样做是在他们所包含的敌人上存储一个列表级别。但是我觉得这是一个问题,因为现在我已经将我的敌人和我的等级结合在一起了。我的敌人现在知道它使用的上下文。我的研究表明,这些类型的关系对于维护软件来说是不健康的,但从上面的级别使用似乎很直观。
这是一个非常基本的实现:

public class Level
{
List<Enemy> typesOfEnemies;
public Level(List<Enemy> typesOfEnemies)
{
this.typesOfEnemies = new List<Enemy>(typesOfEnemies);

for (int i = 0; i < typesOfEnemies.Count; i++)
{
typesOfEnemies[i].AddLevelContainedWithin(this);
}
}
}

public class Enemy
{
public List<Level> levelsContainedWithin = new List<Level>();
public void AddLevelContainedWithin(Level level)
{
levelsContainedWithin.Add(level);
}
}
因此,此代码可能存在一些相关问题。最让我印象深刻的是,我可以为敌人添加关卡,而无需更新关卡的敌人类型,这会使它们不同步。我可以通过创建另一个完成工作的类来解决这个问题,确保 Level 和 Enemy 保持同步,但现在我增加了一层代码复杂性。开发人员现在有另一个他们必须知道的类才能使用。
我的问题是,我如何让开发人员使用这个可维护和直观的?

最佳答案

您可以引入另一个进行耦合的类:

class LevelManager
{
public List<Enemy> GetEnemies(Level l) { ... }
public List<Level> GetLevels(Enemy e) { ... }
}
现在您所有的数据对象都必须知道 LevelManager .
实际上,在您的 Enemy 中甚至都不需要这种依赖。 - 也不是你的 Level -类(class)。如果开发人员想知道敌人可以在哪个级别生成,他可以使用 LevelManager反而。

关于c# - 对象是否包含有关使用它们的上下文的信息的代码气味?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62514082/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com