Single Responsibility Principle
// Bad Example
class UserService {
saveUser(user: User) {
// Save user to database
this.database.save(user);
// Send welcome email
this.emailService.sendWelcomeEmail(user);
// Log activity
this.logger.log(`User ${user.id} created`);
}
}
// Good Example
class UserRepository {
saveUser(user: User) {
return this.database.save(user);
}
}
class EmailService {
sendWelcomeEmail(user: User) {
// Send welcome email
}
}
class UserService {
constructor(
private userRepository: UserRepository,
private emailService: EmailService,
private logger: Logger
) {}
async createUser(user: User) {
await this.userRepository.saveUser(user);
await this.emailService.sendWelcomeEmail(user);
this.logger.log(`User ${user.id} created`);
}
}
Open/Closed Principle
// Open for extension, closed for modification
interface Shape {
calculateArea(): number;
}
class Rectangle implements Shape {
constructor(
private width: number,
private height: number
) {}
calculateArea(): number {
return this.width * this.height;
}
}
class Circle implements Shape {
constructor(private radius: number) {}
calculateArea(): number {
return Math.PI * this.radius * this.radius;
}
}
class AreaCalculator {
calculateTotalArea(shapes: Shape[]): number {
return shapes.reduce((sum, shape) =>
sum + shape.calculateArea(), 0);
}
}