背景:
我正在和一位朋友讨论如何正确引用我正在设计的 2D 数组中的元素。我对使用 XNA 的 Point
和 Vector2
结构作为数组引用不满意,因为它们的属性被标记为 X
和 Y
。
我为这些结构创建了结构,ArrayPoint
和ArrayVector2
,并将我自己的属性称为I
和J
。我的朋友认为这是浪费时间,但是,我不喜欢交换X
和Y
引用,因为我的数学背景一直教我使用 i 和 j 作为矩阵,例如使用 myArray[i, j]
而不是 myArray[y, x]
。
处理这种情况的最佳方法是什么?
这仅仅是交换 x 和 y 的情况吗?或者创建自己的结构来按照自己喜欢的方式处理它?这完全取决于个人喜好,因为无论如何这几乎都是任意的吗?
听你的朋友说!
这是一个坏主意的原因有很多,这里有几个:
-
你的数学背景可能会说
i
和j
。但是对于映射到 2D 空间的数组(例如:平铺映射,而不是矩阵),那么x
和y
实际上是可取的,因为它们传达了语义含义,使您的代码更容易理解。(即:你有 X 轴和 Y 轴,而不是 I 和 J)。 -
(通常,在
i
和j
更具语义意义的情况下,您无论如何都不会将索引器存储在结构中 - 它们只是临时的局部变量。 -
如果没有真正的原因,更少的代码总是比更多的代码更可取。编写和测试代码会占用宝贵的时间。使用别人的代码(如内置的 XNA 类型)可以节省您的时间。
-
有一天,你可能会写一些需要
Point
的实用程序函数。如果您有两个版本的Point
那么很可能最终会得到该函数的两个版本。更多的代码,更糟糕的是:重复的代码! -
"不是在这里发明的"是一个非常,真的,非常糟糕的习惯,作为一个程序员。学会接受其他人的代码(只要它有效 - 在这种情况下,它确实有效)。
-
没有其他人这样做。你的代码会让所有试图使用它的人感到困惑和恼火。
-
小性能打击不必要地复制东西。(加上其他一些对性能影响不大的事情。
(另外:索引到具有Vector2
(浮点)的数组有点奇怪。
这不是个人喜好,因为您必须与结构体相互转换才能将数据传递给 XNA 库方法。您将产生转换成本,诚然,转换成本非常小,但如果在循环中重复进行,可能会增加相当可观的成本。
当然,SpriteFont.MeasureString() 返回一个由 X 和 Y 成员组成的数据结构而不是 Width 和 Height 是愚蠢的,但处理这种奇怪比尝试对抗它更容易。
我的建议是尝试使用 x 和 y 作为索引,并避免额外的开销。
我认为你做的很好。我唯一建议不要这样做的时候是,如果你增加了很多复杂性。如您所知,XNA软件和其他必须处理许多计算和图形的软件如果效率低下,可能会因微小的变化而陷入困境。但是,您正在做的只是帮助您,不应该增加上述复杂性。我会说去吧。