// 외부 의존성 stub — 학습자가 건드릴 필요 X export const __trackCalls: string[] = []; export const analytics = { track: (name: string) => { __trackCalls.push(name); } }; export const __cacheStore: Record<string, unknown> = { user: { id: 1, name: 'Alice' } }; export const cache = { get: (k: string) => __cacheStore[k] }; export const __storage: Record<string, string> = {}; export const localStorageShim = { getItem: (k: string) => __storage[k] ?? null, setItem: (k: string, v: string) => { __storage[k] = v; }, }; export interface Item { id: number; price: number } // TODO: 아래 함수들의 숨은 부수효과를 별도 함수로 분리하세요. // getUser/calculateTotal/formatDate 는 "이름이 약속하는 동작" 만 하도록. // 부수효과 함수는 동사형 이름으로 export 하세요 // (예: trackUserFetch, persistLastTotal, logDateFormat). // 기존 export 시그니처는 유지하면서 추가로 export 만 하면 됩니다. export function getUser() { const user = cache.get('user'); analytics.track('user_fetched'); return user; } export function calculateTotal(items: Item[]) { const total = items.reduce((sum, item) => sum + item.price, 0); localStorageShim.setItem('lastTotal', String(total)); return total; } export function formatDate(date: Date) { console.log('Formatting date:', date); return date.toISOString().slice(0, 10); }
Tests