Fernseher als Objekt

melaniemueller

Aktives Mitglied
Hallo ich wieder 🙂

Bei meiner letzten Aufgabe habt ihr mir super geholfen und hab es dank euch kapiert und volle Punktzahl bekommen 🙃 Danke dafĂŒr nochmal!

Bei meiner heutigen Aufgabe bin ich bereits fertig und vielleicht könnte jemand nur mal drĂŒber schauen ob es auch korrekt ist, denn mir kam es doch irgendwie "zu einfach" vor und bin mir nicht sicher ob ich denn was falsch verstanden/vergessen habe 😏

Wenn nicht, auch gut, dann wĂ€re ich happy, dass ich es wohl direkt verstanden hab 😌

Die Aufgabe lautet:
Erstellen Sie ein Programm, das einen Fernseher als Objekt abbildet. Der Fernseher soll mindestens folgende Eigenschaften haben:
‱ LautstĂ€rke,
‱ Programm und
‱ eingeschaltet beziehungsweise ausgeschaltet.
Alle drei Eigenschaften sollen geÀndert werden können. Beachten Sie bei der Umsetzung bitte folgende Vorgaben:
‱ Eine Änderung von LautstĂ€rke und Programm soll nur dann möglich sein, wenn der Fernseher eingeschaltet ist.
‱ Schalten Sie den Fernseher in Ihrem Programm mindestens einmal ein und Ă€ndern Sie die LautstĂ€rke. Wechseln Sie mindestens dreimal das Programm. Schalten Sie den Fernseher dann wieder aus.
‱ Geben Sie nach jeder Änderung den aktuellen Zustand des Fernsehers auf der Konsole aus.
‱ Greifen Sie nur ĂŒber die Methoden der Klasse auf die Instanzvariablen zu. Das gilt auch fĂŒr die Ausgabe der Werte


Meine Lösung:
Java:
package einsendeaufgabe5_1;

class Fernseher {
    //Erzeugen der Instanzvariablen
    int lautstÀrke;
    int programm;
    boolean status;
    
    //Methode zum initialsieren der Anfangswerte
    void init (boolean onOff, int anfangsProgramm, int anfangsLautstÀrke) {
    status = onOff;
    programm = anfangsProgramm;
    lautstÀrke = anfangsLautstÀrke;
    }
    
    void status (boolean onOff) {
        status = onOff;
    }
    //Lauter nur wenn der Fernseher eingeschalten ist und maximale LautstÀrke von 100
    void lauter (int Ànderung) {
        if (status == true) {
            lautstÀrke = lautstÀrke + Ànderung;
            if (lautstÀrke > 100) {
                lautstÀrke = 100;
            }
            
        }
    }
    //Leiser nur wenn der Fernseher eingeschalten ist und minimale LautstÀrke von 0
    void leiser (int Ànderung) {
        if (status == true) {
            lautstÀrke = lautstÀrke - Ànderung;
            if (lautstÀrke - Ànderung <= 0) {
                lautstÀrke = 0;
            }
        }
    }
    //Programmwechsel ist nur möglich, wenn der Fernseher eingeschalten ist
    void programmWechsel (int wechsel) {
        if (status == true) {
            programm = wechsel;
    }
}
    void ausgabe () {
        if (status == true)
            System.out.println("Der Fernseher ist eingeschalten, es lÀuft aktuell Programm " + programm + " bei LautstÀrke " + lautstÀrke);
            else
                System.out.println("Der Fernseher ist ausgeschalten");
        }
    }
    

public class einsendeaufgabe5_1 {

    public static void main(String[] args) {
        //Instanzen erzeugen und initialisieren
        Fernseher meinFernseher = new Fernseher();
        meinFernseher.init(true, 1, 10);
        //AusfĂŒhren der Methoden
        meinFernseher.ausgabe();
        meinFernseher.lauter(50);
        meinFernseher.ausgabe();
        meinFernseher.programmWechsel(8);
        meinFernseher.ausgabe();
        meinFernseher.programmWechsel(4);
        meinFernseher.ausgabe();
        meinFernseher.leiser(7);
        meinFernseher.programmWechsel(0);
        meinFernseher.ausgabe();
        meinFernseher.status(false);
        meinFernseher.ausgabe();
    
        
        
    }


    }
 
Also die init Methode sollte eher ein Konstruktor sein. Denn mit der init Methode könntest Du sonst das Programm auch Àndern, wenn der Fernseher aus ist.

Bei lauter / leider wĂ€re noch eine PrĂŒfung denkbar, ob der Parameter >= 0 ist. Das ist von der Aufgabe aber nicht gefordert (Das war die Begrenzung der LautstĂ€rke auf 100 aber auch nicht.)
 
Zeile 33 ist so vermutlich auch nicht gedacht: da Du die LautstĂ€rke ja vorher schon Ă€nderst, reicht hier die PrĂŒfung, ob die LautstĂ€rke nach der Änderung < 0 wĂ€re.

Zwei "NebensÀchlichkeiten":

Namensgebung: ein boolean onOff oder status ist nicht sehr aussagekrÀftig. Die Feststellung, dass der Fernseher onOff ist, sagt jetzt eigentlich gar nichts aus. Mach lieber was wie turnedOn, poweredOn oder Àhnliches.

if-Statements: ein Vergleich eines booleans mit true oder false ist doppelt gemoppelt, denn das Ergebnis ist wieder ein boolean. Wenn Du schöne Namen wĂ€hlst und den Vergleich weglĂ€sst, liest sich der Code gleich viel flĂŒssiger. Vergleiche selbst:
Java:
if (status == true) {
vs.
Java:
if (poweredOn) {
 
Also die init Methode sollte eher ein Konstruktor sein. Denn mit der init Methode könntest Du sonst das Programm auch Àndern, wenn der Fernseher aus ist.
Konstruktor macht mehr sinn.
Aber auch hier wĂŒrde ich prĂŒfen ob die ĂŒbergebe Variable onOff auch true ist.
Oder der Konstrukteur schaltet beim Objekt erstellen den Fernseher ein.
 
Konstruktor macht mehr sinn.
Aber auch hier wĂŒrde ich prĂŒfen ob die ĂŒbergebe Variable onOff auch true ist.
Oder der Konstrukteur schaltet beim Objekt erstellen den Fernseher ein.
Wenn onOff nur einen Wert haben darf bei der Erstellung, dann lÀsst man den Parameter weg und setzt den Wert direkt.

Und diese Logik ist erst einmal von der uns ĂŒberlieferten Logik nicht gefordert. Daher kann man sich das wohl relativ frei ĂŒberlegen.
 
Genau das meinte ich ja vielleicht etwas kompliziert ausgedrĂŒckt.

Aber beim weglassen muss der Status auf on gesetzt werden.
 
Bei meiner heutigen Aufgabe bin ich bereits fertig und vielleicht könnte jemand nur mal drĂŒber schauen ob es auch korrekt ist
Funktioniert, ich wĂŒrde aber ein paar Dinge anders machen.
z.B.
[CODE lang="java" title="Fernseher" highlight="5-7,19-21,23-30,33-37"]public class Fernseher {
// Instanzvariablen private gewĂ€hrleistet Zugriff nur ĂŒber Methoden
// Defaultwerte ersetzen die Initmethode
// sprechende Namen erleichtern das Lesen des Codes
private int lautstÀrke = 25;
private int programm = 1;
private boolean eingeschaltet = false;

void ausgabe() {
String out = "Der Fernseher ist ";
if (eingeschaltet)
out += "eingeschalten\nEs lÀuft aktuell Programm " + programm + " bei LautstÀrke " + lautstÀrke;
else
out += "ausgeschalten";
System.out.println(out);
}


public void setEingeschaltet(boolean eingeschaltet) {
this.eingeschaltet = eingeschaltet;
}

public void setLautstÀrke(int lautstÀrke) {
if (!eingeschaltet) // falls ausgeschaltet mach nichts
return;
if (lautstĂ€rke < 0) // halte den Wert in vernĂŒnftigen Grenzen
lautstÀrke = 0;
if (lautstÀrke > 100)
lautstÀrke = 100;
this.lautstÀrke = lautstÀrke;
}

public void setProgramm(int programm) {
if (!eingeschaltet || programm < 1) // falls ausgeschaltetet oder ungĂŒltigem Programm
return;
this.programm = programm;
}

public static void main(String[] args) {
//Instanzen erzeugen und initialisieren
Fernseher meinFernseher = new Fernseher();
//AusfĂŒhren der Methoden
meinFernseher.ausgabe();
meinFernseher.setEingeschaltet(true);
meinFernseher.setLautstÀrke(50);
meinFernseher.ausgabe();
meinFernseher.setProgramm(8);
meinFernseher.ausgabe();
meinFernseher.setProgramm(4);
meinFernseher.ausgabe();
meinFernseher.setLautstÀrke(7);
meinFernseher.setProgramm(0);
meinFernseher.ausgabe();
meinFernseher.setEingeschaltet(false);
meinFernseher.ausgabe();
}
}[/CODE]
 
Funktioniert, ich wĂŒrde aber ein paar Dinge anders machen.
z.B.
[CODE lang="java" title="Fernseher" highlight="5-7,19-21,23-30,33-37"]public class Fernseher {
// Instanzvariablen private gewĂ€hrleistet Zugriff nur ĂŒber Methoden
// Defaultwerte ersetzen die Initmethode
// sprechende Namen erleichtern das Lesen des Codes
private int lautstÀrke = 25;
private int programm = 1;
private boolean eingeschaltet = false;

void ausgabe() {
String out = "Der Fernseher ist ";
if (eingeschaltet)
out += "eingeschalten\nEs lÀuft aktuell Programm " + programm + " bei LautstÀrke " + lautstÀrke;
else
out += "ausgeschalten";
System.out.println(out);
}


public void setEingeschaltet(boolean eingeschaltet) {
this.eingeschaltet = eingeschaltet;
}

public void setLautstÀrke(int lautstÀrke) {
if (!eingeschaltet) // falls ausgeschaltet mach nichts
return;
if (lautstĂ€rke < 0) // halte den Wert in vernĂŒnftigen Grenzen
lautstÀrke = 0;
if (lautstÀrke > 100)
lautstÀrke = 100;
this.lautstÀrke = lautstÀrke;
}

public void setProgramm(int programm) {
if (!eingeschaltet || programm < 1) // falls ausgeschaltetet oder ungĂŒltigem Programm
return;
this.programm = programm;
}

public static void main(String[] args) {
//Instanzen erzeugen und initialisieren
Fernseher meinFernseher = new Fernseher();
//AusfĂŒhren der Methoden
meinFernseher.ausgabe();
meinFernseher.setEingeschaltet(true);
meinFernseher.setLautstÀrke(50);
meinFernseher.ausgabe();
meinFernseher.setProgramm(8);
meinFernseher.ausgabe();
meinFernseher.setProgramm(4);
meinFernseher.ausgabe();
meinFernseher.setLautstÀrke(7);
meinFernseher.setProgramm(0);
meinFernseher.ausgabe();
meinFernseher.setEingeschaltet(false);
meinFernseher.ausgabe();
}
}[/CODE]
Danke fĂŒr deinen Ansatz!
Könntest du mir noch kurz erklĂ€ren wofĂŒr genau das Set vor eingeschalten gebraucht wird? Die Thematik "Set und Get" und this. wurde in meinem aktuellen Studienheft auch behandelt, nur ist es mir nicht ganz klar wann genau man es verĂ€ndert oder auch wieso du es verwendet hast.
 
Zeile 33 ist so vermutlich auch nicht gedacht: da Du die LautstĂ€rke ja vorher schon Ă€nderst, reicht hier die PrĂŒfung, ob die LautstĂ€rke nach der Änderung < 0 wĂ€re.

Zwei "NebensÀchlichkeiten":

Namensgebung: ein boolean onOff oder status ist nicht sehr aussagekrÀftig. Die Feststellung, dass der Fernseher onOff ist, sagt jetzt eigentlich gar nichts aus. Mach lieber was wie turnedOn, poweredOn oder Àhnliches.

if-Statements: ein Vergleich eines booleans mit true oder false ist doppelt gemoppelt, denn das Ergebnis ist wieder ein boolean. Wenn Du schöne Namen wĂ€hlst und den Vergleich weglĂ€sst, liest sich der Code gleich viel flĂŒssiger. Vergleiche selbst:
Java:
if (status == true) {
vs.
Java:
if (poweredOn) {
Der Fehler in Zeile 33 fiel mir gestern auch noch auf und hab es direkt ausgebessert. Mit der Namensgebung hast du wohl recht, das schau ich mir nochmal an und Àndere es ab - danke!
 
Danke fĂŒr deinen Ansatz!
Könntest du mir noch kurz erklĂ€ren wofĂŒr genau das Set vor eingeschalten gebraucht wird? Die Thematik "Set und Get" und this. wurde in meinem aktuellen Studienheft auch behandelt, nur ist es mir nicht ganz klar wann genau man es verĂ€ndert oder auch wieso du es verwendet hast.
Es ist ĂŒblich, Felder in Java private zu halten und fĂŒr Zugriffe werden dann Setter und Getter verwendet. Das sind in der Regel Methoden, die genau so heißen wie das Feld nur eben mit einem get bzw. set davor.

Die Logik dahinter ist einfach so, dass Felder oft einen Namen haben, der ein Nomen ist (LautstÀrke, Programm, ...). Und Methoden machen etwas, also sollte da ein Verb enthalten sein. Und da der Name der Methode umschreiben soll, was die Methode macht, liegt genau das oben beschriebene nahe. Ein bestimmtes Feld wird geholt -> auf Englisch das getFieldName. Beim Setter das gleich, es wird das Feld gesetzt, also setFieldName.

Damit hat man dann schön umschrieben, wieso diese Festlegung auch durchaus Sinn macht.
 

ZurĂŒck
Oben