Scegliere la classe giusta in fase di esecuzione

2

Questa è una domanda generale di progettazione del software. Il mio programma è scritto in Java, ma suppongo che la mia domanda si applichi a qualsiasi linguaggio di programmazione orientato agli oggetti. Il modo migliore per spiegare la mia situazione è con un esempio.

Nelle applicazioni come LibreOffice e MS Office, l'utente sceglie un'opzione di programma all'avvio del software. Ad esempio, in LibreOffice, devi scegliere Writer, Calc, Draw, Impress, ecc. Prima di poter iniziare a utilizzare il programma. In MS Office, è Word, Excel, PowerPoint, ecc.

Il mio programma è un po 'come quello. Ha una classe JFrame principale che imposta un JPanel sostituito come riquadro del contenuto all'avvio del programma. Finora, ci sono tre scelte di JPanel , e il programma sceglie tra loro con una semplice istruzione condizionale:

public MyJFrame(String editorType, int numPages) {
    ...

    if (editorType.equals("order-editor"))
        setContentPane(new OrderEditor(this));
    else if (editorType.equals("order-finder"))
        setContentPane(new OrderFinder(this));
    else if (editorType.equals("article-writer"))
        setContentPane(new ArticleWriter(this, numPages));

    ...
}

Quindi tutto è codificato nella classe JFrame . Quando sovrascrivo un altro JPanel , devo tornare alla classe JFrame per aggiungere un'altra clausola else if al costruttore. C'è un modo migliore per farlo? L'unico modo in cui posso immaginare di farlo a livello di codice sarebbe la compilazione del codice in fase di runtime e sembra che sia la strada sbagliata.

La stringa editorType è un argomento della riga di comando della funzione principale. Potrei passare un oggetto JPanel al costruttore, ma dovrei comunque controllare gli argomenti su main prima di scegliere la classe appropriata. Sto iniziando a pensare che non c'è altro modo per farlo, ma lascerò questa domanda per ogni evenienza.

Ecco un esempio della mia funzione main :

public static void main(String[] args) {

    // calls private static String getEditorType(String[] args)
    // to parse the program input

    String editorType = getEditorType(args);
    if (editorType == null) {
        System.out.println("Invalid editor type.");
        System.exit(1);
    }

    int[] numPages = {-1};
    if (editorType.equals("article-writer"))

        // calls a similar static function to parse input
        numPages[0] = getNumPages(args);

    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                JFrame frame = new MyJFrame(editorType, numPages[0]);
                frame.pack();
                frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });

}
    
posta chris 20.08.2016 - 15:35
fonte

1 risposta

0

Per prima cosa, elimina quel numPages . OrderEditor , OrderFinder e ArticleWriter dovrebbero implementare l'interfaccia comune, che consente loro di analizzare i propri argomenti. Questo è così che se gli argomenti di uno di questi cambiano, non è necessario modificare l'intera logica di inizializzazione.

La seconda cosa da fare è creare un dizionario dove key è editorType e value è una funzione che crea l'istanza o l'interfaccia che consente la creazione dell'istanza.

In realtà opterei per l'interfaccia, perché in questo caso è possibile spostare l'analisi degli argomenti in esso.

    
risposta data 20.08.2016 - 18:11
fonte

Leggi altre domande sui tag