如何避免幻数?

How to avoid magic numbers?

我正在制作一个 class 来识别扑克手牌。它用于扑克之类的游戏,但它还有一些其他卡片不能成为 straight/pair/etc.

的一部分

class 获取纸牌列表并检查它们的数值以查看它们是否与一手牌相匹配。

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

最简单的做法是让这些卡片具有负值或类似的值。我不喜欢这个想法,原因很明显。

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

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

执行此操作的正确方法是什么?完全避免幻数,每次都检查是否为空,或者我没有想到的东西?

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

*想想没有属性的语言中的 getter 方法,因此 returns variable/field.

的值的方法

尝试对问题域建模。

从一张 class Cards 开始,一张卡片的构造提供 等级 (A、2、3、..、J、Queen、..)、suit(梅花、方块、红心)和一个 int value,这取决于你玩的游戏。在任何游戏中,一张牌都代表某种价值,也许什么都不是 (0) 但永远不会是 -1。

接下来,通过创建 class Hand 来完成您的域,它是 Card 的集合,以及一些根据组成手牌的牌计算总价值的方法. 也许添加一个 class Deck 可以用来初始化所有 52 张牌并从中发牌。 等等