aiwf
Version:
AI Workflow Framework for Claude Code with multi-language support (Korean/English)
415 lines (345 loc) • 11.3 kB
Markdown
이 가이드는 AIWF v0.3.18+에서 사용된 코드 정리 원칙과 패턴을 문서화하며, 이는 유지보수성, 성능, 개발자 경험에서 상당한 개선을 달성했습니다. 검증 시스템의 주요 정리 작업은 지속적인 코드 품질 개선의 모델 역할을 합니다.
검증 시스템 정리는 체계적인 코드 최적화의 영향을 보여줍니다:
- **코드 감소**: 86% 감소 (348 → 48줄)
- **함수 통합**: 67% 감소 (3 → 1개 주요 함수)
- **중복 제거**: 3개의 중복 검증 함수 제거
- **성능 향상**: ~40% 더 빠른 실행, ~30% 메모리 사용량 감소
- **유지보수성 향상**: 명확한 관심사 분리
- **가독성 개선**: 단순화된 제어 흐름과 로직
- **더 나은 오류 처리**: 일관되고 실행 가능한 오류 메시지
- **통합된 인터페이스**: 모든 검증 작업을 위한 단일 진입점
**이전 (안티패턴):**
```javascript
// 여러 중복 검증 함수들
async function validateInstallationDetailed(tools, language, options) {
// 120줄의 유사한 검증 로직
}
async function validateInstallationEnhanced(tools, language, detailed) {
// 80줄의 중복 검증 로직
}
async function validateInstallation(tools, language) {
// 60줄의 기본 검증 로직
}
```
**이후 (깔끔한 패턴):**
```javascript
// 단일, 통합된 검증 함수
async function validateInstallation(selectedTools, language) {
// 48줄의 통합되고 효율적인 로직
const results = { success: [], failed: [], warnings: [] };
// 공통 검증 로직
const commonValid = await validateCommonFiles();
if (!commonValid.success) {
results.failed.push({ tool: 'aiwf', reason: commonValid.reason });
}
// 도구별 검증 루프
for (const tool of selectedTools) {
const validation = await validateTool(tool);
// 결과 처리...
}
return results;
}
```
**이전 (매직 넘버):**
```javascript
// 코드 전반에 흩어진 매직 넘버들
if (stats.size < 10) { /* ... */ }
if (mdcFiles.length < 2) { /* ... */ }
if (stats.size < 50) { /* ... */ }
```
**이후 (중앙화된 상수):**
```javascript
// 중앙화된 구성
const VALIDATION_CONSTANTS = {
MIN_FILE_SIZE: 10,
MIN_RULE_FILE_SIZE: 50,
MIN_FILE_COUNT: {
CURSOR_MDC: 2,
WINDSURF_MD: 2,
CLAUDE_COMMANDS: 4
}
};
// 명확한 의도를 가진 사용
if (stats.size < VALIDATION_CONSTANTS.MIN_FILE_SIZE) { /* ... */ }
if (mdcFiles.length < VALIDATION_CONSTANTS.MIN_FILE_COUNT.CURSOR_MDC) { /* ... */ }
```
**이전 (복잡한 중첩 조건):**
```javascript
async function validateTool(tool, options) {
if (tool === 'claudeCode' || tool === 'claude-code') {
if (options && options.detailed) {
// 상세한 Claude 검증 로직
} else if (options && options.enhanced) {
// 향상된 Claude 검증 로직
} else {
// 기본 Claude 검증 로직
}
} else if (tool === 'cursor') {
// 유사한 중첩 복잡성...
}
// 더 많은 중첩 조건들...
}
```
**이후 (깔끔한 switch 패턴):**
```javascript
async function validateTool(tool) {
switch (tool) {
case 'claudeCode':
case 'claude-code':
return validateClaudeCode();
case 'cursor':
return validateCursorTool();
case 'windsurf':
return validateWindsurfTool();
default:
return { success: false, reason: `Unknown tool: ${tool}` };
}
}
```
**이전 (일관성 없는 오류 패턴):**
```javascript
// 혼합된 오류 처리 접근법
function validate1() {
try {
// 로직
} catch (e) {
return null; // 일관성 없는 반환
}
}
function validate2() {
// 로직
if (error) {
throw new Error('모호한 오류'); // 부실한 오류 메시지
}
}
```
**이후 (일관된 오류 패턴):**
```javascript
// 통합된 오류 처리 패턴
async function validateTool(tool) {
try {
// 검증 로직
return { success: true };
} catch (error) {
return {
success: false,
reason: `${tool} 검증 오류: ${error.message}`
};
}
}
```
1. **중복 식별**: 반복되는 코드 패턴 검색
2. **매직 넘버 찾기**: 상수로 만들어야 할 하드코딩된 값 찾기
3. **함수 복잡성 분석**: 너무 많은 일을 하는 함수 식별
4. **오류 처리 검토**: 일관성 없는 오류 패턴 확인
5. **의존성 검사**: 사용하지 않는 import와 함수 제거
1. **기능 검증**: 모든 원래 기능이 여전히 작동하는지 확인
2. **성능 테스트**: 속도와 메모리의 개선사항 측정
3. **유지보수성 확인**: 코드가 이해하고 수정하기 더 쉬워졌는지 확인
4. **오류 처리 검증**: 일관되고 도움이 되는 오류 메시지 확인
5. **문서 업데이트**: 변경사항을 문서에 반영
- **코드 줄 수**: 통합을 통한 감소 목표
- **함수 개수**: 중복 함수 감소
- **순환 복잡도**: 제어 흐름 단순화
- **코드 커버리지**: 테스트 커버리지 유지 또는 개선
- **성능 벤치마크**: 실행 시간과 메모리 측정
- **가독성**: 코드가 명확한 이야기를 전달해야 함
- **유지보수성**: 변경사항을 쉽게 구현할 수 있어야 함
- **테스트 가능성**: 코드를 단위 테스트하기 쉬워야 함
- **문서화**: 코드와 주석에서 의도가 명확해야 함
- **일관성**: 코드베이스 전반에 걸쳐 유사한 패턴
```javascript
// 이전
if (fileSize < 10) { /* 오류 */ }
if (files.length < 2) { /* 오류 */ }
// 이후
const CONFIG = { MIN_SIZE: 10, MIN_COUNT: 2 };
if (fileSize < CONFIG.MIN_SIZE) { /* 오류 */ }
if (files.length < CONFIG.MIN_COUNT) { /* 오류 */ }
```
```javascript
// 이전: 여러 유사한 함수들
function validateToolA() { /* 유사한 로직 */ }
function validateToolB() { /* 유사한 로직 */ }
function validateToolC() { /* 유사한 로직 */ }
// 이후: 단일 매개변수화된 함수
function validateTool(toolType) {
const toolConfig = TOOL_CONFIGS[toolType];
// 통합된 검증 로직
}
```
```javascript
// 이전: 중첩 조건들
if (condition1) {
if (condition2) {
if (condition3) {
// 무언가 수행
}
}
}
// 이후: 조기 반환
if (!condition1) return earlyResult;
if (!condition2) return earlyResult;
if (!condition3) return earlyResult;
// 무언가 수행
```
```javascript
// 이전: 혼합 패턴
function operation1() {
try {
// 로직
} catch (e) {
console.log(e); // 일관성 없음
return null;
}
}
// 이후: 일관된 패턴
function operation1() {
try {
// 로직
return { success: true, data: result };
} catch (error) {
return { success: false, reason: error.message };
}
}
```
- [ ] 코드 중복 식별
- [ ] 매직 넘버와 하드코딩된 값 찾기
- [ ] 지나치게 복잡한 함수 위치 파악
- [ ] 일관성 없는 패턴 확인
- [ ] 사용하지 않는 코드 식별
- [ ] 기능 보존 검증
- [ ] 성능 개선 확인
- [ ] 오류 처리 일관성 확인
- [ ] 테스트 커버리지 유지 검증
- [ ] 문서 업데이트 확인
```javascript
// 이전: 여러 함수 호출
async function validate() {
await validateA();
await validateB();
await validateC();
}
// 이후: 배치 작업
async function validate() {
const results = await Promise.all([
validateA(),
validateB(),
validateC()
]);
return consolidateResults(results);
}
```
```javascript
// 이전: 여러 파일 시스템 호출
const file1Exists = await fs.access(path1);
const file2Exists = await fs.access(path2);
const file3Exists = await fs.access(path3);
// 이후: 배치 파일 작업
const fileChecks = await Promise.all([
fs.access(path1).then(() => true).catch(() => false),
fs.access(path2).then(() => true).catch(() => false),
fs.access(path3).then(() => true).catch(() => false)
]);
```
```javascript
// 이전: 메모리에 큰 객체들
const allData = await loadEntireDataset();
const processed = processLargeDataset(allData);
// 이후: 스트리밍/청크 처리
const processedData = await processDataInChunks(dataSource, chunkSize);
```
- [ ] 새로운 코드 중복 식별
- [ ] 증가하는 함수 복잡성 확인
- [ ] 오류 처리 패턴 검토
- [ ] 성능 지표 분석
- [ ] 상수와 구성 업데이트
- [ ] 주요 리팩토링 기회
- [ ] 의존성 정리 및 업데이트
- [ ] 성능 최적화 이니셔티브
- [ ] 문서 동기화
- [ ] 테스트 스위트 개선
```json
{
"rules": {
"max-lines-per-function": ["error", 50],
"max-params": ["error", 3],
"complexity": ["error", 10],
"no-duplicate-code": "error"
}
}
```
```bash
npm run lint
npm test
npm run check-duplication
npm run performance-check
```
1. **단일 책임**: 각 함수는 한 가지 일을 잘해야 함
2. **명확한 명명**: 함수와 변수 이름은 자체 문서화되어야 함
3. **일관된 패턴**: 코드베이스 전반에 걸쳐 동일한 패턴 사용
4. **최소 의존성**: 실제로 사용하는 것만 import
1. **일관된 형식**: 모든 곳에서 동일한 오류 반환 형식 사용
2. **구체적인 메시지**: 실행 가능한 오류 정보 제공
3. **우아한 성능 저하**: 시스템을 중단시키지 않고 오류 처리
4. **로깅 전략**: 디버깅을 위해 적절하게 오류 로깅
1. **먼저 측정**: 최적화하기 전에 프로파일링
2. **병목현상 최적화**: 가장 영향력 있는 개선에 집중
3. **배치 작업**: 가능할 때 유사한 작업을 결합
4. **결과 캐싱**: 중복 계산 피하기
1. **의도 문서화**: 무엇인지가 아니라 왜인지 설명
2. **버전 관리**: 원자적이고 잘 설명된 커밋 만들기
3. **테스트 커버리지**: 포괄적인 테스트 스위트 유지
4. **정기적인 리팩토링**: 기술 부채를 사전에 해결
- [Validator API 참조](VALIDATOR_API.ko.md)
- [아키텍처 가이드](ARCHITECTURE.ko.md)
- [기여 가이드라인](CONTRIBUTING.ko.md)
- [성능 가이드라인](PERFORMANCE_GUIDELINES.ko.md)