2016-12-24 44 views
1

基本上,我的问题与this一样,除了我必须在特定的时间点上对每个常量执行代码。没有巨大的“常量”类存储游戏对象常量

更具体地说,我试图让我的游戏插件更坚持面向对象和良好的设计原则和标准。以前,我们有巨大的类包含游戏对象常量,巨大的静态register方法(例如registerFirearmsregisterArmor)将这些对象注册到其适当的注册表,然后将它们分配给它们的全局常量。

例如:

public class Items { 
    public static Item firearm; 

    public static void register() { 
     registerFirearms(); 
    } 

    public static void registerFirearms() { 
     firearm = new FirearmItem(); 
     Registry.register(firearm); 
    } 
} 

在游戏加载过程中适当的时候,Items.register();会被调用,所有在类中的值将是准备在整个插件使用。

我只是不太确定我应该如何去存储这些对象实例,而没有一些可怕的不可维护的几千行类。

+0

有很多这样做的游戏,比如'Minecraft'和'Terraria'。他们有每个〜1000行的“常量”文件。所以我认为这是通常的做法(根本不是专家) – ItamarG3

+0

啊,有时间加入我的肥皂盒。将常量分组,而不是通过它们不变的事实,而是通过它们在逻辑上属于您的设计的位置。就像对另一个问题的接受答案一样。 –

+0

可能相关:http://softwareengineering.stackexchange.com/questions/338805/is-it-bad-design-to-leave-a-constants-class-when-refactoring –

回答

0

如何将所有项目存储到配置文件(甚至更好的XML)然后让您的Items.register();读取文件并初始化所有项目?

我会做类似

public class Item { 
    public Item(String type /* any other thing about the item*/) { 
     // do your stuff... 
    } 
} 

public interface ItemCollection { 
    public void register() throws YourProjectException; 
} 

public interface ItemSet implements ItemCollection { 
    private final java.util.Set<Item> items; 

    public void register() throws YourProjectException { 
     try { 
      // open the file 
      // read each item and store it in "i" 
      items.add(i); // you must override the equals method if you want each item to be added just once... 
      // close the file 
     } catch(Exception ex) { // even better if you manage each exception separately 
      // manage the exception 
      throw new YourProjectException(); 
     } 
    } 
} 
1

看来,每一个项目最终需要与注册处注册。因此,一个长长的东西无论如何都是不可避免的。因此,我认为你不一定要看代码组织问题。在我看来,这是一个问题:没有足够的数据管理工具来处理数据。

如果可能的话,我会建议管理java代码之外的数据,探索像SQLite这样的选项。通过这种方式,您可以配置数据库以使维护项目数据的过程更加高效。然后更改您的java代码,以便通过将查询结果迭代到数据库来注册项目。这应该使您的数据更容易管理,并使您的Java代码更加简洁。