Recentemente ho scoperto i principi SOLID e sto cercando di imparare come applicarli correttamente. Ho un'applicazione con un'interfaccia enorme:
public interface NotificationService {
public void sendNewProjectRequestNotificationToDesigners(String projectId);
public void sendNewProjectAcceptedNotificationToCustomer(String projectId);
public void sendNewProjectRejectedNotificationToCustomer(String projectId);
...
// and aboud 30 more methods like that
// specifying the type of notification and who is going to be sent to
}
Questo chiaramente viola:
- SRP: tanti tipi diversi di notifiche
- OCP: ogni nuova notifica ho appena modificato la classe
- ISP: in ogni singola classe che inietta un NotificationService, vorrà solo 1 di tutti i metodi.
- DIP: i client di questa classe devono essere consapevoli del metodo esatto da utilizzare.
quindi ho iniziato il mio refactoring e mi sono inventato:
public interface NotificationSender {
public void sendNotification(String projectId);
}
public class NewProjectRequestNotificationSender implements NotificationSender {
public void sendNotification(String projectId) {
...
}
}
// and many other classes, one for each method in the original interface
Ora per applicare Dependency Injection, ho dichiarato ogni classe che implementa NotificationSender come @Bean con un nome di qualificatore.
E le classi che richiedono un mittente di notifica specifico, la dipendenza viene iniettata con @Qualifier.
Domanda 1: Dovendo usare @Qualifier nei clases che richiedono un NotificationSender specifico, quindi questi clases sono ancora costretti a conoscere dettagli come il nome del qualificatore del dato NotificationSender, sto ancora violando il principio di inversione della dipendenza?
Domanda 2: Esiste un approccio migliore?