Hallo,
also es geht hier nicht darum, dass ich etwas konkretes über Java wissen will etc.
Es ist nur so, dass ich schon seit Tagen unzufrieden bin mit einem gewissen Teil meines
Programms. Es geht hier lediglich um das Design, nicht die Funktionalität etc.
Ich weiss nicht so recht, wie ich die Abhängigkeiten am besten löse, oder ob ich nun
für das und das ne eigene Klasse machen soll oder nicht, etc...
Alles in allem empfinde ich diesen Teil meines Programms als "hässlich", d.h. der code ist
nicht besonders intuitiv, und...ja kA wie ich sagen soll, ich will auf jeden fall ein Refactoring,
hab jetzt es mal so gemacht, mal so, und nie war ich so richtig zufrieden...
Natürlich gibt's jetzt Code, weil es geht ja konkret darum, wie ich es coden soll.
Wer also Lust hat und mehr Erfahrung in Java (generell OO-Programmierung) als ich hat,
und das sollte keinem schwer fallen (zumindest letzteres), der kann sich ja bitte
den folgenden Code bzw. Klassen ankucken, und mir Ratschläge geben wie ich das ganze
vllt besser aufziehen könnte, also so Dinge wie:
Welche Methode ist vllt überflüssig und sollte direkt im Konstruktor gemacht werden, oder andersrum,
welche Instanzvariablen sind unsinnig, und vorallem die Frage ob diese Klassen so Sinn machen,
oder man das weiter trennen oder zusammenziehen sollte, etc etc. Design halt
Ich würde mich sehr darüber freuen, hier ein paar gute Ratschläge zu diesem Thema an meinem
praktischen Beispiel einsammeln zu können
Bevor ich euch die 3 Klassen jetzt hinklatsch, um die es geht, schildere ich kurz den Sinn des Programms,
um euch Zeit zu sparen: Man hat ein Fenster, das ist die Klasse Console. Es wird im Programm genutzt
um ein ListModel grafisch darzustellen. Das ist quasi auch das, was "von aussen" hier reinkommt
(wird der Console übergeben, hier ist also quasi der "Start" dieses Teilprogramms), und dieses
ListModel wird hier nicht vorgestellt, weil es darum nicht geht. Zurück zur Darstellung: In meinem Fall wird
dieses ListModel als JList angezeigt und in ein JScrollPane gepackt, damit man das halt eben scrollen kann.
Abgesehen von dieser scrollbaren Liste gibts im Fenster nur noch paar kleine Labels und eine Checkbox,
mit denen man ein paar Dinge einstellen kann bzw. die bestimmte Infos anzeigen.
Nochmal: Es geht um die Frage: Wie abstrahiere ich hier richtig? Natürlich kann ich alles in eine einzige Klasse
hauen und hätte dort direkten Zugriff auf alles. Wäre das aber so gut? Kann ich es nicht in mehrere Klassen
trennen, sodass es übersichtlicher wird? Das habe ich ja jetzt getan, aber ich finde es liest sich eben
unintuitiv, nicht so klar halt....
Okay here we go:
(Eine Sache noch: die Klassen sind nur insofern inhaltlich unvollständig, als dass ich für die Komponenten
wie eben ScrollPane, Labels etc keine Grösse oder sonst was festgelegt hab. Aber das ist hier ja nich wichtig, nur
dass ihr euch nicht wundert
)
Also, das ganze kann man doch verbessern, sodass andere jetzt zB sich leichter "reinlesen" können und man
einfach mehr Überblick hat, ohne dass man alles unnötig verklompiziert und irgendwelche Dinge x-fach über
Konstruktoren weitergeben muss etc etc.
Aber wie ???:L
DANKE schonmal :toll: :toll: :toll:
also es geht hier nicht darum, dass ich etwas konkretes über Java wissen will etc.
Es ist nur so, dass ich schon seit Tagen unzufrieden bin mit einem gewissen Teil meines
Programms. Es geht hier lediglich um das Design, nicht die Funktionalität etc.
Ich weiss nicht so recht, wie ich die Abhängigkeiten am besten löse, oder ob ich nun
für das und das ne eigene Klasse machen soll oder nicht, etc...
Alles in allem empfinde ich diesen Teil meines Programms als "hässlich", d.h. der code ist
nicht besonders intuitiv, und...ja kA wie ich sagen soll, ich will auf jeden fall ein Refactoring,
hab jetzt es mal so gemacht, mal so, und nie war ich so richtig zufrieden...
Natürlich gibt's jetzt Code, weil es geht ja konkret darum, wie ich es coden soll.
Wer also Lust hat und mehr Erfahrung in Java (generell OO-Programmierung) als ich hat,
und das sollte keinem schwer fallen (zumindest letzteres), der kann sich ja bitte
den folgenden Code bzw. Klassen ankucken, und mir Ratschläge geben wie ich das ganze
vllt besser aufziehen könnte, also so Dinge wie:
Welche Methode ist vllt überflüssig und sollte direkt im Konstruktor gemacht werden, oder andersrum,
welche Instanzvariablen sind unsinnig, und vorallem die Frage ob diese Klassen so Sinn machen,
oder man das weiter trennen oder zusammenziehen sollte, etc etc. Design halt
Ich würde mich sehr darüber freuen, hier ein paar gute Ratschläge zu diesem Thema an meinem
praktischen Beispiel einsammeln zu können
Bevor ich euch die 3 Klassen jetzt hinklatsch, um die es geht, schildere ich kurz den Sinn des Programms,
um euch Zeit zu sparen: Man hat ein Fenster, das ist die Klasse Console. Es wird im Programm genutzt
um ein ListModel grafisch darzustellen. Das ist quasi auch das, was "von aussen" hier reinkommt
(wird der Console übergeben, hier ist also quasi der "Start" dieses Teilprogramms), und dieses
ListModel wird hier nicht vorgestellt, weil es darum nicht geht. Zurück zur Darstellung: In meinem Fall wird
dieses ListModel als JList angezeigt und in ein JScrollPane gepackt, damit man das halt eben scrollen kann.
Abgesehen von dieser scrollbaren Liste gibts im Fenster nur noch paar kleine Labels und eine Checkbox,
mit denen man ein paar Dinge einstellen kann bzw. die bestimmte Infos anzeigen.
Nochmal: Es geht um die Frage: Wie abstrahiere ich hier richtig? Natürlich kann ich alles in eine einzige Klasse
hauen und hätte dort direkten Zugriff auf alles. Wäre das aber so gut? Kann ich es nicht in mehrere Klassen
trennen, sodass es übersichtlicher wird? Das habe ich ja jetzt getan, aber ich finde es liest sich eben
unintuitiv, nicht so klar halt....
Okay here we go:
(Eine Sache noch: die Klassen sind nur insofern inhaltlich unvollständig, als dass ich für die Komponenten
wie eben ScrollPane, Labels etc keine Grösse oder sonst was festgelegt hab. Aber das ist hier ja nich wichtig, nur
dass ihr euch nicht wundert
Code:
public class Console extends JFrame {
private ConsoleScrollList sList;
private ConsolePanel panel;
public Console(ListModel listmodel) {
setWindowProperties();
panel = new ConsolePanel();
sList = new ConsoleScrollList(listmodel, panel);
getContentPane().add(sList, BorderLayout.NORTH);
getContentPane().add(panel, BorderLayout.SOUTH);
pack();
setLocationOverTray();
}
private void setWindowProperties() {
setTitle("LogConsole");
setAlwaysOnTop(true);
setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
setLayout(new BorderLayout());
}
private void setLocationOverTray() {
int width, height;
Rectangle visibleDesktop = GraphicsEnvironment
.getLocalGraphicsEnvironment().getMaximumWindowBounds();
width = (int) visibleDesktop.getWidth();
height = (int) visibleDesktop.getHeight();
Dimension window = getPreferredSize();
this.setLocation(width - window.width, height - window.height);
}
}
Code:
public class ConsolePanel extends JPanel{
private JCheckBox auto;
private JLabel time,caller;
public ConsolePanel() {
setBackground(Color.green);
auto = new JCheckBox();
auto.setSelected(true);
time = new JLabel("time");
caller = new JLabel("caller");
}
public boolean isAutoEnabled() {
return auto.isSelected();
}
public void setTimeText(String text) {
time.setText(text);
}
public void setCallerText(String text) {
caller.setText(text);
}
}
Code:
public class ConsoleScrollList extends JScrollPane implements MouseListener,
ComponentListener {
private JList list;
private ListModel model;
private ConsolePanel cPanel;
public ConsoleScrollList(ListModel model, ConsolePanel cPanel) {
this.model = model;
this.cPanel = cPanel;
setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
createList();
this.setViewportView(list);
}
private void createList() {
list = new JList();
list.setModel(model);
list.setFont(new Font("Arial", Font.PLAIN, 10));
list.setBackground(new Color(180, 180, 180));
list.setForeground(Color.black);
list.setSelectionBackground(Color.red);
list.setSelectionForeground(Color.white);
list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
list.addMouseListener(this);
list.addComponentListener(this);
}
@Override
public void mouseClicked(MouseEvent e) {
int index = list.locationToIndex(new Point(e.getX(), e.getY()));
cPanel.setTimeText(model.getTimeFrom(index));
cPanel.setCallerText(model.getCallerOf(index));
}
@Override
public void componentResized(ComponentEvent e) {
if (cPanel.isAutoEnabled()) {
JScrollBar ver = this.getVerticalScrollBar();
JScrollBar hor = this.getHorizontalScrollBar();
ver.setValue(ver.getMaximum());
hor.setValue(hor.getMinimum());
}
}
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
public void mousePressed(MouseEvent e) {
}
public void mouseReleased(MouseEvent e) {
}
public void componentHidden(ComponentEvent e) {
}
public void componentMoved(ComponentEvent e) {
}
public void componentShown(ComponentEvent e) {
}
}
Also, das ganze kann man doch verbessern, sodass andere jetzt zB sich leichter "reinlesen" können und man
einfach mehr Überblick hat, ohne dass man alles unnötig verklompiziert und irgendwelche Dinge x-fach über
Konstruktoren weitergeben muss etc etc.
Aber wie ???:L
DANKE schonmal :toll: :toll: :toll: