В програмній інженерії шаблони проектування (design patterns) пропонують перевірені рішення для поширених проблем, з якими стикаються розробники програмного забезпечення. Ефективне використання цих шаблонів може призвести до створення надійного, підтримуваного та масштабованого коду. У цій статті ми розглянемо, як побудувати конвеєр обробки файлів за допомогою TypeScript, використовуючи деякі ключові шаблони проектування.
Вступ
Обробка файлів є звичайним завданням у програмних додатках, незалежно від того, чи йдеться про зчитування конфігурацій, обробку файлів даних чи генерацію звітів. Добре спроектований конвеєр обробки файлів може значно спростити ці завдання. Тут ми побудуємо конвеєр обробки файлів за допомогою шаблонів проектування Strategy, Decorator та Factory Method у TypeScript.
Шаблон Strategy
Шаблон Strategy дозволяє визначити сімейство алгоритмів, інкапсулювати кожен з них і зробити їх взаємозамінними.
```typescript
interface FileProcessor {
process(file: string): void;
}
class TextFileProcessor implements FileProcessor {
process(file: string): void {
console.log(Обробка текстового файлу: ${file}
);
}
}
class CsvFileProcessor implements FileProcessor {
process(file: string): void {
console.log(Обробка CSV файлу: ${file}
);
}
}
class FileProcessingContext {
private strategy: FileProcessor;
constructor(strategy: FileProcessor) {
this.strategy = strategy;
}
setStrategy(strategy: FileProcessor) {
this.strategy = strategy;
}
executeStrategy(file: string) {
this.strategy.process(file);
}
}
Цей шаблон корисний для вибору різних способів обробки файлів під час виконання програми.
Реалізація
Спочатку визначимо інтерфейс для стратегії:
interface FileProcessor {
process(file: string): string;
}
Далі створимо конкретні стратегії:
class JSONProcessor implements FileProcessor {
process(file: string): string {
// логіка обробки JSON файлу
return `Оброблений JSON: ${file}`;
}
}
class CSVProcessor implements FileProcessor {
process(file: string): string {
// логіка обробки CSV файлу
return `Оброблений CSV: ${file}`;
}
}
Потім створимо клас контексту для використання цих стратегій:
class FileProcessingContext {
private processor: FileProcessor;
setProcessor(processor: FileProcessor) {
this.processor = processor;
}
execute(file: string): string {
return this.processor.process(file);
}
}
Шаблон Decorator
Шаблон Decorator дозволяє динамічно додавати поведінку до об'єктів.
Цей шаблон особливо корисний для покращення обробки файлів додатковими можливостями, такими як логування та валідація.
Реалізація
Створимо базовий клас декоратора:
class FileProcessorDecorator implements FileProcessor {
protected wrappee: FileProcessor;
constructor(processor: FileProcessor) {
this.wrappee = processor;
}
process(file: string): string {
return this.wrappee.process(file);
}
}
Далі створимо конкретні декоратори:
class LoggingProcessor extends FileProcessorDecorator {
process(file: string): string {
console.log(`Обробка файлу: ${file}`);
return super.process(file);
}
}
class ValidationProcessor extends FileProcessorDecorator {
process(file: string): string {
// Валідація файлу
console.log(`Валідація файлу: ${file}`);
return super.process(file);
}
}
Шаблон Factory Method
Шаблон Factory Method надає інтерфейс для створення об'єктів, але дозволяє підкласам змінювати тип об'єктів, які будуть створені.
Цей шаблон корисний для створення процесорів на основі типу файлу.
Реалізація
Визначимо наш метод фабрики:
class ProcessorFactory {
static getProcessor(fileType: string): FileProcessor {
if (fileType === 'json') {
return new JSONProcessor();
} else if (fileType === 'csv') {
return new CSVProcessor();
} else {
throw new Error('Невідомий тип файлу');
}
}
}
Побудова конвеєра
Тепер об'єднаємо все разом, щоб створити наш конвеєр обробки файлів:
const file = 'data.json';
const fileType = 'json';
const processor = ProcessorFactory.getProcessor(fileType);
const context = new FileProcessingContext();
context.setProcessor(processor);
const decoratedProcessor = new LoggingProcessor(new ValidationProcessor(context));
const result = decoratedProcessor.process(file);
console.log(result);
Висновок
Використовуючи ці шаблони проектування, ми створили гнучкий та розширюваний конвеєр обробки файлів на TypeScript.
Шаблон Strategy дозволяє вибирати різні стратегії обробки під час виконання програми, шаблон Decorator дає змогу динамічно додавати функціональність, а шаблон Factory Method допомагає створювати процесори на основі типів файлів. Ці шаблони не лише роблять наш код більш модульним і багаторазовим, але й значно полегшують його підтримку та масштабування.
Перекладено з: Design Patterns in Action: Building a File Processing Pipeline with TypeScript