假设“inverse”是一个标志,您只需设置一次,然后无需每次考虑它,您可以计算其影响一次并直接使用它,这将减少您的代码分支和逻辑。如果您想随时更改它,则可能需要分离计算逻辑,以便重复使用。
然后,您还可以将移动方向提取为一个独立的函数,您的“handleDirection”变得非常简单-根据“src”和“invert”计算所需的方向。
let tracker = 0;
function getDirectionOffset(src) {
return src === 'left' ? 1 : -1;
}
function setInverse(isInverse) {
movementModifier = isInverse ? -1 : 1
}
let movementModifier;
setInverse(false);
function handleDirection(src) {
const offset = getDirectionOffset(src) * movementModifier;
tracker += offset;
}
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;
}
}
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": { },
}
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;
}
invert = true;
handleDirection("left");
handleDirection("left");
handleDirection("right");
console.log(tracker);
在这种情况下,这种方法可能有些过度,但如果有更多的标记(包括标记的更多值)和/或最终状态,这种方法可能会很有用。例如,也许你想引入四个方向,但如果它是up
或down
,就不修改tracker
值。
+-----------+------------+--------+
| 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 更改值),只要您从表中获取值,您的算法就不会真正关心。
src
гҖҒinverse
е’Ңtracker
)пјҢдҪҶеҸӘжңү1дёӘеҸӮж•°(src
)дё”жІЎжңүиҝ”еӣһеҖјгҖӮеӣ жӯӨпјҢж— и®әдҪ еҰӮдҪ•з»“жһ„if
sпјҢе®ғйғҪдёҚдјҡйҖҡиҝҮжҲ‘зҡ„д»Јз Ғе®ЎжҹҘгҖӮ - Peter Btracker
),对象本身具有一个标志,它将朝相反方向移动(invert
)。然而,作为自由浮动的函数,这确实是不好的,因为您正在操作一些不一定相关的全局状态。 - VLAZ