간단한 curring 으로 시간 측정 함수 작성하기
3 minute read
2024-07-15
시간 측정하는 함수를 큰 생각없이 작성하면 아래와 같이 작성할 수 있다.
function fn() {
const now = Date.now();
// ...
const end = Date.now();
const elapsedTime = end - now;
const elapsedTimeMS = (elapsedTime / 1000).toFixed(3);
console.log('소요 시간 : ', elapsedTimeMS);
}생각의 흐름대로 작성하면 대게 이렇게 작성해왔다. 이를 curring 기법으로 재작성하면 깔끔한 코드가 될 수 있다.
curring
export const createElapsedTimer = (startTime = Date.now()) => {
const timer = (endTime = Date.now()): number => endTime - startTime;
return timer;
};시작 시간을 지정하고 호출 시점에서 걸린 시간을 계산하는 함수다. 이렇게 되면
사용하는 곳에선 호출한 시점에서 비교하기 좋아진다.
const handler = () => {
// ...
const timer = createElapsedTimer()
if (timer() <= 300) {
event.preventDefault();
}
}또한, 인자로 시간을 주입할 수 있도록 했기 때문에 시작 시간을 임의로 결정할 수 있다.
createElapsedTimer(Date.now() + 3000)
createElapsedTimer(defaultTime)jsdoc 까지 붙이면 아래와 같이 작성 가능하다. 타입스크립트에서 타입을 담당하고 있기에 jsdoc 에서는 타입 정보는 생략했다.
/**
* Creates a timer function that returns the elapsed time in milliseconds.
*
* @param startTime - The start time in milliseconds.
*/
export const createElapsedTimer = (startTime = Date.now()) => {
/**
* Calculates the elapsed time in milliseconds from the start time to the given end time.
*
* @param endTime - The end time in milliseconds.
* @returns The elapsed time in milliseconds.
*/
const timer = (endTime = Date.now()): number => endTime - startTime;
return timer;
};테스트 코드
시작, 종료 시간을 인자로 주입할 수 있는 구조이기 때문에 테스트하기 용이하다.
describe('createElapsedTimer', () => {
test('함수를 반환해야 한다', () => {
const timer = createElapsedTimer();
expect(typeof timer).toBe('function');
});
test('시작 시간을 지정할 수 있다.', () => {
const startTime = Date.now() - 1000; // 1초 전
const timer = createElapsedTimer(startTime);
const elapsed = timer();
expect(elapsed).toBeGreaterThanOrEqual(1000); // 최소 1초 이상 경과해야 함
});
test('종료 시간을 지정할 수 있다.', () => {
const startTime = Date.now() - 2000; // 2초 전
const endTime = Date.now() - 1000; // 1초 전
const timer = createElapsedTimer(startTime);
const elapsed = timer(endTime);
expect(elapsed).toBeCloseTo(1000, -2); // 대략 1초 경과해야 함
});
});