【问题标题】:Is this a correct way of implementing an enumeration?这是实现枚举的正确方法吗?
【发布时间】:2015-01-07 11:08:13
【问题描述】:

我正在写another question的答案。

我不确定我的枚举实现是否正常。我稍后会描述它。请查看它,并告诉我是否可以做得更好。

有问题的小原型(codepen 此处)涉及绘制棋盘和棋子。有6个白棋子和6个黑棋子。对于它们中的每一个,我都需要保留其名称(如"White Bishop")和Unicode 代码(如"\u2654")。因此,我将变量pieces 定义如下:(还有一块NONE 被证明对棋盘上的空方格很有用)

var pieces = {
    NONE :          {name: "None",          code: " "}, 
    WHITE_KING :    {name: "White King",    code: "\u2654"}, 
    WHITE_QUEEN :   {name: "White Queen",   code: "\u2655"}, 
    WHITE_ROOK :    {name: "White Rook",    code: "\u2656"}, 
    WHITE_BISHOP :  {name: "White Bishop",  code: "\u2657"}, 
    WHITE_KNIGHT :  {name: "White Knight",  code: "\u2658"}, 
    WHITE_POWN :    {name: "White Pown",    code: "\u2659"}, 
    BLACK_KING :    {name: "Black King",    code: "\u265A"}, 
    BLACK_QUEEN :   {name: "Black Queen",   code: "\u265B"}, 
    BLACK_ROOK :    {name: "Black Rook",    code: "\u265C"}, 
    BLACK_BISHOP :  {name: "Black Bishop",  code: "\u265D"}, 
    BLACK_KNIGHT :  {name: "Black Knight",  code: "\u265E"}, 
    BLACK_POWN :    {name: "Black Pown",    code: "\u265F"}, 
};

我将棋盘上所有棋子的分布数据保存在一个名为 board 的数组中,这是该数组的初始化:

   var board =[];

    for(var i = 0; i < boardDimension*boardDimension; i++) {
        board.push({
            x: i % boardDimension,
            y: Math.floor(i / boardDimension),
            piece: pieces.NONE
        });
    };

    board[0].piece = pieces.BLACK_ROOK
    board[1].piece = pieces.BLACK_KNIGHT
    board[2].piece = pieces.BLACK_BISHOP
    board[3].piece = pieces.BLACK_QUEEN
    board[4].piece = pieces.BLACK_KING
    board[5].piece = pieces.BLACK_BISHOP
    board[6].piece = pieces.BLACK_KNIGHT
    board[7].piece = pieces.BLACK_ROOK

    board[8].piece = pieces.BLACK_POWN
    board[9].piece = pieces.BLACK_POWN
    board[10].piece = pieces.BLACK_POWN
    board[11].piece = pieces.BLACK_POWN
    board[12].piece = pieces.BLACK_POWN
    board[13].piece = pieces.BLACK_POWN
    board[14].piece = pieces.BLACK_POWN
    board[15].piece = pieces.BLACK_POWN

    board[6*8 + 0].piece = pieces.WHITE_POWN
    board[6*8 + 1].piece = pieces.WHITE_POWN
    board[6*8 + 2].piece = pieces.WHITE_POWN
    board[6*8 + 3].piece = pieces.WHITE_POWN
    board[6*8 + 4].piece = pieces.WHITE_POWN
    board[6*8 + 5].piece = pieces.WHITE_POWN
    board[6*8 + 6].piece = pieces.WHITE_POWN
    board[6*8 + 7].piece = pieces.WHITE_POWN

    board[7*8 + 0].piece = pieces.WHITE_ROOK
    board[7*8 + 1].piece = pieces.WHITE_KNIGHT
    board[7*8 + 2].piece = pieces.WHITE_BISHOP
    board[7*8 + 3].piece = pieces.WHITE_QUEEN
    board[7*8 + 4].piece = pieces.WHITE_KING
    board[7*8 + 5].piece = pieces.WHITE_BISHOP
    board[7*8 + 6].piece = pieces.WHITE_KNIGHT
    board[7*8 + 7].piece = pieces.WHITE_ROOK

而且,在代码的深处,这些数据的使用方式如下:

svg.append("text")
    .attr("x", function (d) {
        return d.x*fieldSize;
    })
    .attr("y", function (d) {
        return d.y*fieldSize;
    })
    .style("font-size", "40")
    .attr("text-anchor", "middle")
    .attr("dy", "35px")
    .attr("dx", "20px")
    .text(function (d) {
        return d.piece.code;
     })
    .append("title")
    .text(function(d) {
        return d.piece.name;
    });

我是否以正确的方式定义和使用枚举?

【问题讨论】:

  • 你使用的是一个对象,javascript中没有什么叫做枚举,如果你已经完成了你想要的工作,那么它一定是正确的。
  • @AmitJoki 好的,但我的意思是概念意义上的枚举。也许我应该在用 JavaScript 编程时彻底清除这个概念?
  • 一朵其他名字的玫瑰;它做你想做的事。在“真实”枚举中,您通常(因此是 eNUMeration)获得一个数字值并且您通常不必指定数字:它们在基本语法下自动递增。但同样,枚举和你所拥有的之间的交互是非常可比的。另外,不要忘记在为许多位置分配共同值时,您可以说 a=b=c=1 以减少重复。
  • 实际上这段代码在这里起到了作用,但它只需要保持不变,并且永远不会变成枚举。

标签: javascript enums


【解决方案1】:

好吧,一开始Javascript中没有枚举,但是你可以自己实现它,看看你所做的工作,我认为这是正确的,这是一个很好的尝试。

但是如果我们关注Enum的逻辑,我们应该知道一个Enum必须是constant和它的elements值应该永远不会改变,所以我们必须寻找更合适的解决方案,因为在 Javascript 中我们可以覆盖任何对象

经过我的搜索,我找到了一个可以提供解决方案的 Javascript 方法,即 Object.freeze()

所以在定义你的枚举之后你应该冻结它,所以它永远不会改变:

var pieces = {
 NONE :          {name: "None",          code: " "}, 
 WHITE_KING :    {name: "White King",    code: "\u2654"}, 
 WHITE_QUEEN :   {name: "White Queen",   code: "\u2655"}, 
 WHITE_ROOK :    {name: "White Rook",    code: "\u2656"}, 
 WHITE_BISHOP :  {name: "White Bishop",  code: "\u2657"}, 
 WHITE_KNIGHT :  {name: "White Knight",  code: "\u2658"}, 
 WHITE_POWN :    {name: "White Pown",    code: "\u2659"}, 
 BLACK_KING :    {name: "Black King",    code: "\u265A"}, 
 BLACK_QUEEN :   {name: "Black Queen",   code: "\u265B"}, 
 BLACK_ROOK :    {name: "Black Rook",    code: "\u265C"}, 
 BLACK_BISHOP :  {name: "Black Bishop",  code: "\u265D"}, 
 BLACK_KNIGHT :  {name: "Black Knight",  code: "\u265E"}, 
 BLACK_POWN :    {name: "Black Pown",    code: "\u265F"}, 
};
var frozenpieces=Object.freeze(pieces);

在这种情况下,frozenpieces 对象将始终保持不变,因此我们可以假设它是一个枚举。

【讨论】:

  • 我相信这是一个很好的观察。它至少会使代码更加健壮。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-27
  • 2012-11-11
  • 2019-09-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-14
  • 1970-01-01
相关资源
最近更新 更多