在这种情况下,幻数可以吗

Are Magic Numbers Okay In This Instance?

本文关键字:这种情况下      更新时间:2023-10-16

在这个关于数组中幻数的问题中,paxdiablo说,除-1、0和1之外的任何数字都是幻数。我知道这只是一个指导原则,但我想知道在指定多维数组的维度时,如果我需要定义维度为x、y和z的常量,是否可以这样做:

typedef boost::multi_array<TileID, 3> TileArray3D;
TileArray3D::size_type GoRPG::MapData::GetWidth() {
    return mData.shape()[0]; 
}

或者这是优选的:

TileArray3D::size_type GoRPG::MapData::GetWidth() {
    return mData.shape()[x_dimension]; 
}

提前谢谢,好吧。

编辑:长度存储在数组中的原因是我使用Boost::multi_array,这就是它们的存储方式。为损坏的代码道歉!我以后可以解决这个问题——现在我只想知道神奇的数字,尽管它仍然有用,谢谢!

不,幻数是不明显的。-101通常是明显的,但并不总是如此。

在你的情况下,你的两个片段对我来说都不明显。为什么你的地图数据的宽度存储在一个数组中?

如果没有看到更多的代码,我更喜欢这个:

auto GoRPG::MapData::GetWidth() {
    return mData.shape()[width_index]; 
}

我认为应该为这种情况定义一个常量,而不是使用数字。在访问第一个元素是直观的事情的情况下,0并不总是"神奇"的。例如:检查字符串的第一个字节,没有理由定义c_first_byte常量。)

但在您的代码中,最好为shape或mData添加一个名为x()的方法,返回您想要的值。不需要向用户公开mDatashape的内部表示。

尽管如此,代码并没有编译。从那以后,您还没有使用decltype来推导返回类型。所有形状的宽度都一样吗?

如果是,那么应该没问题。如果不是,那么更好的方法可能是提供一个默认参数。

  auto MapData::GetWidth(const size_t index = 0) -> decltype( mData.shape()[0]) { 
    return mData.shape()[index];  
  }