好的,开始翻译。这里可能会引起一些负面评价,但枚举是我最喜欢的东西之一。
角度
专注于设计和代码的最佳实践。因为数据库没有“数据类型”,而不使用枚举?好吧。那么出于同样的原因,我们也不要制作任何自定义类。这是无意义的。
枚举优点
(注意:我用的是C#)
1. 允许您根据问题域声明事物。字符串是字符串,但MonsterType枚举是一个怪物(类型)。
2. 枚举是强类型的。使用未定义的枚举值会导致编译错误。另一方面,字符串拼写错误则需要进行调试。
3. 我特别喜欢它用于switch语句。比整数要好得多:
switch(MonsterType)
4. 枚举可以详尽地定义所有有效值。
5. 倾向于具有文件性。
6. 代码质量增强器-当然,您必须重新编译以添加新成员,但这是深思熟虑的,而错过了相关的代码更改将爆炸(一件好事),与在某个地方表现为难以捉摸的逻辑/处理错误的新字符串值不同,需要您进行调试会话。
7. 默认为零,而不是空值。有趣的是,空值概念可能会混淆事情。将“null”保留在它应该在的数据库中。
8. 专业编码提示:始终明确定义默认成员。关于
MonsterType.Unknown = 0
。您的奖励将是更易于编写的代码,不容易出错且更易于阅读。您的维护程序员会感谢您。
字符串糟糕
1. 默认值为null。反复切换空值和“空字符串”是一场持久的战斗。我经常看到像这样的愚蠢、错误的代码:
if(string.IsNullorEmpty(myString.Trim()) ...
- 如果myString为null,则您的程序会因运行时异常而崩溃。枚举不会发生这种情况。
2. 字符串比较区分大小写。
3. 容易出现拼写错误。
4. “字符串”类型是通用的,并不能帮助您根据问题域表达您的问题。
5. 设置
myString = null
,从数据库中获取的IS NOT具有值的变量,甚至不是一个对象,但我们试图将其视为它!
整数混淆
if (MonsterType == 3)...
这是什么意思?说得够了。
这里有一个实际的练习。在您的IDE中,单击该“3”,然后要求它“查找定义”。如果您的IDE能说话,它会说:“为什么不根据您的问题域定义这些东西,而不是期望我猜测“3”是什么?”
哦,我知道了。我会在某个地方声明一大堆常量... 在某个地方。让我们假装我们正在使用枚举!这样比使用一个具有连贯的、类型安全的值更有趣!
null让我疯了
C#有一个String.Empty
静态属性是有原因的。它不会劫持一个有效值(例如空格)或null来表示一个明确不是任何(有效)字符串的实例化字符串对象。这与null不同。
null意味着什么也没有,字面上就是“走开,没人在家”。编程人员经常希望它表示“未知的怪物类型”,但天哪,要显式地定义这样的概念(参见上面的枚举提示)。在我看来,像这样使用null意味着你的设计缺少某些东西。
null是代码僵尸。它在四处走动,但它什么也不是,已经死了,无论如何。如果你不小心,它会咬你!
你将体验到决定将“空”字符串存储为空格字符还是null的无穷的乐趣;
以及空格实际上是一个有效的字符串域值,而不是“没有值”的值;
而且,null和“空字符串”真的不意味着相同的事情,当你需要它们的“自然”功能时,试图让它们变得如此会导致问题;
还有,在代码内不断地调整将string.empty转换为null、space及其反之以适应手头的任务。随着时间的推移,你的代码在这方面会变得不一致。
现在听我说并相信我以后会明白。