[OOP] Ist dieses Programm OOP oder doch nur objektbasiert?



  • Wir hatten heute die tolle Hausaufgabe bekommen einen Getränkeautomaten zu
    simulieren, als einfach Applet. Da ich mich gerade mit OOP befasse, habe ich
    das ganze mal etwas anderst angegangen als ich es sonst tun würde bzw. bisher
    tat und folgendes kam heraus:
    Wäre nett wenn ihr euch das mal anschauen könntet und mir sagen könnten ob ich
    etwas falsch gemacht habe und wenn was, also auf OOP bezogen.
    Polymorphie konnte man hier ja nicht anwenden, statdessen habe ich das mit den
    Buttons eben auf diese Weise gelöst, da es ja auch so etwas ähnliches wie
    Polymorphie ist, find ich 😃
    Die Klasse Flasche habe ich nicht kommentiert, ich denke man erkennt sofort
    wofür alles da ist.

    Achja wenn es Fragen gibt weshalb ich etwas so und so gemacht habe, bitte Fragen 🙂

    /*
     * @(#)Getraenkeautomat.java 1.0 04/01/27
     */
    
    import java.awt.*;
    import java.awt.event.*;
    import java.applet.*;
    
    public class Getraenkeautomat extends Applet implements ActionListener {
    
    	BorderLayout BlLayout = new BorderLayout ();
    	Panel PnNorth = new Panel ();
    	Panel PnCenter = new Panel ();
    	Panel PnSouth = new Panel ();
    	Button BnRefill = new Button ("Refill all");
    	TextArea TaAusgabe = new TextArea ();
    	TextField TfGeld = new TextField (3);
    
    	// Getränke des Automates
    	Flaschen Getraenk[] = { new Flaschen ("Cola", 0.75, 10),
    						   new Flaschen ("Cola-Mix", 0.65, 10),
    						   new Flaschen ("Wasser", 0.65, 10),
    						   new Flaschen ("Apfelsaft", 0.65, 10),
    						   new Flaschen ("Fanta", 0.65, 10)
    						 };
    	// Ein Element für jeden Button sowie ein Verweis auf den Button
    	Button Auswahl[][] = new Button[Getraenk.length][2];
    
    	public void init() {
    
    		// Buttons hinzufügen
    		for (int i = 0; i < Auswahl.length; i++) {
    			// Button erzeugen
    			Auswahl[i][0] = new Button (Getraenk[i].getName () + " " + Getraenk[i].getPreis ());
    			// Verweis auf den Button speichern
    			Auswahl[i][1] = (Button) PnNorth.add (Auswahl[i][0]);
    		}
    		// Buttons für das Empfangen von Ereignissen registrieren
    		for (int i = 0; i < Auswahl.length; i++) {
    			Auswahl[i][0].addActionListener(this);
    		}
    		// Elemente den Panels hinzufügen
    		PnNorth.add (TfGeld);
    		PnCenter.add (TaAusgabe);
    		PnSouth.add (BnRefill);
    		// Button(s) für das Empfangen von Ereignissen registrieren
    		BnRefill.addActionListener (this);
    
    		setLayout (BlLayout);
    		add ("North", PnNorth);
    		add ("Center", PnCenter);
    		add ("South", PnSouth);
    
    	}
    
    	public void actionPerformed (ActionEvent ae) {
    		// Auffüllen
    		if (ae.getActionCommand().equals(BnRefill.getLabel ())) {
    			for (int i = 0; i < Getraenk.length; i++) {
    				Getraenk[i].setAnzahl (10);
    				Auswahl[i][0].setEnabled (true); // Button wieder anktivieren
    			} 
    			return; // Methode verlassen
    		}
    
    		// Gedrückter Button ermitteln
    		for (int i = 0; i < Auswahl.length; i++) {
    			if (ae.getSource () == Auswahl[i][1]) {
    				// Prüfen ob noch min 1Flaschen enthalten ist
    				if (!Getraenk[i].isEmpty ()) {
    					// Eingeworfenes Geld in double parsen und
    					// Prüfen ob genug eingeworfen wurde
    					try {
    						double einwurf = Double.valueOf(TfGeld.getText ()).doubleValue();
    						if (einwurf >= Getraenk[i].getPreis ()) {
    							TaAusgabe.append ("\nGetränk " + Getraenk[i].getName () +
    											  " ausgeworfen\n");
    							Getraenk[i].redAnzahl (); // Anzahl um 1 verringern
    
    							TfGeld.setText (""); // "Geld einnehmen"
    						}
    						else {
    							TaAusgabe.append ("\nGetränk " + Getraenk[i].getName () +
    						 				  " kostet " + Getraenk[i].getPreis ());
    						}
    					} 
    					catch (NumberFormatException nfe) {
    						TaAusgabe.append ("\nBitte geben Sie einen gültigen Betrag ein." +
    										  "z.b. 0.65\n");
    					}
    				}
    				else {
    					Auswahl[i][0].setEnabled(false);
    					TaAusgabe.append ("\nleer\n");
    				}
    			return; // Methode verlassen, da Getränk gefunden Wurde und alles erledigt ist
    			}
    		}
    
    	}
    
    }
    
    // Klasse für einen Flaschenvorrat eines beliebigen Getränkes
    class Flaschen {
    
    	private String m_name;
    	private double m_preis;
    	private int m_anzahl;
    
    	Flaschen () {
    		m_name = "";
    		m_preis = 0.0;
    		m_anzahl = 0;
    	}
    
    	Flaschen (String name, double preis, int anzahl) {
    		m_name = name;
    		m_preis = preis;
    		m_anzahl = anzahl;
    	}
    
    	public String getName () {
    		return m_name;
    	}
    
    	public int getAnzahl () {
    		return m_anzahl;
    	}
    
    	public double getPreis () {
    		return m_preis;
    	}
    
    	public boolean isEmpty () {
    		return (m_anzahl > 0 ? false : true);
    	}
    
    	public void setAnzahl (int anzahl) {
    		m_anzahl = anzahl;
    	}
    
    	public void addFlaschenn (int anzahl) {
    		m_anzahl += anzahl;
    	}
    
    	public int redAnzahl () {
    		return --m_anzahl;
    	}
    
    	public int redAnzahl (int anzahl) {
    		m_anzahl -= anzahl;
    		return m_anzahl;
    	}
    
    }
    

    Edit:
    Flasche wurde zu Flaschen und wird auch als Stapel an Flaschen dokumentiert.



  • Ich denke schon das der Code objektorientiert ist, jedoch denke ich auch, dass du bei der Namensgebung deiner Methoden nicht ganz so viel Denglisch verwenden solltest... 😉



  • Ok das mag wohl wahr sein, werd in Zukunft auf full Englisch umstellen 🤡



  • Was verstehst du denn unter objektbasiert? Meiner Definition nach ist das Programm offensichtlich objektorientiert, also musst du wohl nach anderen Kriterien entscheiden.
    Allerdings hat deine Klasse Flasche einen Fehler. Sowohl der Name als auch der Kommentar darüber kommunizieren, dass es sich um eine einzelne Flasche handelt. Nach kurzer Untersuchung des Codes scheint es sich aber jeweils um einen ganzen Stapel von Flaschen desselben Getränks zu handeln.



  • Stimmt, gut dass du mich darauf hinweist. Da die größe der Flasche nicht entscheidend
    ist, ist eine einfache Anzahl aber ausreichend.

    Objektbasiert ist für mich, wenn ich prozedural arbeite, aber Klassen verwende
    wie die structs in C, so verwende ich zwar Klassen und Methodem um Objekte der
    Klasse zu manipulieren, aber löse vieles trotzdem noch über Switch u.ä. statt
    über Polymorphie. So hab ich es ausm C++ Primer gelernt, da wird ja zuerst
    prozedural, dann objektbasiert und zum schluss oop behandelt.



  • Aber du benutzt doch eindeutig Polymorphie.



  • Kannst du mir sagen wo? Würde mir sehr viel weiter helfen, bei meinem Verständnis
    was OOP angeht.



  • Indem du ActionListener implementierst.



  • Hm stimmt, aber das was ich selber gemacht habe, außer dem Benutzen von ActionListener meine ich.
    Sonst habe ich ja keine großen Alternative auf einen Knopfdruck zu reagieren,vor
    allem kenne ich keine die nicht deprecated ist.



  • Also ich denke OOP ist nicht gleich Polymorphie, man kann doch auch objektorientiert programmieren, zumindest bei relatib kleinen Programmen, ohne überall wo nur möglich Polymorphie bewusst(also mal abgesehen von der Standard API) zu benutzen.



  • Pogo schrieb:

    Also ich denke OOP ist nicht gleich Polymorphie, man kann doch auch objektorientiert programmieren, zumindest bei relatib kleinen Programmen, ohne überall wo nur möglich Polymorphie bewusst(also mal abgesehen von der Standard API) zu benutzen.

    Jo das stimmt, deswegen meine Frage ja ob objektbasiert oder oop, da bei diesem
    Programm Polymorphie nicht wirklich anwendbar ist, außer jedes Getränk wäre ne
    abgeleitete Klasse von "Flaschen", aber das würde meine gesamte Einfachheit bei
    dem erweitern zu nichte machen und wäre absolut schwachsinnig.
    Also ist das Programm so oo wie sinnvoll möglich 🙂


Anmelden zum Antworten