今日,我們來對程式碼進行重構,以提升未來的可擴展性和維護便利性。以下幾項微調:
為了提高程式碼的可維護性和效率,我們將 mobile和 mouse事件整合到一個單一的函數中。這樣做不僅簡化了事件處理邏輯,可避免功能都要重分修改兩邊,也使得未來的修改和擴展更為方便。具體來操作就是,我們使用 handleClueCardInteractionStart 函數來處理滑鼠的 mousedown 和 touchstart 事件,同時使用 handleClueCardInteractionEnd 和 handleClueCardTouchOff 函數來處理觸摸的 mouseup 和 touchend 事件。合併 Mouse 和 Touch 事件。也將處理事件的 function 更名,並在函數的部分多加一個參數判斷是 touch 還是 Mouse 事件。
const handleClueCardInteractionStart = (cardIndex, ev, isTouch = false) => {
isShowTip.value = false;
currentClueCardEl.value = clueCardEl.value[cardIndex];
document.body.appendChild(currentClueCardEl.value);
const x = isTouch ? ev.touches[0]?.pageX : ev.pageX;
const y = isTouch ? ev.touches[0]?.pageY : ev.pageY;
setCurrentClueCardMove(x, y - currentClueCardEl.value.offsetHeight / 2);
const moveEvent = isTouch ? 'touchmove' : 'mousemove';
document.addEventListener(moveEvent, handleClueCardMove);
};
<div
v-for="(clue, index) in clues"
@mousedown.stop="handleClueCardInteractionStart(index, $event, false)"
@touchstart.stop="handleClueCardInteractionStart(index, $event, true)"
@mouseup.stop="handleClueCardInteractionEnd(index, $event)"
@touchend.stop="handleClueCardInteractionEnd(index, $event)"
>
<!-- 略 -->
</div>
移除 timelineEventsStyleRaw 資料。當初動畫的流程有點複雜,關於位子的資料就有三份,
currentTimelinePosition、timelineEventsStyleRaw、timelineEventsStyleRawAnimationTarget。因為 timelineEvents 與 style 資料分不同變數處理,所以變成很難去看畫面的位置與style的對應。這邊的處理是先移除其中一份資料,將資料直接綁上 timelineEvents 的資料當中。
<div
v-for="(timelineEvent, index) in timelineEvents"
:style="isAnimation ? timelineEventsStyleRawAnimationTarget[index] : { transform: timelineEvent.transform }"
>
<!--略-->
</div>
對於 initialGameState 和其他初始化數據,改使用函數來生成初始狀態,而不直接複製和解析 JSON。
const generateInitialGameState = () => ({
currentStep: 1,
totalStep: 8,
stepCorrect: Array(8).fill(null),
score: 0,
scoreRecord: Array(8).fill(0),
});
const gameStatus = reactive(generateInitialGameState());
重構(Refactoring)是一個非常重要的工程實踐,它能幫助保持程式碼的可讀性、可維護性和可擴展性。以下是三個實用的重構技巧: