如何避免幻数?

时间:2015-02-03 18:10:25

标签: magic-numbers

我正在上一个能识别扑克牌的课程。它用在像扑克这样的游戏中,但它有一些其他牌不能成为直/对/等的一部分。

该类获取卡片列表并检查其数值以查看它们是否与手匹配。

我的问题是,在我的应用程序中,有些卡没有数值。像通配符和其他一些。

最简单的做法是让这些卡片具有负值或类似的东西。由于显而易见的原因,我不喜欢这个想法。

我想过为卡片的数值字段使用可以为空的整数,但在使用它之前我总是要检查它是否为空。

这是有道理的,因为我使用没有价值的卡,但它增加了代码的复杂性,我认为这是不必要的。出于这个原因,我考虑实现一个属性(C#)*,如果数值为null,则返回一个不可为空的负int。但这也会返回一个神奇的数字。

这是正确的方法吗?完全避免使用魔法数字,每次检查是否为空,或者是我没想过的东西?

UPDATE:我认为最好的办法是为值创建一个可为空的Int,并返回一个返回值的属性*,如果值为null,则抛出异常。这样我每次都不必检查null,只要发生异常就捕获异常。这有什么不对吗?

*在没有属性的语言中考虑一个getter方法,这是一个返回变量/字段值的方法。

1 个答案:

答案 0 :(得分:1)

尝试为问题域建模。

class Cards开始,其中构建卡片,提供等级(Ace,2,3,..,Jack,Queen,..),诉讼(俱乐部,钻石,心形)和int 取决于你玩的游戏。在任何游戏中,一张牌代表一些价值,也许没有(0)但从不-1。

接下来,通过创建class Hand来完成您的域,Cardclass Deck的集合,以及根据其组成的卡计算手牌总价值的一些方法。 也许添加{{1}}可以用来初始化所有52张牌并进行交易。 等等。