一位著名的程序员告诉我,下面的代码无需if
调用抽象类也可以用同样的方式实现,这让我产生了很大的疑问。
abstract class Clases
{
public abstract int[] Atributos();
}
class Guerrero : Clases
{
public int _StatFuerza = 10;
public int _StatDestreza = 10;
public int _StatConstitucion = 10;
public int _StatInteligencia = 10;
public int _StatSabiduria = 10;
public int _StatCarisma = 10;
public int _StatHealthPower = 10;
public override int[] Atributos()
{
int[] atr = new int[6];
atr[0] = _StatFuerza;
atr[1] = _StatDestreza;
atr[2] = _StatConstitucion;
atr[3] = _StatInteligencia;
atr[4] = _StatSabiduria;
atr[5] = _StatCarisma;
atr[6] = _StatHealthPower;
return atr;
}
}
class Mago : Clases
{
public int _StatFuerza = 15;
public int _StatDestreza = 15;
public int _StatConstitucion = 15;
public int _StatInteligencia = 15;
public int _StatSabiduria = 15;
public int _StatCarisma = 15;
public int _StatHealthPower = 15;
public override int[] Atributos()
{
int[] atr = new int[6];
atr[0] = _StatFuerza;
atr[1] = _StatDestreza;
atr[2] = _StatConstitucion;
atr[3] = _StatInteligencia;
atr[4] = _StatSabiduria;
atr[5] = _StatCarisma;
atr[6] = _StatHealthPower;
return atr;
}
}
这就是我所说的那个类
public void Estadisticas(int _mainEXP, string especializacionSelec, string razaSelec)
{
int bonusClassFuerza;
int bonusClassDestreza;
int bonusClassConstitucion;
int bonusClassInteligencia;
int bonusClassSabiduria;
int bonusClassCarisma;
int bonusClassHp;
if (especializacionSelec == "Guerrero")
{
int[] especialidad = new Guerrero().Atributos();
bonusClassFuerza = especialidad[0];
bonusClassDestreza = especialidad[1];
bonusClassConstitucion = especialidad[2];
bonusClassInteligencia = especialidad[3];
bonusClassSabiduria = especialidad[4];
bonusClassCarisma = especialidad[5];
bonusClassHp = especialidad[6];
}
else if (especializacionSelec == "Mago")
{
int[] especialidad = new Mago().Atributos();
bonusClassFuerza = especialidad[0];
bonusClassDestreza = especialidad[1];
bonusClassConstitucion = especialidad[2];
bonusClassInteligencia = especialidad[3];
bonusClassSabiduria = especialidad[4];
bonusClassCarisma = especialidad[5];
bonusClassHp = especialidad[6];
}
}
这是正确的编程方式吗?
代码可以进一步简化吗?.
不重复规则在多大程度上适用?.
ifs的使用会影响代码的正确开发吗?
搜索与该主题相关的信息,感谢这个示例,我学会了如何创建抽象类。
很难定义什么是正确的,为此您必须以软件质量标准为基础,以便为您的问题找到最佳解决方案。如果有人可以说使用抽象类来定义基类类型是可以的。
您总是可以进一步简化代码,在这种情况下,您可以重载 Stats 方法来为战士和法师生成逻辑。
您必须尝试始终应用它,但这取决于程序员在这种情况下的经验,以了解代码中的顺序和易读性。
这将取决于谁的程序。如果一个方法是从具有多个 IF 的数百行代码生成的,那么就会出现问题。重要的是分析是否有任何设计模式可以帮助我以更模块化的方式进行编程。
如果我们坚持面向对象的编程原则,那么包含 IF 以检查对象属性值的代码行会“破坏”封装原则。
如果我们将其视为错误的来源,这将取决于程序员是否能够很好地实现代码,以便满足 ifs 并且在请求不存在的对象的属性或忘记它是时不会产生错误与“Hello”不同,“hello”要求字符串相等并为此省略一个指令块。等等。
在性能方面,编译器将 If / Else 视为跳转到另一个代码块。此操作非常标准且经过很好的优化,因此任何处理器都可以轻松实现,因此在这方面它是 NO。
警告:谈论类(战士、法师等)和 C++ 类有点令人困惑,我试图通过在括号中对其进行标记来使其清楚。有时我会同时提到两者...
使用抽象类允许您拥有单独的代码。每个类(Wizard、Warrior 和其他任何类)都可以放在一个单独的文件中,这样您就可以保持代码更整洁。
您添加的功能越多(现在您只向我们展示了
Atributos
或Estadisticas
,但肯定会有更多或会有更多功能),如果您使用if-else
. 想象一下,你有 5 个职业(战士、法师),每个职业需要 10 个函数,每个函数至少有 15 行代码(这还不算多)。它们是5 * 10 * 15 = 750
同一个文件中的行,在我看来,它有 10 个函数和 15 行。想象一下,随着您需要越来越多的功能或类别(战士、法师)等,这将如何扩展。if-else
此外,与有 5 个不同的文件(每个职业(战士、法师)一个)相比,使用同一文件中的文件更容易出错。另一方面,通过抽象类,您可以一目了然地看到每个类(战士、法师等)的基本功能,因为它们是在那里定义的。
如果您还使用继承,您还可以定义所有类通用的函数,因此您还可以避免为每种类型的类(战士、法师)重复相同的代码。所以你也可以定义子类(Wizard 可以是:sorcerer、druid、dark Wizard、necromancer 等,Warrior 可以是:Archer、solder、mercenary 等)。
最后你有一个程序有很多文件,但如果你把它们排序好没有问题,文件更短更清晰,每一个都指一件事。如果你改变战士的任何特性,你只需要打开一个文件,你改变的一切只会影响战士,如果你必须搜索它们,
if-else
你必须小心不要改变另一个。没有规则总是这样做。对于你手头的东西来说这是一个好主意,但在其他情况下使用它会很方便
if-else
。您必须做的,也是程序员工作的一部分,就是了解编程语言为您提供的工具,了解您的需求,然后就使用什么做出最好的决定。您总是可以退后一步进行更改,但是从一开始就做出最佳决定可以避免以后必须更改所有内容,因为您将浪费时间进行在用户级别不会被注意到的更改,而不是能够添加对程序的改进。我不能告诉你,这将取决于所有代码的情况,从你向我们展示的内容来看,它看起来很简单,但在后台肯定会更复杂。使用继承的想法可能很有用,但你必须看看它是否适用于你的情况。
很简单,常识会告诉你。如果你会因为不重复而失去代码的可读性,那么你可能想要重复,请记住你可能不会独自编程。但是,是的,总是尽量不要重复代码,这是更强调的一点之一,而且似乎是正确的。
它
if
是编程语言提供的另一种工具,你必须在有意义的时候使用它,没有更多的东西了。问题是要了解其他工具,以了解何时if
最好以及何时必须使用switch
,for
,while
,do-while
,clases
,herencia
等。要解决此问题
if
,您必须执行以下操作。抽象类被创建
该类调用如下
利用我们将它作为列表传递的事实,我们可以
datagridview
用这些新信息填充如果我们想提取关于它们中的任何一个的信息,
Razas
我们使用 datagridview 提供给我们的触发器之一,例如当点击单元格时它会触发某个空白,并利用我们已经点击的事实为我们带来了我们在表中的什么位置的引用,以便它可以访问特定的值,从而返回引用我们搜索参数的数据。捕获最终结果。
我回答自己是因为这是一种继续成长的个人方式,因此与我处于相同情况并且偶然遇到此出版物的其他人对如何解决他们的一些问题有了更多的了解。