Best Practice Klassendesign / Code Conventions

kaoZ

Top Contributor
Kleine Frage am Rande , wie würdet ihr diese Klasse für eine JToolBar erstellen sprich zwecks Magic Strings / Number, Konstanten, Deklarationen und Definitionen , hier mal mein Ansatz :

Java:
package de.kaoz.components;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.ActionListener;

import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JToolBar;

public class SimpleToolBar extends JToolBar{
	private static final long serialVersionUID = 1L;
	
	final static Dimension FILLER = new Dimension(30, 0);
	final static String IMG_PATH = "img/";
	
	JButton saveBtn, searchBtn, fileBtn, clientBtn;
	JButton[] btns = {saveBtn, searchBtn, fileBtn, clientBtn};
	
	{
		saveBtn		 = new JButton("", new ImageIcon(IMG_PATH + "save.png"));
		searchBtn	 = new JButton("", new ImageIcon(IMG_PATH + "search.png"));
		fileBtn		 = new JButton("", new ImageIcon(IMG_PATH + "file.png"));
		clientBtn	 = new JButton("", new ImageIcon(IMG_PATH + "client.png"));
	}
	
	public SimpleToolBar() {
		setFloatable(false);
		setBorder(BorderFactory.createMatteBorder(1, 0, 0, 0, Color.lightGray));
		setPreferredSize(new Dimension(0,45));
		addElements();
	}
	
	private void addElements(){
		addSeparator();
		add(fileBtn);
		add(saveBtn);
		add(searchBtn);
		add(clientBtn);
		
	}
	
	public void setListener(ActionListener listener){
		for (JButton btn : btns) {
			btn.addActionListener(listener);
		}
	}
}

über Vorschläge oder Tipps wäre ich dankbar ;)

So siehts im moment aus :



Ziel ist das ich dies nachher als Bestandteil der GUI über einen Controller ansteuern kann, reicht es dazu die Listener in einer Schleife zu setzen, und wer liefert letztdendlich die Funktionalität der Listener, das Model oder ?
 
Zuletzt bearbeitet:

gescom

Mitglied
Meiner Meinung nach, wäre es bei fünf Buttons einfacher für jeden Button eine eigene Methode zu schreiben, welche die Listener hinzufügt . Im Controller meldest du dann die Listener events an und rufst beim Action event die gewünschte Model-Methode auf.
Sonst müsstest du eine Art Action ID erstellen und sie im Controller erfragen. Wie das ganz genau geht weiß ich leider nicht auf Anhieb :)
 

kaoZ

Top Contributor
Ich könnte ich das ganze per
Code:
.setActionCommand(String value)
; lösen.

und jedem Button ein ActionCommand zuweisen.

Ich realisiere den Listener der für die Toolbar zuständig sein soll, in einer Separaten Klasse, die Frage ist jetzt , um die Events zu behandeln die von den Buttons der Toolbar abgefeuert werden , müsste ich um dementsprechend auszuführende Aktionen durchführen zu können (OMG dieser Satz o0) in der Listener Klasse ja wiederrum eine Referenz auf den Controller halten , welcher ja letztendlich an die Methoden der View delegiert.


Ich hoffe das war halbwegs verständlich :lol:
 
Zuletzt bearbeitet:

gescom

Mitglied
Ich dachte an ungefähr so etwas:

Java:
                public Controler(){
		this.view = new View();
		this.model = new MidiModel();
		this.view.setListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				if(e.getActionCommand() == "saveBtn"){
					model.save();
				}
                //...
			}
		});
	}

Du rufst deine Listner direkt im Konstruktor auf. Alternativ erstellst du eine innere Listener Klasse im Controller die die Events behandelt. Das ist sogar schöner und macht mehr Sinn, wenn Listener ausserhalb des Controllers nicht verwendet werde(Fällt mir spontan nichts ein in dem dies der Fall wäre)
 

kaoZ

Top Contributor
nehmen wír mal an ich würde den Listener als innere Klasse des Controllers realisieren.

variablen etc. sind hier nur fiktiv gewählt !

Java:
public class Controller{

 View v;
 Model m;

public Controller(){
 this.v = new View();
 this.m = new Model();
}

public class ToolbarListener implements ActionListener(){
 ....
}

}

dann hätte ich ja im Normalfall, und nicht private deklariert, die Möglichkeit aus der inneren Klasse (also dem Listener) auf die Globalen Variablen des Controllers zuzugreifen sprich auf die Methoden der View und die des Models :

Java:
public void actionPerformed(ActionEvent Event){

 int value = m.calculate(12,23);
 v.setResultText(value);
}

was mache ich nun aber wenn ich den Listener ebend nicht als innere Klasse definiere, sondern in einer Eigenen Klasse, die ggf. sogar in einem anderer Package mit anderen listenern liegt, z.B einem Listener für die JMenuBar, die ebenfalls in einer Extra Klasse definiert ist ?!

der Plan war eigentlich für jeden Bereich, toolbar, Menubar, mainPanel , sidepanel einen eigenen Listener in jeweils einer eigenen Klasse zu realisieren.
 
Zuletzt bearbeitet:

gescom

Mitglied
Ist mir schon klar geworden... Die Frage bleibt aber was du damit verfolgst eigene Listener-Klassen zu entwerfen. So wie ich das sehe werden Listener ja nur im Controller aufgerufen.
Bei deinem Beispiel würde ich Vorschlagen das über einen Observer zu probieren. ???:L
 

kaoZ

Top Contributor
Ok, der Ansatz mit den in Separaten Klassen realisierten Listenern war eigentlich die Zuständigkeit auszulagern um den Code in den einzelnen Klassen nicht unnötig aufzublähen, klar das schafft natürlich auch zusätzliche Komplexität....

Da ich vorher noch nicht nach dem MVC Pattern gearbeitet habe hier mal zum Verständnis eine grade schnell zusammengebaute Struktur , ob ich es verstanden habe, ( hier noch ohne Observer )

Ich habe mal versucht es so Simpel wie möglich zu gestalten:

Model:
Java:
package mvcTest;

public class Model {
	
	public Model() {}
	
	public String manipulateInput(String input){
		return new String(input + " dies macht das Model.");
	}

}

View:
Java:
package mvcTest;

import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;

public class View extends JFrame {
	private static final long serialVersionUID = 1L;
	
	JButton btn ;
	JTextField txt;
	JLabel label;
	
	GridBagConstraints g;
	
	public View() {
		initialise();
		addComponents();
	}
	
	private void initialise(){
		txt = new JTextField();
		btn = new JButton("Abschicken");
		label = new JLabel();
		
		this.setLayout(new GridBagLayout());
		g = new GridBagConstraints();
		
		this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		this.setSize(300,150);
	}
	
	private void addComponents(){
		g.gridx = 0;
		g.gridy = 0;
		g.insets = new Insets(10,0,0,10);
		g.gridwidth = 1;
		g.fill = GridBagConstraints.HORIZONTAL;
		this.add(txt, g);
		
		g.gridx = 0;
		g.gridy = 1;
		this.add(btn, g);
		
		g.gridx = 0;
		g.gridy = 2;
		this.add(label, g);
	}
	
	public void setListener(ActionListener l){
		btn.addActionListener(l);
	}
	
	public String getTextInput(){
		return this.txt.getText();
	}
	
	public void setLabelText(String text){
		this.label.setText(text);
	}
	
	public void showFrame(){
		this.setVisible(true);
	}
}

Controller:
Java:
package mvcTest;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;


public class Controller {
	
	View v;
	Model model;
	
	public Controller(Model model) {
		initialise(model);
		addListener();
	}
	
	public void showView(){
		v.showFrame();
	}
	
	private void initialise(Model model){
		this.v = new View();
		this.model = model;
	}
	
	private void addListener(){
		v.setListener(new ButtonListener());
	}
	

	// ---------------Inner Class Listner -------------------
	
	public class ButtonListener implements ActionListener{
		

		@Override
		public void actionPerformed(ActionEvent e) {
			if (e.getSource() == v.btn) {
				v.setLabelText(model.manipulateInput(v.getTextInput()));
			}
		}
	}

}

und zu guter letzt der Aufruf

Test:
Java:
package mvcTest;

public class Test {
	
	public static void main(String[] args) {
		new Controller(new Model()).showView();
	}

}

und so sähe das ganze dann im Zusammenspiel zu Testzwecken aus:



Hierzu dann noch ein paar Frage bzw. annahmen,

1. Kennt im Normalfall das Model den View ?

2. Das Model übernimmt ja nur Logische Aufgaben (bzw. die Logik) , in meinem Beispiel die einfache Manipulation des im View über den Controller , an das Model geleiteten Strings, angenommen ich müsste jetzt nur einen Text in ein Lable setzen ohne diesen weiter zu Manipulieren etc. wäre es nicht einfacher dieses direkt über den Controller zu regeln als an das Model weiterzuleiten ?

3. In der jetzigen Situation kennt der View weder das Model, noch den Controller, so wäre also Model und Controller, bzw. View gekapselt und austauschbar, im prinzip also vollkommen konform oder täusche ich mich ?

4. Der Controller Steuer über in View und Model bereitgestellte Methoden die Verarbeitung der Aktionen im View und die daraus resultierenden Aktionen und delegiert diese dann aus dem Model an den View.

5. Wie sähe jetzt das ganze mit der Implementierung des Observer-Patterns aus

danke schonmal für deine Mühen :)
 
Zuletzt bearbeitet:

gescom

Mitglied
Das ist ja immer so eine Sache wie weit man sich dran hält. :)
Also so wie ich das gelernt habe besteht zwischen Model und View keine Beziehung. Bzw. nur über Controller. Aber da werden wohl auch andere Meinung vertreten sein.
Deine zweite Frage verstehe ich nicht ganz, natürlich kannst du den Text setzten... sogar in der View. Dein Modell regelt ja die Funktionalität. Eventuelle Abhängigkeiten von anderen libs., initialisierungen von Streams etc etc... natürlich wäre die Implementation auch im Controller möglich, aber ob das MVC konform ist? Sobald ich das weiß ist die Idee das Model austauschbar ist.
Du hast eine update Methode in der View die aufgerufen wird sobald sich ein Observer-Object ändert, über notifyObeservers... Ich bin da jetzt selbst etwas unsicher aber sowas wie:

in der View:

Java:
public void update(Observer o, Object arg){
         label.setText((String) arg);
}

im Controller:

Java:
public void ActionPerformed(ActionEvent e){
           if(e.getActionCommand() == "saveBtn"){
                   notifyObservers("Text");
                }  
}

wobei, wie schon gesagt, über den Sinn oder Unsinn lässt sich hier jetzt streiten :D
 

kaoZ

Top Contributor
Laut der wiki beschreibung des MVC Konzeptes , sieht die Abhängigkeit so aus

Der Controller kennt logischer weise View und Model

Das Model kennt weder die View noch den Controller ( außer indirekt über Beobachter )

Die View kennt das Model ( und indirekt über einen Beobachter den Controller )

so interpretiert sich das zumindest aus folgender Grafik

350px-ModelViewControllerDiagram2.svg.png


Wer implementiert jetzt das Observer Interface ? der Controller ?

dann müsste ich ja zusätzlich noch Methoden anbieten um sich bei Beobachter als beobachtetes Subjekt einzutragen und ggf. bei Änderungen über
Code:
update();
benachrichtigt zu werden.

verstehe ich das soweit richtig ?
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Lange Methodenaufrufe == suboptimales Klassendesign? Java Basics - Anfänger-Themen 5
C Klassendesign / Wann Interface implementieren und wann Klassen vererben? Java Basics - Anfänger-Themen 3
kaoZ Klassen Klassendesign Java Basics - Anfänger-Themen 2
J Klassen Klassendesign - Deklarationsreihenfolge? Java Basics - Anfänger-Themen 3
S OOP Frage zu Klassendesign Java Basics - Anfänger-Themen 6
E Klassendesign: Array für jede Objektart?! Java Basics - Anfänger-Themen 6
D Klassendesign Java Basics - Anfänger-Themen 7
alexpetri Klassendesign: Extend / Implement Java Basics - Anfänger-Themen 4
tomzen Programm ignoriert in der Ausführung Code Java Basics - Anfänger-Themen 8
O Obfuscateter Code lässt sich nicht ausführen? Java Basics - Anfänger-Themen 7
M Code aus IntelliJ in "Textform" für Word-Paper? Java Basics - Anfänger-Themen 10
T Kann mir jemand wörtlich erklären, was in dem Code genau passiert? Java Basics - Anfänger-Themen 1
Ü Dead Code im Programm? Java Basics - Anfänger-Themen 13
I QR code in Java selber generieren Java Basics - Anfänger-Themen 5
terashy VS Code Project run error Java Basics - Anfänger-Themen 10
JaZuDemNo Code Erklärung Java Basics - Anfänger-Themen 3
M Connect-4-Code analysieren Java Basics - Anfänger-Themen 2
N BMI Rechner Was haltet ihr von dem Code habt ihr Verbesserungsvorschläge weil design teschnisch ist das nicht das geilste würde das gerne überarbeiten Java Basics - Anfänger-Themen 12
W In alten Code zurück- und dort wieder zurechtfinden? Java Basics - Anfänger-Themen 17
T code so schreiben das er von sich selber anpasst (code soll die anzahl aller bustaben bestimmen) Java Basics - Anfänger-Themen 16
J Frage zu einem "Taschenrechner" code Java Basics - Anfänger-Themen 9
T Fehlercode bei code der das Alter ausrechnet Java Basics - Anfänger-Themen 2
T Text einlesen code was kommt dahin? Java Basics - Anfänger-Themen 1
jhfjeh Strukturgramm in code Java Basics - Anfänger-Themen 11
D Tipps zum Code Java Basics - Anfänger-Themen 24
W Java-Code mit Array Java Basics - Anfänger-Themen 14
W Java-Code Java Basics - Anfänger-Themen 2
W Java code- TicTac toe Java Basics - Anfänger-Themen 51
W Java-code Java Basics - Anfänger-Themen 8
W Java-code Java Basics - Anfänger-Themen 9
W Java-Code erklären Java Basics - Anfänger-Themen 6
ohneInformatik; For Schleife. Was macht dieser Code?? Java Basics - Anfänger-Themen 5
Say Fehlenden Code finden in einer while-Schleife? Java Basics - Anfänger-Themen 11
Say 2-DIM Array Code lesen und verstehen Java Basics - Anfänger-Themen 5
Say Stelle in Code herausfinden, wie geht man vor? Java Basics - Anfänger-Themen 12
Say do-While Code Ausführung Java Basics - Anfänger-Themen 3
W Rückfrage zur Programmgestaltung (clean code) Java Basics - Anfänger-Themen 12
M intelliJ auf neuem PC, plötzlich kein Code Java Basics - Anfänger-Themen 3
Pinhg Sound in Greenfoot Code einbinden Java Basics - Anfänger-Themen 2
C Java boolean Code läuft nicht Java Basics - Anfänger-Themen 5
I Code für Bezahlsystem (auch bei Offline Aktivität) Java Basics - Anfänger-Themen 7
J Größter gemeinsamer Teiler: mein Code Java Basics - Anfänger-Themen 6
B Den Dateipfad einer Java Datei durch Code in Selbiger finden? Java Basics - Anfänger-Themen 10
A Wie könnte man diesen Code kürzer machen ? Java Basics - Anfänger-Themen 7
J Frage zu meinem Code (OOP) Java Basics - Anfänger-Themen 4
Alen123 Warum funktioniert mein Code nicht? Java Basics - Anfänger-Themen 64
Max246Sch Frage zu Währungsrechner Code Java Basics - Anfänger-Themen 2
S Hilfe bei Umänderung von Java Code Java Basics - Anfänger-Themen 16
I Code wird nicht ausgeführt Java Basics - Anfänger-Themen 2
K Wie kann man diesen Code schnell und effizient interpretieren (Man hat nur 4 Minuten) Java Basics - Anfänger-Themen 3
R ISBN-10-Code überprüfen Java Basics - Anfänger-Themen 7
I Bitte um Hilfe zu unterstehenden Code Java Basics - Anfänger-Themen 6
I Interface von einer EJB Klasse, um Code zu reduzieren Java Basics - Anfänger-Themen 1
I HTML Code säubern Java Basics - Anfänger-Themen 4
B Brauche Hilfe zu einem Code Java Basics - Anfänger-Themen 5
Temsky34 Problem mit dem Code Java Basics - Anfänger-Themen 17
N Fehler im Code (Aufgabe für Anfänger) Java Basics - Anfänger-Themen 11
N Java-Code abwärtskompatibel machen Java Basics - Anfänger-Themen 4
J Erste Schritte Was mache ich in meinem Code falsch. Java Basics - Anfänger-Themen 3
Ameise04 Variablen Inhalt einer Variable im Code verwenden? Java Basics - Anfänger-Themen 9
S Compiler-Fehler Nicht adressierbarer Code ( Non-addressable code ) Java Basics - Anfänger-Themen 5
Aemulit Java Schaltjahr berechnen Code Java Basics - Anfänger-Themen 7
A Code Problem Java Basics - Anfänger-Themen 6
C Fehler im Code Java Basics - Anfänger-Themen 10
A Zu einem bestimmten Ort im Code springen Java Basics - Anfänger-Themen 11
L Ist der Code richtig Java Basics - Anfänger-Themen 3
josfe1234 code vereinfachen Java Basics - Anfänger-Themen 15
nonickatall Ausführbarkeit von Code testen bzw. Remote Debugging Java Basics - Anfänger-Themen 4
F Frage betreff Programm mit dem man C++-Code in JAVA-Code übersetzen lassen kann Java Basics - Anfänger-Themen 2
S Fehler bei Code mit SubStrings für mich nicht auffindbar. Java Basics - Anfänger-Themen 4
G Programm Code Java Basics - Anfänger-Themen 5
C Code zusammenfassen Java Basics - Anfänger-Themen 5
I Erklärung zum Java Code Java Basics - Anfänger-Themen 2
T Programmablaufsplaninterpretation in Code umformen Java Basics - Anfänger-Themen 1
dieter000 Kurze Frage kann mir ejmand kurz diesen Code erklären, bzw wie man die zeilen erklärt und so Java Basics - Anfänger-Themen 1
AlexVo String zu Java Anweisung getString("*** java code ***") Java Basics - Anfänger-Themen 19
M ISBN-Code Java Basics - Anfänger-Themen 26
B Zeitgleiches Arbeiten am Code mit mehreren Personen? Java Basics - Anfänger-Themen 7
S Wie kann ich bei diesem Code erreichen, das als Ergebnis hier 15 herauskommt? Java Basics - Anfänger-Themen 23
N Kann man den Code vereinfachen? Java Basics - Anfänger-Themen 25
marcooooo Code erklären Java Basics - Anfänger-Themen 28
marcooooo Code erklären Java Basics - Anfänger-Themen 4
S Advent of Code Day4 Java Basics - Anfänger-Themen 4
B Nach eingefügtem Code erkennt Compiler keine Instanzvar und meldet SyntaxError Java Basics - Anfänger-Themen 2
Gaudimagspam Caesars Code entziffern in Java Java Basics - Anfänger-Themen 8
Lukasbsc Wie kann ich meinen Code optimieren? Java Basics - Anfänger-Themen 4
NeoLexx equals()-Methode Verständnis Frage anhand Code Beispiel Java Basics - Anfänger-Themen 22
I Input/Output Code wird doppelt ausgeführt Java Basics - Anfänger-Themen 3
T Main startet nicht bei vorgegebenen Code Java Basics - Anfänger-Themen 41
B Frage zum Code verständnis im Resultat Java Basics - Anfänger-Themen 10
J Fehler im Code, aber ich weiß nicht wieso! Java Basics - Anfänger-Themen 6
S Mehrere Probleme im Code Java Basics - Anfänger-Themen 7
M Code nur für Cracks? Crack the Passwort Übung Java Basics - Anfänger-Themen 7
parrot Code entferneJedeZweiteZiffer Java Basics - Anfänger-Themen 6
G Code kürzen Java Basics - Anfänger-Themen 5
Bluedaishi Source Code Signieren Java Basics - Anfänger-Themen 22
L Best Practice Code Refactoring für Methoden mit fast gleicher Aufbau Java Basics - Anfänger-Themen 6
L Best Practice Code refactern Java Basics - Anfänger-Themen 30
G code kürzen Java Basics - Anfänger-Themen 16
A Code umschreiben Java Basics - Anfänger-Themen 6

Ähnliche Java Themen

Neue Themen


Oben