Olá, @PedroAppel! Obrigado pela sua resposta.
No momento em que você me respondeu, eu já tinha me desafiado a tentar entender melhor alguns princípios SOLID e a de tentar deixar esse código mais limpo na marra, mesmo sem ter lido o livro. Inclusive, foi até uma afirmação meio estúpida de minha parte, pois não é obrigatório ler o livro para aplicar e aprender os princípios de desenvolvimento de código limpo.
Como essa etapa do projeto ainda é beeem simples, eu pesquisei e cheguei na mesma observação que você pontuou sobre os métodos estáticos e sobre a violação do SRP na UserInterface. Então, me propus a modularizar e segregar todas as atividades que ela estava sendo responsável por fazer em diferentes classes, cada uma com uma única responsabilidade. Meu resultado final ficou assim:
`package br.com.floresdev.screenmatch.application;
import ...;
public class UserInterface {
private final UserInteraction userInteraction;
private final SeriesService seriesService;
private final SeasonService seasonService;
private final EpisodeService episodeService;
private final DisplayService displayService;
public UserInterface(UserInteraction userInteraction, SeriesService seriesService,
SeasonService seasonService, EpisodeService episodeService, DisplayService displayService) {
this.userInteraction = userInteraction;
this.seriesService = seriesService;
this.seasonService = seasonService;
this.displayService = displayService;
this.episodeService = episodeService;
}
public void start() {
displayService.showMenu();
String seriesName = userInteraction.getSeriesName();
SeriesDataModel series = seriesService.getSeriesByName(seriesName);
String fullAddress = seriesService.getFullAddress(seriesName);
int chosenOption = userInteraction.getChosenOption();
switch (chosenOption) {
case 1:
List<SeasonDataModel> seasons = seasonService.getSeasons(series, fullAddress);
displayService.showSeasons(seasons);
break;
case 2:
int seasonNumber = userInteraction.getSeasonNumber();
List<EpisodeModel> episodes = episodeService.getEpisodesNames(seasonNumber, fullAddress);
displayService.showEpisodesNames(episodes);
break;
case 3:
displayService.showTopFiveEpisodes(episodeService.getTopFiveEpisodes(seasonService.getSeasons(series,
fullAddress)));
break;
case 4:
displayService.showEpisodesFromYear(episodeService.getEpisodesFromEpisodesData(
seasonService.getSeasons(series, fullAddress)), userInteraction.getSearchYear());
break;
case 5:
displayService.showEpisodeByTitle(
episodeService.getEpisodeByTitle(
episodeService.getEpisodesFromEpisodesData(seasonService.getSeasons(series, fullAddress)),
userInteraction.getEpisodeTitle())
);
break;
case 6:
displayService.showRatingsPerSeason(episodeService.getRatingsPerSeason(
episodeService.getEpisodesFromEpisodesData(seasonService.getSeasons(series, fullAddress))
));
break;
case 7:
displayService.showStats(episodeService.getStats(
episodeService.getEpisodesFromEpisodesData(
seasonService.getSeasons(series, fullAddress)
))
);
break;
default:
System.out.println("Invalid chosen option! Please, follow the correct pattern of choice and " +
"try again.");
start();
}
}
public UserInteraction getUserInteraction() {
return userInteraction;
}
}`
Conclusão
Depois de "aplicar na marra", eu sei que pelo menos o SRP entrou na minha cabeça, e foi um desafio muito gratificante ver minha aplicação final melhor estruturada com o fruto do meu esforço. Estou terminando o primeiro curso dessa formação nesse momento e sei que estou "pulando etapas", já que na sequência de formações de desenvolvimento Java existe uma específica que foca nessa parte de boas práticas etc., mas sei que valeu a pena.
De novo, obrigado pelo comentário, e se você quiser dar uma olhada nas classes que criei pra "ajudar" a UserInterface a ter a única função de controlar o fluxo de execução do programa, pode olhar aqui: ScreenMatch Without Web.