2

假设您有一个名为hotelPropertyNumber的变量。内容将始终是一个数字,但通常用作字符串。将其声明为字符串会有什么“错误”,这样您就不必不断地将其转换为字符串......或者这是一个不好的编程习惯?

谢谢。

4

12 回答 12

6

数字是用于计数和测量的数学对象。如果您使用hotelPropertyNumber 进行计数,即对其应用任何算术运算,则它数字并且应该存储为数字类型。

如果不是,那么它不是一个数字;它是一个字符串。

于 2009-06-19T22:25:29.017 回答
6

在某些语言中,您可以创建用户定义类型,例如“ class HotelPropertyNumber”,其中:

  • 完全支持您需要的方法
  • 可以在内部将其数据存储为字符串
  • 可以验证(在其构造函数中)其值具有类似数字的语法
  • 不能与不是 HotelPropertyNumber 实例的其他数字和/或字符串类型实例混淆。
于 2009-06-19T22:31:44.653 回答
3

始终以最简单的形式存储您的信息。在这种情况下,一个整数。必要时将其转换为字符串。几乎所有语言都使这几乎没有痛苦,尤其是对于字符串的整数。

StackOverflow Podcast #58就是一个很好的例子,当时 Jeff 将标题的 HTML 存储在数据库中,而不仅仅是标题本身。当他想稍后添加功能并在不需要 HTML 的地方显示该标题时,这会导致很多问题。

ChrisW 还提出了一个很好的观点,即这样做可以断言类型安全。我认为这已经足够重要了。

于 2009-06-19T22:16:27.757 回答
2

这取决于你想用它们做什么。

你可能永远不会对它们进行算术运算,但是排序呢?整数的排序方式与字符串不同。您希望它们为 1、10、2 等吗?如果不是,则使用整数或特殊的排序方法。

另一方面,使用字符串将允许以后使用更多类型的“数字”。例如“10090A”。并且不会像整数那样出现溢出问题。

于 2009-06-19T22:25:41.263 回答
2

Igor Krovokon 已经说过了,但我想详细说明一下。

为什么你认为酒店号码的内容是一个数字?“12”不是数字。它是一个包含几个数字的字符串。你不能取房间 #153 的平方根,但你可以用数字 153 来做。

酒店房间号不表现为数字。数字是一个数学概念,可以用多种不同的方式在文本中表示。14 可以用罗马数字写成 XIV、“十四”或十六进制的 0xfe,或二进制的 11111110。但是如果你问“房间一一一一一一一一零”,酒店工作人员很可能会给你一个很奇怪的表情。

酒店房间号不是数学数字,因此不应以整数表示。

那么他们是字符串吗?是的,或多或少,但正如您所注意到的,它们确实有一些额外的限制。

并非每个字符串都是有效的酒店号码。“14”很好,但“西瓜”不是。

所以理想情况下,它应该被表示为一种抽象数据类型,它包装了一个字符串,并确保字符串中不存在非数字。

当然,在实践中,如果您采用简单的方法并将房间号表示为整数或字符串,那么您不太可能遇到很多问题。但最好的设计是确保房间号与房间号一样。字符串或整数都不这样做。

于 2009-06-19T23:19:22.653 回答
0

不不一定是错的。但是您可能需要考虑重命名变量以反映它是一个字符串。我认为对于是否应该将其保留为数字或将其转换为字符串没有一个简单的答案。这取决于实际情况。如果您选择将其作为整数存储在应用程序中,并且必须在代码中将其转换为字符串 1000 次,那么可能值得将其转换为字符串一次。您必须根据情况考虑权衡取舍。

于 2009-06-19T22:17:16.943 回答
0

我同意@Eric。您会发现,如果将其声明为字符串,则将其解析为 int 或将其强制为 int 都会出错。只需使用一个int。

于 2009-06-19T22:17:59.297 回答
0

我不同意埃里克。

开发中没有“始终”的规则。

如果您主要将此变量用作字符串,则将其存储为字符串更有意义,并从变量名称中丢失“数字”。

如果你对这个变量做更多的数值运算,那么它是一个数字,应该存储为一个数值,并转换一个字符串作为字符串使用。

于 2009-06-19T22:28:54.783 回答
0

将名称更改为 hotelPropertyIdentifier 是否有意义?这可能会避免调用某个号码的所有含义。

于 2009-06-19T22:30:01.300 回答
0

您始终可以创建一个公共的“HotelPropertyNumber()”函数,该函数将数字作为字符串返回,但 int 仍被隐藏起来。

如果您决定确实不需要幕后的 int,HotelPropertyNumber() 可以只返回私有字符串。

于 2009-06-19T22:41:31.123 回答
0

永远不要说总是。它可能并不总是用数字表示。例如,图14可以细分为14a和14b。或者 21 和 22 可以合并为 21-22。这比和他们做算术更有可能。

查看街道地址,它通常以数字开头。(也非常接近的类比。)

于 2009-06-19T23:40:24.030 回答
-1

这本身并不是一个坏习惯,但它可能会在以后导致麻烦。

现在从个人经验说起:我曾经是存储数值的忠实粉丝,这些数值总是将用作字符串变量中的字符串。我的意思是,为什么不呢,对吧?为您节省了所有繁琐的选角和诸如此类的事情,您可以继续解决问题的真正实质。(当然,决定午餐点什么。)

然后,我花了一天的大部分时间试图弄清楚为什么实时系统会抛出各种疯狂的异常。原来我在数据中看到的“1”实际上是一个小写的“l”。

然后,正如他们所说,我开悟了。

(当然,这可以根据您使用的语言而改变。在 Java 之类的东西中,几行类定义就可以解决所有这些问题。在 Python 或 Perl 中,这个问题甚至没有任何意义——语言只是“做对了”。好吧,无论如何,对于“正确”的一些定义。)

于 2009-06-19T22:55:37.600 回答