Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我应该如何将此块分解为更小的功能单元?_Java_Oop - Fatal编程技术网

Java 我应该如何将此块分解为更小的功能单元?

Java 我应该如何将此块分解为更小的功能单元?,java,oop,Java,Oop,我正在写一个应用程序来帮助我的朋友运行一些数字来平衡游戏 由于有大量的类和stat变量,这个项目比我最初想象的要大 我是在制造英雄,他们应该代表英雄的统计资料。该对象由每个类扩展,即Marksman,它提供与该类相关的特定功能。我正在通过csv文件阅读这些英雄,因此可以同时测试多个课程和技能公式。下面是我用来制作HeroObject的函数: 我不必指出其中有多少是重复代码,但我不确定如何在不再次检查类的情况下将case部分分解为自己的类 tl;博士: 每个类都在扩展HeroObject,因此具有

我正在写一个应用程序来帮助我的朋友运行一些数字来平衡游戏

由于有大量的类和stat变量,这个项目比我最初想象的要大

我是在制造英雄,他们应该代表英雄的统计资料。该对象由每个类扩展,即Marksman,它提供与该类相关的特定功能。我正在通过csv文件阅读这些英雄,因此可以同时测试多个课程和技能公式。下面是我用来制作HeroObject的函数:

我不必指出其中有多少是重复代码,但我不确定如何在不再次检查类的情况下将case部分分解为自己的类

tl;博士: 每个类都在扩展HeroObject,因此具有相同的构造函数,但我仍然需要通过各自的接口创建这些构造函数。如何在功能上分离以下块:

return new SomeClass(Integer.valueOf(heroLine[0]), Integer.valueOf(heroLine[1]), 
                Integer.valueOf(heroLine[2]), Integer.valueOf(heroLine[3]), 
                Integer.valueOf(heroLine[4]), Integer.valueOf(heroLine[5]), 
                Integer.valueOf(heroLine[6]), Integer.valueOf(heroLine[7]), 
                Integer.valueOf(heroLine[8]), Integer.valueOf(heroLine[9]), 
                heroLine[10]);

当然,您应该将读取Excel文件和创建实例与Hero类分开

我将创建一个HeroFactory,即虚拟构造函数,它可以为我提供Hero和任何其他子类的实例

看起来Excel文件中的列在每种情况下都是相同的。传入所需对象的类型,而不是switch语句

public class HeroFactory {

    public static final Hero createHero(Class heroClass) {
      // create the type of Hero here based on Class passed in.  You can use reflection to make it clean.  No switch needed.
    }
}
使用另一个构造函数可以很容易地减少代码量:

public class Hero {
    public Hero(String [] parameters) {
        // initialize your stuff by iterating over the parameters  instead of passing 11 values.
    }
}

当然,您应该将读取Excel文件和创建实例与Hero类分开

我将创建一个HeroFactory,即虚拟构造函数,它可以为我提供Hero和任何其他子类的实例

看起来Excel文件中的列在每种情况下都是相同的。传入所需对象的类型,而不是switch语句

public class HeroFactory {

    public static final Hero createHero(Class heroClass) {
      // create the type of Hero here based on Class passed in.  You can use reflection to make it clean.  No switch needed.
    }
}
使用另一个构造函数可以很容易地减少代码量:

public class Hero {
    public Hero(String [] parameters) {
        // initialize your stuff by iterating over the parameters  instead of passing 11 values.
    }
}

一方面,你正走在一条好的道路上:你正以某种方式转向工厂模式。当然,正如达菲莫所说,这可以得到扩展

但这并不能解决你真正的问题:那就是——你在使用低级抽象!你看,你正在使用一个字符串数组来表示重要的信息;因此,您的工厂代码非常复杂

含义:在设计良好的OO设置中,您应该避免在创建时需要超过2,3个参数的对象。换句话说:你真的必须后退一步,想想如何提高你的设计所基于的模型的质量。你看,类/接口,它们的存在都是为了提供有用的抽象。你的班级没有做到这一点;因为本质上,你是在打开字符串;从弦开始构建一切

其根本原因是:对于包含元信息的数据,CSV可能是一种糟糕的格式

长话短说:您正试图使您的代码与包含不充分元信息的数据一起工作。如果这是一个选项,您应该退后一步,考虑是否可以从CSV更改为JSON。p> 意思是:不要将字符串行放入文件中。将对象放入您的文件中;然后从那里读回来


如果所有这些都不可能;在我看来,只有两种选择:正如达菲莫所说;考虑使用反射。但是做这样充满活力的事情。。。这并不是Java真正擅长的事情。如果你真的需要大量的代码动态;基于你正在使用的数据,也许其他语言会让你更快地到达目的地。你知道,用python、ruby等语言进行元编程要容易得多。一方面,你走的是一条很好的道路:你正以某种方式转向工厂模式。当然,正如达菲莫所说,这可以得到扩展

但这并不能解决你真正的问题:那就是——你在使用低级抽象!你看,你正在使用一个字符串数组来表示重要的信息;因此,您的工厂代码非常复杂

含义:在设计良好的OO设置中,您应该避免在创建时需要超过2,3个参数的对象。换句话说:你真的必须后退一步,想想如何提高你的设计所基于的模型的质量。你看,类/接口,它们的存在都是为了提供有用的抽象。你的班级没有做到这一点;因为本质上,你是在打开字符串;从弦开始构建一切

其根本原因是:对于包含元信息的数据,CSV可能是一种糟糕的格式

长话短说:您正试图使您的代码与包含不充分元信息的数据一起工作。如果这是一个选项,您应该退后一步,考虑是否可以从CSV更改为JSON。p> 意思是:不要将字符串行放入文件中。将对象放入您的文件中;然后从那里读回来

如果所有这些都不可能;在我看来,只有两个选择:作为
达菲莫建议;考虑使用反射。但是做这样充满活力的事情。。。这并不是Java真正擅长的事情。如果你真的需要大量的代码动态;基于你正在使用的数据,也许其他语言会让你更快地到达目的地。你知道,在python、ruby中进行元编程要容易得多,

试着创建另一个HeroObject构造函数,但要让它包含一个int数组和最后一个值

公共HeroObject int[]heroValues,对象heroLine { ThisherValues[0],heroValues[1], heroValues[2],heroValues[3], heroValues[4],heroValues[5], heroValues[6],heroValues[7], heroValues[8],heroValues[9], 希罗林; } 在开关之前构建int数组

int[]heroValues=新的int[]{ 整.valueOfheroLine[0],整.valueOfheroLine[1], 整.valueOfheroLine[2],整.valueOfheroLine[3], 整.valueOfheroLine[4],整.valueOfheroLine[5], 整.valueOfheroLine[6],整.valueOfheroLine[7], Integer.valueOfheroLine[8],Integer.valueOfheroLine[9]}; 然后像这样调用构造函数

新的SomeClassheroValues,heroLine[10];
尝试创建另一个HeroObject构造函数,但让它接受整数数组和最后一个值

公共HeroObject int[]heroValues,对象heroLine { ThisherValues[0],heroValues[1], heroValues[2],heroValues[3], heroValues[4],heroValues[5], heroValues[6],heroValues[7], heroValues[8],heroValues[9], 希罗林; } 在开关之前构建int数组

int[]heroValues=新的int[]{ 整.valueOfheroLine[0],整.valueOfheroLine[1], 整.valueOfheroLine[2],整.valueOfheroLine[3], 整.valueOfheroLine[4],整.valueOfheroLine[5], 整.valueOfheroLine[6],整.valueOfheroLine[7], Integer.valueOfheroLine[8],Integer.valueOfheroLine[9]}; 然后像这样调用构造函数

新的SomeClassheroValues,heroLine[10];

@达菲莫:谢谢你让这篇文章更具可读性。你确定你的英雄类型需要不同的职业吗?你不能让类成为hero的属性吗?在这种情况下,你可以先创建hero,然后根据输入添加类属性。它实际上是HeroObject的属性。存在差异的原因是所使用的找平方式。每个类在每个级别都有自己的stat更改,与利用继承相比,尝试编写一个可以处理每个类的levelUp函数将成为一个整体。您可以在单独的类对象中的委托函数中轻松地移动它。问题是,特定于类的继承方法是否始终使用hero的11个属性。然后,您可以颠倒我所说的:为hero的每个类创建特定的类,但使用容器来保存数据。首先创建stats容器,然后将其传递给英雄类使用的任何类。@duffymo感谢您使其更具可读性。您确定您的英雄类型需要不同的类吗?你不能让类成为hero的属性吗?在这种情况下,你可以先创建hero,然后根据输入添加类属性。它实际上是HeroObject的属性。存在差异的原因是所使用的找平方式。每个类在每个级别都有自己的stat更改,与利用继承相比,尝试编写一个可以处理每个类的levelUp函数将成为一个整体。您可以在单独的类对象中的委托函数中轻松地移动它。问题是,特定于类的继承方法是否始终使用hero的11个属性。然后,您可以颠倒我所说的:为hero的每个类创建特定的类,但使用容器来保存数据。首先创建统计容器,然后将其传递给英雄类使用的任何类。@duffymo谢谢!您可以使用反射使其干净。至少可以说,这是一个奇怪的说法。为什么?我想写更多的来证明,但我太懒了。@duffymo谢谢你!您可以使用反射使其干净。至少可以说,这是一个奇怪的说法。为什么?我会写更多的东西来演示,但我很懒。它仍然可以通过在课堂上传递和使用反射来简化。易于理解的不需要开关。我使用字符串来保存数据的主要原因我和你一样对它感到恼火,因为有些数据必须是字符串。主要是要测试的类名和方程。我很想使用JSON,但我99.9%确信,最终将使用它进行测试的两个人是唯一知道如何创建JSON文件的人,其他人对learning.JSON、XML不友好——你也可以重载虚拟构造函数来获取这些。提供单元测试来演示如何进行。他们很快就会习惯这个想法。你最好推迟UI,从命令行开始。我喜欢你的风格。
让所有这些工作正常,然后再担心GUI。祝你好运。它仍然可以通过在课堂上传递和使用反射来简化。易于理解的不需要开关。我使用字符串来保存数据的主要原因我和你一样对它感到恼火,因为有些数据必须是字符串。主要是要测试的类名和方程。我很想使用JSON,但我99.9%确信,最终将使用它进行测试的两个人是唯一知道如何创建JSON文件的人,其他人对learning.JSON、XML不友好——你也可以重载虚拟构造函数来获取这些。提供单元测试来演示如何进行。他们很快就会习惯这个想法。你最好推迟UI,从命令行开始。我喜欢你的风格。让所有这些工作正常,然后再担心GUI。祝你好运