2015-01-07 6 views
0

Я пишу ответ another question.Является ли это правильным способом реализации перечисления?

Я не уверен, что моя реализация перечисления в порядке. Я расскажу об этом через мгновение. Пожалуйста, просмотрите его и скажите, могу ли я сделать что-то лучше.

Этот маленький прототип (codepen) включает в себя рисование шахматной доски и шахматных фигур. Есть 6 белых и 6 черных шахматных фигур. Для каждого из них мне нужно сохранить его имя (например, "White Bishop") и код Юникода (что-то вроде "\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"}, 
}; 

я хранить данные о распределении всех частей на борту в массиве под названием доска, это инициализация этого массива:

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; 
    }); 

Я правильно определил и использовал перечисление?

+1

Что вы использовали - это объект, и в javascript ничего не называется enum, и если вы достигли своей работы так, как хотите, тогда она должна быть правильной. –

+0

@AmitJoki Хорошо, но я имел в виду перечисление в концептуальном смысле. Может быть, я должен полностью очистить себя от этой концепции, при программировании на JavaScript? – VividD

+1

роза с любым другим названием; он делает то, что вы хотите. В «реальных» перечислениях вы традиционно (следовательно, eNUMeration) получаете числовое значение, и вам обычно не нужно указывать числа: они автоматически увеличиваются в базовом синтаксисе. но опять же, взаимодействие между перечислениями и тем, что у вас есть, очень сопоставимо. также не забывайте, что вы можете сказать a = b = c = 1, чтобы сократить повторение при назначении общих значений во многих местах. – dandavis

ответ

1

Ну, для начала нет Enum в Javascript, но вы можете реализовать его самостоятельно, и, глядя на работу, которую вы сделали, я думаю, что это правильно, и это хорошая попытка.

Но если мы сосредоточимся на логике Enum, мы должны знать, что Enum должно быть постоянных и его элементов значения не должно изменяться поэтому мы должны искать более подходящее решение, потому что в Javascript можно переписать любые объект.

После поиска, который я сделал, я нашел метод Javascript, который может предоставить решение, которое является Object.freeze().

Таким образом, после определяющего вашего Enum вы должны заморозить его, поэтому он никогда не изменится:

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 объекта будет оставаться всегда такими же, так что мы можем предположить, что это Enum.

+1

Я считаю, что это замечательное наблюдение. Это сделает код более надежным, по крайней мере. – VividD

Смежные вопросы