声明变量

声明变量

问题描述:

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

谢谢。

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

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

+0

从来没有想过这样接近它。该算术运算中永远不会使用该变量。这实际上只是一家大型连锁酒店用来区分其物业管理系统安装的标识符。我已经看到并且听到它把这两个都称为“ID”和“号码”。后者是什么卡住,因为这是我第一次听到。无论如何,标识符是在我的应用程序中传递给某些WCF方法/​​函数的变量之一。 – Lenard 2009-06-20 02:12:11

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

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

ChrisW还提出了一个很好的观点,即做到这一点断言type safety。我认为这很重要。

+2

有时候需要创建一个类似HotelPropertyNumber类的用户自定义类型,只是为了与其他字符串和数字区分开来,也许在构造函数中做一些语法验证,并且帮助编写代码更多的自我记录和类型安全等。 – ChrisW 2009-06-19 22:33:40

+0

@Chris:在任何情况下,类型安全都是一个大问题。伟大的建议。 – Eric 2009-06-19 22:37:05

+1

它也有助于使其具备面向未来的性能:因为它实际上是作为数字还是作为字符串存储成为该类的私有实现细节。 – ChrisW 2009-06-19 22:43:13

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

我同意@Eric。你会发现,如果你将它声明为字符串,你会犯错误或者解析为int,或者将它强制为int。只需使用int。

这取决于你想要对他们做什么。

你可能永远不会对它们执行算术,但是如何排序呢?整数将以不同于字符串的方式进行排序。你想让他们成为1,10,2等?如果不是,则使用整数或特殊排序方法。

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

+1

排序是一个很好的整数的亲,而领先-0的问题是一个很好的字符串亲.. – 2009-06-20 00:01:51

我不同意Eric。

开发中没有“总是”规则。

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

如果你对这个变量进行了更多的数字操作,那么它就是一个数字,并且应该作为一个数值存储,并且将一个字符串转换为一个字符串。

+0

我认为总是以最简单的形式存储的东西是最有意义的,我不认为这是不好的建议。恕我直言,牺牲未来发展的灵活性让一点点便利让步,这是一个不必要的复杂层面。通过采取这样的捷径,我被烧得太多了,因此我不能推荐偷工减料。 – Eric 2009-06-19 22:36:21

+0

最简单取决于使用情况。我的反对意见是语义的。说你应该“总是”在软件开发中这样做是一个红旗。为什么你应该总是将一个数值存储为一个整数?如果它只被用作字符串,为什么不断支付CPU开销以转换为字符串?这就是我不同意你的原因。 – Alan 2009-06-19 23:36:55

将名称更改为hotelPropertyIdentifier会有意义吗?这可能会避免拨打某个号码的所有内涵。

在一些语言中,你可以创建一个用户定义的类型,比如“class HotelPropertyNumber”,其中:

  • 支持正是你需要
  • 可以在内部存储数据作为一个字符串的方法
  • 灿验证(在其构造函数中)其值具有类似数字的语法
  • 不能与其他不是HotelPropertyNumber实例的数字和/或字符串类型实例混淆。

您可以随时创建一个公共的“HotelPropertyNumber()”函数,它将字符串作为字符串返回,但int仍然保留在下方。

如果您决定确实不需要覆盖范围内的int,HotelPropertyNumber()可以返回私有字符串。

这不是不好习惯本身,但它可能会导致后来的麻烦。

现在从个人经验说起:我曾经是一个存储数字值的大爱好者,这些数值总是用作字符串变量中的字符串。我的意思是,为什么不,对吧?节省你所有那些繁琐的铸造和任何事情,你可以继续解决问题的真正内容。 (当然,这决定了午餐的内容。)

然后,我花了一天的好时间试图弄清楚为什么现场系统会抛出各种疯狂的例外。结果发现我在数据中看到的“1”实际上是一个小写的“l”。

然后,正如他们所说,我开悟了。当然,这可以根据你使用的语言而改变。在Java这样的东西中,几行类定义可以解决所有这些问题,在Python或Perl中,这个问题甚至不意味着什么 - 语言只是“正确”。好吧,对于“右”的一些定义,无论如何。)

伊戈尔Krovokon已经说过了,但我想详细阐述一下。

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

酒店房间号码不是表示作为一个数字。一个数字是一个数学概念,可以用许多不同的方式用文本表示。 14可以写成XIV罗马数字,“十四”或十六进制0xfe,或二进制11111110。但是,如果你要求“房间一一一一”,酒店工作人员很可能会给你一个非常奇怪的外观。

酒店房间号码不是数学数字,所以它们不应该被表示为整数。

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

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

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

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

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

看看街道地址,这通常是以数字为目的而开始的。 (很接近的比喻,也是。)