Class_generator/docs/architecture.md
StillHammer 325b97060c Add LEDU Chinese course content and documentation
Add comprehensive Chinese reading course (乐读) with 4 chapters of vocabulary, texts, and exercises. Include architecture documentation for module development and progress tracking system.

Content:
- LEDU book metadata with 12 chapter outline
- Chapter 1: Food culture (民以食为天) - 45+ vocabulary, etiquette
- Chapter 2: Shopping (货比三家) - comparative shopping vocabulary
- Chapter 3: Sports & fitness (生命在于运动) - exercise habits
- Chapter 4: Additional vocabulary and grammar

Documentation:
- Architecture principles and patterns
- Module creation guide (Game, DRS, Progress)
- Interface system (C++ style contracts)
- Progress tracking and prerequisites

Game Enhancements:
- MarioEducational helper classes (Physics, Renderer, Sound, Enemies)
- VocabularyModule TTS improvements
- Updated CLAUDE.md with project status

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-15 07:25:53 +08:00

260 lines
6.4 KiB
Markdown

# Architecture Guide
## 🏗️ Core Principles
### 1. Single Responsibility
Each module has exactly one purpose. No mixing of concerns.
### 2. Event-Driven Communication
All inter-module communication happens through EventBus. Zero direct dependencies.
```javascript
// ❌ BAD - Direct access
const gameManager = window.app.modules.gameManager;
gameManager.startGame();
// ✅ GOOD - EventBus
eventBus.emit('game:start', { difficulty: 'medium' });
```
### 3. Sealed Modules
Modules cannot be modified after creation using `Object.seal()`.
```javascript
constructor() {
super('ModuleName');
this._privateState = {};
Object.seal(this); // Prevents adding/removing properties
}
```
### 4. WeakMap Private State
Internal data is completely inaccessible from outside.
```javascript
const privateData = new WeakMap();
class SecureModule {
constructor() {
privateData.set(this, {
apiKey: 'secret',
internalState: {}
});
}
getPrivateData() {
return privateData.get(this);
}
}
```
### 5. Dependency Injection
No globals. Everything injected through constructor.
```javascript
class GameModule extends Module {
constructor(name, dependencies, config) {
super(name, ['eventBus', 'renderer']);
// Dependencies injected, not accessed globally
this._eventBus = dependencies.eventBus;
this._renderer = dependencies.renderer;
this._config = config;
}
}
```
## 🔄 Module Lifecycle
```
1. REGISTRATION → Application.js modules array
2. LOADING → ModuleLoader imports class
3. INSTANTIATION → new Module(name, deps, config)
4. INITIALIZATION → module.init() called
5. READY → Module emits 'ready' event
6. DESTRUCTION → module.destroy() on cleanup
```
## 📦 System Components
### Core Layer (`src/core/`)
**Module.js** - Abstract base class
- WeakMap private state
- Lifecycle management (init/destroy)
- State validation
- Abstract enforcement
**EventBus.js** - Event communication
- Module registration required
- Event history tracking
- Cross-module isolation
- Memory leak prevention
**ModuleLoader.js** - Dependency injection
- Topological sort for dependencies
- Circular dependency detection
- Proper initialization order
- Dynamic import system
**Router.js** - Navigation system
- Route guards
- Middleware execution
- State management
- History integration
**Application.js** - Bootstrap system
- Auto-initialization
- Module registration
- Lifecycle coordination
- Debug panel
### DRS Layer (`src/DRS/`)
**Exercise Modules** (`exercise-modules/`)
- VocabularyModule - Flashcard spaced repetition
- TextAnalysisModule - AI text comprehension
- GrammarAnalysisModule - AI grammar correction
- TranslationModule - AI translation validation
- OpenResponseModule - Free-form AI evaluation
**Services** (`services/`)
- IAEngine - Multi-provider AI system
- LLMValidator - Answer validation
- ContentLoader - Content generation
- ProgressTracker - Progress management
- PrerequisiteEngine - Prerequisite checking
**Interfaces** (`interfaces/`)
- StrictInterface - Base enforcement class
- ProgressItemInterface - Progress tracking contract
- ProgressSystemInterface - Progress system contract
- DRSExerciseInterface - Exercise module contract
### Games Layer (`src/games/`)
Independent game modules for entertainment (NOT part of DRS).
- FlashcardLearning.js - Standalone flashcard game
- Future games...
## 🚫 Separation Rules
### DRS vs Games - NEVER MIX
**DRS** = Educational exercises with strict interfaces
**Games** = Entertainment with different architecture
```javascript
// ❌ FORBIDDEN - DRS importing games
import FlashcardLearning from '../games/FlashcardLearning.js';
// ✅ CORRECT - DRS uses its own modules
import VocabularyModule from './exercise-modules/VocabularyModule.js';
```
## 🔒 Security Layers
1. **Object.seal()** - Prevents property addition/deletion
2. **Object.freeze()** - Prevents prototype modification
3. **WeakMap** - Internal state hidden
4. **Abstract enforcement** - Missing methods throw errors
5. **Validation at boundaries** - All inputs validated
## 📊 Data Flow
```
User Action
UI Component
Event Emission (EventBus)
Module Event Handler
Business Logic
State Update
Event Emission (state changed)
UI Update
```
## 🎯 Module Types
### 1. Core Modules
System-level functionality. Never modify these.
### 2. Game Modules
Entertainment-focused, extend Module base class.
### 3. DRS Exercise Modules
Educational exercises, implement DRSExerciseInterface.
### 4. Service Modules
Support functionality (AI, progress, content).
### 5. UI Components
Reusable interface elements (future phase).
## ⚡ Performance Targets
- **<100ms** module loading time
- **<50ms** event propagation time
- **<200ms** application startup time
- **Zero** memory leaks in module lifecycle
## 🧪 Testing Strategy
1. **Unit Tests** - Individual module behavior
2. **Integration Tests** - Module communication via EventBus
3. **Interface Tests** - Contract compliance (ImplementationValidator)
4. **E2E Tests** - Complete user flows
## 📋 Architecture Checklist
For every new feature:
- [ ] Single responsibility maintained
- [ ] EventBus for all communication
- [ ] No direct module dependencies
- [ ] Proper dependency injection
- [ ] Object.seal() applied
- [ ] Abstract methods implemented
- [ ] Lifecycle methods complete
- [ ] Memory cleanup in destroy()
- [ ] Interface compliance validated
- [ ] No global variables used
## 🔍 Debug Tools
```javascript
// Application status
window.app.getStatus()
// Module inspection
window.app.getCore().moduleLoader.getStatus()
// Event history
window.app.getCore().eventBus.getEventHistory()
// Navigate programmatically
window.app.getCore().router.navigate('/path')
```
## 🚨 Common Violations
1. **Direct module access** Use EventBus
2. **Global variables** Use dependency injection
3. **Mixed responsibilities** Split into separate modules
4. **No cleanup** Implement destroy() properly
5. **Hardcoded dependencies** Declare in constructor
6. **Missing validation** Validate all inputs
7. **Modifying core** Extend, don't modify
## 📖 Further Reading
- `docs/creating-new-module.md` - Module creation guide
- `docs/interfaces.md` - Interface system details
- `docs/progress-system.md` - Progress tracking guide
- `README.md` - Project overview