Kapselung und Zugriffsmodifizierer

tobiixx

Mitglied
Hallo liebe Leute,
ich versuche mich zurzeit daran ein wenig Java zu lernen. Da ich keinerlei Vorkenntnisse im programmieren habe, habe ich einfach mal angefangen das Tutorial auf "gailer-net.de" durchzuarbeiten. Bei den Programmieraufgaben zu Kapitel 33 komme ich nun zum ersten mal absolut nicht weiter. Die Aufgabe lautet:

"Aufgabe 5: Verschachtelte Boxen:
Schreiben Sie eine Methode, die true oder false ergibt, je nach dem ob eine Box vollständig in eine andere Box passt:
public boolean passtIn( Box aeussereBox )

Dies ist möglicherweise eine schwierige Methode, da die innere Box hineinpassen oder nicht hineinpassen kann, je nach dem wie sie gedreht wird. Um die Methode zu vereinfachen, schreiben Sie sie so, dass sie true zurückgibt, wenn zwei Boxen ohne Rotation ineinander geschachtelt werden können (Höhe wird mit Höhe verglichen, Länge mit Länge usw.).
"

Hoffe die Aufgabenstellung wird so einigermaßen klar. Meinen kläglichen Versuch könnt ihr unten sehen^^ Bin für jeden Tipp dankbar!

Java:
class Box
{
    private double breite, laenge, hoehe;
   
    Box(double breite, double laenge, double hoehe)
    {
        this.breite = breite;
        this.laenge = laenge;
        this.hoehe = hoehe;
    }
   
    public boolean passtIn(Box aeussereBox)
    {
        boolean passtin;
        if(hoehe>aeussereBox.hoehe || breite>aeussereBox.breite || laenge>aeussereBox.laenge)
        {
            passtin = false;
        }
        else
        {
            passtin = true;
        }
        return passtin;
    }
}


public class BoxTest
{
    public static void main (String args[])
    {
        Box innereBox = new  Box( 4.0, 6.0, 2.0 );
        innereBox.passtIn(5.0, 7.0, 3.0);
   
    }
}
 

TheFrog

Aktives Mitglied
public boolean passtIn(Box aeussereBox).

1. Die Methode verlangt ein Argument des Typs Box.

In deiner Main-Methode rufst du dann:
innereBox.passtIn(5.0, 7.0, 3.0);

auf.

1. Zu viele Argumente
2. Du übergibst keine Box ;)
 

Tobse

Top Contributor
Der Code sieht schon ganz in Ordnung aus. Zwei Dinge fallen mir aber auf:

1.
Java:
private double breite, laenge, hoehe;
Tu das nicht. Das ist gegen die Konvention. Konventionell wäre es, dashier zu schreiben:

Java:
private double breite;
private double laenge;
private double hoehe;

Damit sieht man auf anhieb, welche Klassenvariablen existieren (was bei der kompakteren Schreibweise nicht der Fall ist).

Noch konventioneller wären englische Variablennamen; aber die Deutschen waren vorgegeben...


---
2.
Java:
boolean passtin;
if(hoehe>aeussereBox.hoehe || breite>aeussereBox.breite || laenge>aeussereBox.laenge)
{
    passtin = false;
}
else
{
    passtin = true;
}
return passtin;

lässt sich vereinfachen zu:

Java:
if(hoehe>aeussereBox.hoehe || breite>aeussereBox.breite || laenge>aeussereBox.laenge)
{
    return false;
}
else
{
    return true;
}

Das ist besser, weil die Variable wegfällt. Viele Variablen sind grundsätzlich nicht wirklich ein Problem. Aber um den Code zu verstehen, muss man jede Variable im Kopf behalten. Deswegen gilt prinzipiell: so viele Variablen wie nötig [um doppelte Berechnungen zu verhindern], so wenige wie möglich [um die Verständlichkeit zu erhöhen].
Eine Ausnahme machen final Variablen, die direkt initialisiert werden:

Java:
final double temperatur = /** komplizierte berechnung */
final double volumen = gewicht / dichte;
final double entropie = /** berechnung mit temperatur und volumen*/

Hier vereinfachen die Zusätzlichen Variablen den Code: da sie final sind und direkt einen Wert bekommen, weiss man, dass sie sich nicht mehr ändern können. Dadurch muss man sie beim lesen auch nicht im Hinterkopf behalten. Die Formeln machen sie aber einfacher zu verstehen, weil die nicht mehr so sehr geschachtelt sind.

Die passtIn Methode hätte ich sogar so geschrieben:

Java:
return hoehe<=aeussereBox.hoehe || breite<=aeussereBox.breite || laenge<=aeussereBox.laenge;

P.S.: je nachdem von was für einer Box hier die Rede ist, wird natürlich die Wandstärke vernachlässigt... Dann sieht die Methode noch ein bisschen anders aus und es wäre dann für meinen Geschmack zu viel Code für eine Zeile.
 

Senftube

Aktives Mitglied
Hier der komplizierte Fall, dass die Boxen gedreht werden duerfen:

public boolean passtIn(Box aussenbox)
{
double[] innen = new double[] { breite,laenge,hoehe } ;
java.util.Arrays.sort(innen);

double[] aussen = new double[3];
aussen[0] = aussenbox.laenge; aussen[1] = aussenbox.breite; aussen[2] = aussenbox.hoehe;
java.util.Arrays.sort(aussen);

// Jetzt sind die quader so gedreht, dass sie die gleichen min/max Orientierung haben

for (int i = 0;i < 3;i++)
{
if (innen > aussen return false;
}
return true;
}
 

Senftube

Aktives Mitglied
komisch hinter innen und aussen muss eckige klammer auf, dann i dann eckige Klammer zu stehen.
Das wird beim posten herausgefiltert ??? warum ?
 

Ähnliche Java Themen

Neue Themen


Oben