Skip to content
IRC-CodingIRC-Coding
God InterfaceInterface SegregationSOLID PrinciplesAnti-PatternArquitectura de SoftwareInterface

God Interfaces: Anti-Pattern e Interface Segregation

Evita God Interfaces con demasiadas responsabilidades. Aprende cómo Interface Segregation Principle y SOLID resuelven este problema.

S

schutzgeist

4 min read
God Interfaces: Anti-Pattern e Interface Segregation

God Interfaces: Anti-Pattern e Inversión de Control

Este artículo ofrece una explicación detallada del God Interface Anti-Pattern, incluyendo soluciones y buenas prácticas.

Resumen

Los God Interfaces son un patrón de diseño en desarrollo de software que proporciona una clase accesible para muchas otras clases y ofrece todas las funciones necesarias para invocar bibliotecas o frameworks.

Descripción técnica

Un God Interface es un anti-patrón donde una interfaz tiene demasiadas responsabilidades y métodos. Viola el Interface Segregation Principle (ISP) de los principios SOLID.

Problemas de los God Interfaces:

  • Demasiados métodos: La interfaz se vuelve confusa y difícil de comprender
  • Acoplamiento alto: Las implementaciones deben implementar métodos innecesarios
  • Mantenibilidad pobre: Los cambios afectan a muchas implementaciones
  • Violación de SRP: Una interfaz tiene múltiples razones para cambiar

Solución mediante Interface Segregation:

  • Interfaces pequeñas y enfocadas: Cada interfaz tiene una responsabilidad clara
  • Interfaces específicas por cliente: Las implementaciones solo necesitan implementar métodos relevantes
  • Mejor testabilidad: Las interfaces más pequeñas son más fáciles de simular
  • Acoplamiento reducido: Los cambios afectan solo a las implementaciones involucradas

Puntos clave para examen

  • God Interface: Interfaz con demasiadas responsabilidades
  • Interface Segregation Principle: Los clientes no deben verse obligados a implementar métodos que no usan
  • SOLID Principles: ISP es parte de los principios SOLID
  • Anti-Pattern: God Interface es un error de diseño frecuente
  • Mantenibilidad: Las interfaces pequeñas son más fáciles de mantener
  • Acoplamiento: Los God Interfaces aumentan innecesariamente el acoplamiento
  • Relevancia profesional: Importante para arquitectura y diseño de software

Componentes principales

  1. God Interface: Una interfaz con demasiados métodos/responsabilidades
  2. Interface Segregation: División en interfaces pequeñas y enfocadas
  3. SOLID Principles: Conjunto de principios de diseño
  4. Single Responsibility Principle: Cada clase debe tener una responsabilidad
  5. Dependency Inversion: Dependencia de abstracciones, no de concreciones
  6. Client-Specific Interfaces: Interfaces adaptadas a requisitos específicos
  7. Cohesion: Relación fuerte entre elementos de interfaz
  8. Coupling: Minimización de dependencias

Ejemplos prácticos

God Interface (Anti-Pattern)

// MALO: God Interface con demasiadas responsabilidades
interface UserService {
    // Gestión de usuarios
    User createUser(String username, String email);
    void deleteUser(Long userId);
    User updateUser(Long userId, User updates);
    User getUserById(Long userId);
    List<User> getAllUsers();
    
    // Autenticación
    boolean login(String username, String password);
    void logout(Long userId);
    boolean changePassword(Long userId, String oldPassword, String newPassword);
    
    // Permisos
    void grantPermission(Long userId, String permission);
    void revokePermission(Long userId, String permission);
    boolean hasPermission(Long userId, String permission);
    
    // Notificaciones
    void sendEmail(Long userId, String subject, String message);
    void sendSMS(Long userId, String message);
    
    // Logging
    void logUserAction(Long userId, String action);
    List<LogEntry> getUserLogs(Long userId);
}

Solución mediante Interface Segregation

// BIEN: Interfaces pequeñas y enfocadas

// Gestión de usuarios
interface UserRepository {
    User create(User user);
    void delete(Long userId);
    User update(Long userId, User updates);
    User findById(Long userId);
    List<User> findAll();
}

// Autenticación
interface AuthenticationService {
    boolean authenticate(String username, String password);
    void logout(Long userId);
    boolean changePassword(Long userId, String oldPassword, String newPassword);
}

// Permisos
interface AuthorizationService {
    void grant(Long userId, String permission);
    void revoke(Long userId, String permission);
    boolean hasPermission(Long userId, String permission);
}

// Notificaciones
interface NotificationService {
    void sendEmail(Long userId, String subject, String message);
    void sendSMS(Long userId, String message);
}

// Auditoría
interface AuditService {
    void logUserAction(Long userId, String action);
    List<LogEntry> getUserLogs(Long userId);
}

// La implementación solo necesita las interfaces relevantes
class UserServiceImpl implements UserRepository, AuthenticationService {
    private final UserRepository userRepo;
    private final PasswordEncoder passwordEncoder;
    
    // Solo implementar métodos relevantes
    @Override
    public User create(User user) {
        return userRepo.create(user);
    }
    
    @Override
    public boolean authenticate(String username, String password) {
        User user = userRepo.findByUsername(username);
        return user != null && passwordEncoder.matches(password, user.getPassword());
    }
    
    // ... otros métodos relevantes
}

Interfaces específicas por cliente

// Diferentes clientes necesitan diferentes funcionalidades

// Para panel de administración
interface AdminUserService {
    User createUser(String username, String email);
    void deleteUser(Long userId);
    List<User> getAllUsers();
}

// Para sistema de login
interface LoginService {
    boolean authenticate(String username, String password);
    void logout(Long userId);
}

// Para edición de perfil
interface ProfileService {
    User updateProfile(Long userId, ProfileUpdates updates);
    boolean changePassword(Long userId, String oldPassword, String newPassword);
}

// Cada implementación es enfocada y testeable
class AdminUserServiceImpl implements AdminUserService {
    private final UserRepository userRepository;
    private final AuditService auditService;
    
    @Override
    public User createUser(String username, String email) {
        User user = new User(username, email);
        User created = userRepository.create(user);
        auditService.logUserAction(created.getId(), "USER_CREATED");
        return created;
    }
}

Ventajas y desventajas

Ventajas de Interface Segregation

  • Mejor mantenibilidad: Las interfaces pequeñas son más fáciles de cambiar
  • Acoplamiento reducido: Las implementaciones solo dependen de interfaces relevantes
  • Mejor testabilidad: Las interfaces pequeñas son más fáciles de simular
  • Responsabilidades claras: Cada interfaz tiene un propósito definido
  • Flexibilidad: Diferentes implementaciones para diferentes requisitos

Desventajas de God Interfaces

  • Alta complejidad: Demasiados métodos hacen las interfaces confusas
  • Acoplamiento fuerte: Las implementaciones cargan dependencias innecesarias
  • Pobre testabilidad: Las interfaces grandes son difíciles de simular
  • Violaciones de SOLID: Incumple ISP y frecuentemente también SRP

Buenas prácticas

1. Directrices de diseño de interfaces

// BIEN: Interfaz con propósito claro
interface EmailValidator {
    boolean isValid(String email);
    String normalize(String email);
}

// MALO: Interfaz con múltiples propósitos
interface ValidationService {
    boolean isValidEmail(String email);
    boolean isValidPhone(String phone);
    boolean isValidAddress(Address address);
    String normalizeEmail(String email);
    String normalizePhone(String phone);
}

2. Interfaces basadas en roles

// Interfaces definidas por roles
interface Reader {
    String read();
}

interface Writer {
    void write(String content);
}

interface ReaderWriter extends Reader, Writer {
    // Combina ambos roles
}

3. Interfaces marcador

// Interfaces marcador para seguridad de tipos
interface Serializable { }
interface Cloneable { }
interface Remote { }

Preguntas frecuentes en exámenes

  1. ¿Qué es un God Interface y por qué es problemático? Un God Interface tiene demasiadas responsabilidades y métodos, lo que genera alto acoplamiento y pobre mantenibilidad.

  2. Explica el Interface Segregation Principle. Los clientes no deben verse obligados a implementar métodos que no usan. Las interfaces deben ser pequeñas y enfocadas.

  3. ¿Cómo se diferencia ISP de SRP? SRP se aplica a clases (una responsabilidad), ISP a interfaces (sin métodos innecesarios).

  4. ¿Cuándo son aceptables las interfaces grandes? Casi nunca. Si una interfaz crece demasiado, debe dividirse.

Fuentes principales

  1. https://de.wikipedia.org/wiki/Interface_Segregation_Principle
  2. https://refactoring.guru/design-patterns/interface-segregation
  3. https://www.baeldung.com/java-interface-segregation-principle
Volver al blog
Share:

Nächster Artikel in Arquitectura de Software

Weiterlesen
Reactive Programming: Observables, Subjects y Streams

Entradas relacionadas