Предполагая, что inverse
- это флаг, который вы установили один раз, тогда вам не нужно каждый раз учитывать его, вы можете рассчитать его влияние один раз и просто использовать его как есть,который сократит ваши ветки кода и логику.Если вы хотите изменить его по мере продвижения, вам может понадобиться отделить логику для расчета, чтобы использовать его повторно.
Затем вы можете также извлечь направление движения в автономноеи ваш handleDirection
становится очень простым - вы рассчитываете направление, в котором хотите идти, основываясь на src
и invert
.
let tracker = 0;
//extract logic for the movement offset based on direction
function getDirectionOffset(src) {
return src === 'left' ? 1 : -1;
}
//have a setter for the invert property
function setInverse(isInverse) {
movementModifier = isInverse ? -1 : 1
}
//declare the variable dependent on the inverse property
let movementModifier;
//initialise movementModifier variable
setInverse(false);
function handleDirection(src) {
const offset = getDirectionOffset(src) * movementModifier;
tracker += offset;
}
// usage
setInverse(true);
handleDirection("left");
handleDirection("left");
handleDirection("right");
console.log(tracker);
С учетом всего вышесказанного все это говорит о том, что вам не следует использовать функцию или использовать ее по-другому.Вы можете собрать всю эту функциональность в классе или вместо этого передать всю информацию о функциях, чтобы у вас не было глобальных переменных.Вот примерная объектно-ориентированная реализация концепции:
class TrackerMover {
constructor(inverse) {
this.tracker = 0;
this.movementModifier = inverse ? 1 : -1
}
handleDirection(src) {
const offset = this.getDirectionOffset(src) * this.movementModifier;
this.tracker += offset;
}
getDirectionOffset(src) {
return src === 'left' ? -1 : 1;
}
getPosition() {
return this.tracker;
}
}
//usage
const mover = new TrackerMover(true);
mover.handleDirection("left");
mover.handleDirection("left");
mover.handleDirection("right");
console.log(mover.getPosition())
Кстати, другая альтернатива - НЕ вычислять движение каждый раз.Вы на самом деле знаете, что происходит каждый раз - фактически, у вас есть таблица истинности, где ваши входные данные равны src === left
и inverse
, а выходные - как вы изменили свое отслеживание.
+--------+------------+--------+
| isLeft | isInverted | Offset |
+--------+------------+--------+
| true | true | -1 |
| true | false | 1 |
| false | true | 1 |
| false | false | -1 |
+--------+------------+--------+
Итак, выможно просто поставить эту таблицу.
let tracker = 0;
let invert = false;
const movementLookupTable = {
"true": { },
"false": { },
}
//it can be initialised as part of the above expression but this is more readable
movementLookupTable[true ][true ] = -1;
movementLookupTable[true ][false] = 1;
movementLookupTable[false][true ] = 1;
movementLookupTable[false][false] = -1;
function handleDirection(src) {
const offset = movementLookupTable[src === "left"][invert];
tracker += offset;
}
// usage
invert = true;
handleDirection("left");
handleDirection("left");
handleDirection("right");
console.log(tracker);
В этом случае это может быть излишним, но этот подход может быть полезен, если есть больше флагов (в том числе больше значений для флагов) и /или конечные состояния.Например, может быть, вы хотите ввести четыре направления, но не изменяете значение tracker
, если оно up
или down
.
+-----------+------------+--------+
| direction | isInverted | Offset |
+-----------+------------+--------+
| left | true | -1 |
| left | false | 1 |
| right | true | 1 |
| right | false | -1 |
| up | false | 0 |
| up | true | 0 |
| down | false | 0 |
| down | true | 0 |
+-----------+------------+--------+
Как видите, теперь это не просто логическое значение, вы можете обрабатывать любое значение.Используя таблицу, вы также затем изменяете invert
на что-то вроде windDirection
, поэтому, если движение равно left
, а windDirection
равно right
, результат будет таким же, как сейчас, но вы могли бы получитьнаправление left
и ветер left
, поэтому вы двигаетесь дальше .Или вы можете двигаться up
, а направление ветра - left
, поэтому tracker
(в этот момент координаты X) будут фактически изменены.
+-----------+---------------+---------+
| direction | windDirection | OffsetX |
+-----------+---------------+---------+
| left | right | -1 |
| left | up | 1 |
| left | down | 1 |
| left | left | 2 |
| right | up | -1 |
| right | down | -1 |
| right | right | -2 |
| right | left | 1 |
| up | up | 0 |
| up | down | 0 |
| up | left | 1 |
| up | right | -1 |
| down | up | 0 |
| down | down | 0 |
| down | left | 1 |
| down | right | -1 |
+-----------+---------------+---------+
С четырьмя направлениями и четырьмя направлениями ветрапринять во внимание, что логика может быть довольно раздражающей как для чтения, так и для поддержки в будущем, в то время как если у вас есть только таблица поиска, это легко, и вы можете легко расширить ее даже для обработки диагоналей (предположим, они меняют значение на 0.5
вместо 1
) и ваш алгоритм на самом деле не будет беспокоиться, если вы просто получите значения из таблицы.