Ajuda e dicas para SOLID

Fiz algumas modificações no meu projeto. Introduzi a classe ScenesLoader após a criação da classe Scene, que exigia do programador a definição de estilos para cada cena criada. Até aqui, tudo bem; no entanto, estou enfrentando um problema: a classe ScenesLoader não está carregando apenas minhas cenas, mas também minhas views e estilos. Pensei em abordar isso por meio de parâmetros, já que criei uma classe para carregar as views e estilos anteriormente. Contudo, ainda estou indeciso, pois parece que seria estranho delegar a responsabilidade de instanciar esses elementos para dentro delas. Minhas views e styles têm classes próprias para carregar, mas mesmo passando-as como parâmetros, estaria instanciando as classes ViewLoader e StylesLoader dentro da classe ScenesLoader, o que me parece errado. GitHub - Dione783/Javafx_Chat: Projeto em javafx para meu curso técnico

Olhando por cima aqui, eu mudaria um pouco a classe SceneLoader.

  • Não vejo muito sentido em ter propriedades private e static nesse seu caso. Se a ideia é ter apenas uma única instância de SceneLoader (que é o que faz sentido pra mim), então propriedades como static não agrega muito.
  • Talvez seja uma boa inicializar StyleLoader e ViewLoader no construtor e usá-los para inicializar todas as scenes pelo método loadScenes() msm que depende desses 2 caras.
  • Uma sugestão (talvez não seja a melhor) é usar um Map para armazenar suas scenes e manter os nomes de cada scene como constantes. Assim, no método loadNextScene vc apenas recuperaria desse map a scene recebida como string via parâmetro.

É só uma sugestão e bem provável que pode ser melhorado ou ter algo equivocado:

public class ScenesLoader {
    
    private static Map<String, Scene> SCENES = new HashMap<>();

    public static String LOGIN = "login":
    public static String REGISTER = "register":
    public static String ROOM = "room":
    
    private final Stage stage;
    private final ViewLoader views;
    private final StyleLoader styles;
    
    public ScenesLoader() {
        stage = new Stage();
        views = new ViewLoader();
        styles = new StyleLoader();
        initScenes();
        initStage();
    }

    private void initScenes(){
        SCENES.put(LOGIN, new Scene(views.getLogin(),styles.getLoginCss()));
        SCENES.put(REGISTER, new Scene(views.getRegister(),styles.getRegisterCss()));
        SCENES.put(ROOM, new Scene(views.getRoom(),styles.getRoomCss()));
    }

    private void initStage() {
        stage.setTitle("Chat Application");
        loadScene(LOGIN);
        stage.show();
    }
    
    public void loadScene(String sceneName) {
        Scene scene = SCENES.get(sceneName)

        if (scene == null) {
            throw new IllegalArgumentException("Scene " + sceneName + " não encontrada.")
        }

        stage.setScene(scene.getScene());
    }
}
1 curtida

Valeu, gostei da ideia de utilizar o método map . Não costumo usar muito isso, e realmente, em relação aos métodos private e static , faz todo sentido. Tentei evitar a instanciação desnecessária de uma classe, mas acabei fazendo ambos os erros, o que foi uma falha da minha parte. Foi meio burro da minha parte, mas agora entendi melhor. Obrigado pela dica!