是" ASC"或者" DESC"被认为是一个" MAGIC STRING"?

时间:2015-03-24 04:47:17

标签: java c# php

在我们的团队中,我们一直在寻找魔术字符串并使用枚举来使我们的代码更易于管理(在其他一些语言中,这更像是常量),并且一直在质疑字符串是否" ASC"或者" DESC"应被视为魔术字符串。一些开发人员认为这些不符合魔术字符串,而其他人则认为。

有些人认为,通过严格地将数值与排序方向相关联,可以避免字符串格式化问题。

其他人则认为" ASC"和#34; DESC"是关于如何指示排序方向的行业标准,并且为此添加枚举将过度工程化。

我很想知道编程社区对这个主题的看法。

3 个答案:

答案 0 :(得分:0)

IMO,你可以在这种情况下争论。我不反对在源代码中直接看到ASCDESC,也不反对将它们分解为命名常量。 更重要的是,这个决定可能不值得你的团队讨论它的时间。

答案 1 :(得分:0)

是的!传入String文字以指定排序顺序是不好的做法。

它不是行业标准,甚至不接近它。考虑Java的Collections.sort,Haskell的sortBy,C ++ std::sort,ruby的Enumerable.sort_by或C#' s {{1} }。他们都没有在任何地方使用Enumerable.OrderBy/-Descending"ASC"

他们甚至不是SQL中的字符串文字,他们是关键字,因此他们严格按语法检查。

通过在静态类型语言中使用适当的枚举,编译器将检查诸如"这个函数是否对数据进行排序或是数据字段?" "我的论证顺序是否合适?" "什么是任意顺序的字符串"? "在任何地方都有意外的空间或换位吗?"

" ASC"和#34; DESC"在JSON或XML请求中比"DESC"1要好得多,但这是一个完全不同的问题。

答案 2 :(得分:0)

在静态类型语言中,你绝对应该使用枚举而不是字符串常量。原因很简单 - 降低程序员错误的可能性。如果您的方法接受字符串,则方法的用户可以传递任何字符串。当然,"Asc""Desc"可能几乎总是被传递给它,但人们手指很胖,迟早有人会写"Acs"和世界可能会在运行时爆炸。

将此与枚举进行比较。对于运行时,只有两个有效值。如果你传递任何其他内容,则会出现编译错误。

因此,通过使用枚举而不是字符串,您会为编译错误交换运行时错误,这总是一个好主意。对于实际上不是字符串的任何类型的数据使用字符串通常是错误的域建模,这会增加出错的风险。