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();
}
}
});
}