2015-12-08 2 views
-1

У меня такое ощущение, что это невозможно? Я пытаюсь проверить множество условий здесь, и мои тесты должны проходить после того, как я переместил пару этих наборов из двух других методов и в это заявление ниже, чтобы скомпоновать все проверки в один оператор if:Множество наборов наборов символов

if ((move.coordinates.x === 0 && move.coordinates.y === 0 || 
     move.coordinates.x === 0 && move.coordinates.y === 1 || 
     move.coordinates.x === 0 && move.coordinates.y === 2) 
     || 

     (move.coordinates.x === 1 && move.coordinates.y === 0 || 
     move.coordinates.x === 1 && move.coordinates.y === 1 || 
     move.coordinates.x === 1 && move.coordinates.y === 2) 
     || 

     (move.coordinates.x === 2 && move.coordinates.y === 0 || 
     move.coordinates.x === 2 && move.coordinates.y === 1 || 
     move.coordinates.x === 2 && move.coordinates.y === 2)) 
    { 
     ...then do something 
    } 

Кажется, что параны не имеют никакого значения здесь, отделяя условные множества.

Я пытаюсь обрезать дубликат кода. У меня были эти 3 набора в разных методах, где логика была в основном одинаковой, но проверена для разных состояний.

Таким образом, я вставил в два других набора состояний (множества означают группу из 3-х сторон, которые составляют заданное состояние) и пытаются проверить эти 3 строки в основном одним способом, а не разбивать на 3, чтобы сократить дублированный код ,

+0

Как уже отмечалось, комбинированный тест просто проверяет, как 'x' и' y' свойства имеют целочисленное значение 0, 1 или 2. ли это не является основанием для excecuting на «что-то сделать» ветвь затем просто перекодирует в набор. – traktor53

ответ

3

упростив нотация, у вас есть

(x == 0 && y == 0 || x == 0 && y == 1 || x == 0 && y == 2) 
|| 
(x == 1 && y == 0 || x == 1 && y == 1 || x == 1 && y == 2) 
|| 
(x == 2 && y == 0 || x == 2 && y == 1 || x == 2 && y == 2) 

Поскольку оператор || ассоциативно, вы можете удалить скобки.

И затем вы можете использовать дистрибутивное свойство для группировки x.

x == 0 && (y == 0 || y == 1 || y == 2) || 
x == 1 && (y == 0 || y == 1 || y == 2) || 
x == 2 && (y == 0 || y == 1 || y == 2) 

И даже использовать распределительное свойство снова

(x == 0 || x == 1 || x == 2) && (y == 0 || y == 1 || y == 2) 

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

var values = [0, 1, 2]; 
values.indexOf(x) >= 0 && values.indexOf(y) >= 0; 
+0

, так что вы не используете ===? – PositiveGuy

+0

@WTF Значения 'move.coordinates.x' и' .y' всегда должны быть числами, поэтому нет необходимости беспокоиться о свободном и строгом сравнении. – Barmar

+0

@WTF Это было частью упрощения обозначений. Чтобы быть более безопасным, вы можете использовать '==='. – Oriol

0

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

if (((move.coordinates.x === 0 && move.coordinates.y === 0) || 
    (move.coordinates.x === 0 && move.coordinates.y === 1) || 
    (move.coordinates.x === 0 && move.coordinates.y === 2)) 
    || 
    ... 

Но, если вы хотите быть немного более эффективным и ясно, я рекомендовал бы переформатирования логику с вложенными if заявления:

if (x==0 || x==1 || x==2) 
{ 
    if(y==0 || y==1 || y==2) 
    { 
    do something... 
3

вы можете используйте логические правила, которые охватывают все возможности, которые вы разрешаете. если вы посмотрите на повторяющиеся значения в вашем коде, вы увидите, что вы пытаетесь исчерпать все комбинации значений x 0,1,2 с комбинациями значений y 0,1,2. поэтому, если вы создадите правило, которое будет включать значения x от 0 до 2 и то же самое с значениями y от 0 до 2, вы можете упростить инструкцию if, как в примере ниже.

var coordx = move.coordinates.x; 
var coordy = move.coordinates.y; 
if ((coordx >= 0 && coordx <= 2) && (coordy >= 0 && coordy <=2)) { 
    // do something 
} 
+0

@Kay ty, обновлено с объяснением – indubitablee

+0

дерьмо, я бы хотел проголосовать за ваши ответы как ответ ... приятно – PositiveGuy

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