从后端获取枚举并将其用作 javascript 中的字符串
Getting an enum from backend and use it as a string in javascript
今天我与一位 java 后端开发人员进行了一场相当激烈的讨论。我用 jsangular 做前端。他的休息服务向我发送了一个包含枚举的对象。我将其作为字符串获取,需要在 angular 网格中显示。
枚举非常容易解释。
我得到的例子:
Person = {gender: "MAN", position: "IS_EMPLOYED"}
在视图中我必须显示以下内容:
man is employed
所以我用一种简单而通用的方式解决了它:
Person.gender.toLowerCase () + ' ' + Person.position.toLowerCase ().replace ('_', ' ')
他发现这个糟糕的编程并要求我用 if else 或 switch 制作一个映射器
所以:If(Person.gender==="MAN") return "man"
Else if....
标签名称始终与枚举名称相同(只有小写和space而不是下划线)
他大发雷霆,说这是糟糕的编码,基本上很糟糕,是对上帝的罪过...
所以我的问题是这种 bad/good 做法(所以是一个 b/w 故事)或者在某些情况下是可以接受和辩护的?
在我的 phone 上打字,所以我无法将代码示例放在正确的标签中..
制作客户端枚举映射可能是更好的主意 - 然后只发回实际值。所以你可以:
var personTypes: {
"1": "Is Employed",
..
}
然后只需将 1
作为枚举发回并使用查找对象:
console.log("Person status: " + personTypes[Person.position]);
这还可以更轻松地显示类型列表 - 选择一个新类型,然后简单地将枚举发回:
<select ng-model="personTypeEnum" ng-options="enum as type for (enum, type) in personTypes"></select>
有几种方法可以查看:
映射更稳健:
他说得对,应该有完整的映射功能。这允许您处理错误(即,如果您对 position
获得的响应是 "banana",您可能不应该把它扔在那里)。当您可能使用严格的模式时,这在后端开发中尤为重要。
规模很重要:
您的方法技术上没有任何问题。如果条目数量少,或者用户群或应用范围较小,则可能无关紧要。它并不真正符合最佳实践,但它有效,如果这就是最重要的,它可能就足够了。尽管您应该始终努力争取最佳实践,但您需要牢记大局。
效率:
一种方法可能比另一种方法更有效。差异可以忽略不计。在 web 开发中,速度是重中之重,如果两种方法得到相同的结果但一种方法更快,请选择另一种方法。
使用打印对象检查您的控制台。
例如,如果对象是人,那么如果您将此对象呈现为 json,性别(枚举)将是
{"success":true,"person":[{"class":"person","id":26,"comment":null,"gender":{"enumType":"com.project.Person$Gender","name":"MEN"},
所以你可以打印 person.gender.name,这将给 MEN
今天我与一位 java 后端开发人员进行了一场相当激烈的讨论。我用 jsangular 做前端。他的休息服务向我发送了一个包含枚举的对象。我将其作为字符串获取,需要在 angular 网格中显示。
枚举非常容易解释。
我得到的例子:
Person = {gender: "MAN", position: "IS_EMPLOYED"}
在视图中我必须显示以下内容:
man is employed
所以我用一种简单而通用的方式解决了它:
Person.gender.toLowerCase () + ' ' + Person.position.toLowerCase ().replace ('_', ' ')
他发现这个糟糕的编程并要求我用 if else 或 switch 制作一个映射器
所以:If(Person.gender==="MAN") return "man"
Else if....
标签名称始终与枚举名称相同(只有小写和space而不是下划线)
他大发雷霆,说这是糟糕的编码,基本上很糟糕,是对上帝的罪过...
所以我的问题是这种 bad/good 做法(所以是一个 b/w 故事)或者在某些情况下是可以接受和辩护的?
在我的 phone 上打字,所以我无法将代码示例放在正确的标签中..
制作客户端枚举映射可能是更好的主意 - 然后只发回实际值。所以你可以:
var personTypes: {
"1": "Is Employed",
..
}
然后只需将 1
作为枚举发回并使用查找对象:
console.log("Person status: " + personTypes[Person.position]);
这还可以更轻松地显示类型列表 - 选择一个新类型,然后简单地将枚举发回:
<select ng-model="personTypeEnum" ng-options="enum as type for (enum, type) in personTypes"></select>
有几种方法可以查看:
映射更稳健:
他说得对,应该有完整的映射功能。这允许您处理错误(即,如果您对 position
获得的响应是 "banana",您可能不应该把它扔在那里)。当您可能使用严格的模式时,这在后端开发中尤为重要。
规模很重要: 您的方法技术上没有任何问题。如果条目数量少,或者用户群或应用范围较小,则可能无关紧要。它并不真正符合最佳实践,但它有效,如果这就是最重要的,它可能就足够了。尽管您应该始终努力争取最佳实践,但您需要牢记大局。
效率: 一种方法可能比另一种方法更有效。差异可以忽略不计。在 web 开发中,速度是重中之重,如果两种方法得到相同的结果但一种方法更快,请选择另一种方法。
使用打印对象检查您的控制台。 例如,如果对象是人,那么如果您将此对象呈现为 json,性别(枚举)将是
{"success":true,"person":[{"class":"person","id":26,"comment":null,"gender":{"enumType":"com.project.Person$Gender","name":"MEN"},
所以你可以打印 person.gender.name,这将给 MEN