Modellierung, vererbung,

Diskutiere Modellierung, vererbung, im Java Basics - Anfänger-Themen Bereich.
mrBrown

mrBrown

Bitte achte doch beim Zitieren darauf, deinen eigenen Text nicht mit in das Zitat zu schreiben.

Wieso nicht ? Das ist der Part den Ich nicht kapiere ? Der Kran muss doch überprüfen, ob die Zahl die er bekommt zu einem Stapel gehört? Bzw er muss doch auf den Inhalt von der Containerklasse zugreifen ? Weil ich will im Kran in der methode irgendwo durch den Stack iterrieren um die mitgegebene int nummer mit stack.getContainerStackNumber zu vergleichen ? Wenn sie da ist muss die Position des Krans doch auf die bestätigte zahl setzen oder nicht? Oder passiert das alles erst in der TerminalContainer klasse?
Das alles muss nicht im Kran passieren - das Terminal hat Kran und Stapel, also kann das Terminal sich auch darum kümmern.

Aber dann ist mir imemrnoch nicht klar, wie die Methoden für den Kran aussehen ?
In meinem Vorschlag: public void positioniereVor(ContainerStack ...), public void pick() und public void place(). Füllen musst du die natürlich selbst.

Passieren die ganzen Überprüfungen im Kran selbst oder im Terminal?????
Kommt drauf an, was du mit "die ganzen Überprüfungen" meinst.

Die Überprüfung, wo der Kran hingestellt werden muss: Terminal.
Die Überprüfung, ob der Kran den Container von einem Stapel heben kann: Kran.

Ne ne die Aufgabe gibt vor, dass es nur einen Kran für das Terminal gibt. Dem Konstruktor hätte ich eh nur die position mitgegeben, damit man den Kran im Terminal ein mal beliebig positioniert und halt dann den einen Kran auf die Positionen stellt.
Das ist natürlich auch möglich :)
 
mihe7

mihe7

Wieso nicht ? Das ist der Part den Ich nicht kapiere ?
Genau deswegen bekommst Du Aufgaben gestellt, bei denen es um Modellierung geht. Das ist auch der Grund, warum ich hier auf dem Modell rumreite und relativ wenig zum Code geschrieben habe. Es bringt nichts, wenn Du Dich mit Code herumquälst, so lange das Modell nicht in Ordnung ist.

Der Kran muss doch überprüfen, ob die Zahl die er bekommt zu einem Stapel gehört? Bzw er muss doch auf den Inhalt von der Containerklasse zugreifen ? Weil ich will im Kran in der methode irgendwo durch den Stack iterrieren um die mitgegebene int nummer mit stack.getContainerStackNumber zu vergleichen ?
Die Aufgabe des Krans ist es, Container zu bewegen. Dazu kann er zu einem Containerstapel gefahren werden. Die Aufgabe des Krans ist nicht zu wissen, wo sich der Stapel mit der Nummer 4711 im Terminal befindet.

Dieses Wissen hat das Terminal. Aus Sicht der Modellierung stellt sich nur noch die Frage, ob es vernünftiger ist, wenn das Terminal den Kran kennt oder umgekehrt.

Man darf nicht vergessen, dass ein Modell, ganz allgemein, eine vereinfachende Abbildung eines Originals ist, die einem bestimmten Zweck dient. Ein Modell kann die Wirklichkeit nicht wahrheitsgemäß abbilden, ein Modell muss nur dazu taugen, den entsprechenden Zweck zu erfüllen.

Wenn Du z. B. in Google Maps o. ä. Dir die Karte der Welt ansiehst, stellst Du fest, dass Grönland dort fast so groß wie Afrika erscheint, obwohl Afrika etwa die 15-fache Fläche besitzt. Die Karte ist so gesehen falsch. Das macht aber nichts, da die Karte "nur" ein Modell ist, das einem Zweck dienen muss. Die Abbildung der Erde erfolgt bei diesen Karten nicht flächen- sondern winkeltreu, weil es in der Navigation (= Zweck) um korrekte Kurse (Winkel) und nicht um korrekte Flächen geht.

Man könnte sich überlegen, ein vollautomatisches Container Terminal zu bauen. Dem Terminal erteilt man nur einen Auftrag und das Terminal führt diesen selbsttätig aus. So spielt es für den Anwender des Terminals beispielsweise keine Rolle, ob dieses über einen einzigen Kran oder über 25 Kräne verfügt und welcher Kran welchen Beförderungsauftrag regelt. Ebenso uninteressant ist es für den Anwender zu wissen, wo die Container(stapel) genau stehen usw. Der Anwender sagt nur: "liebes Terminal, bitte sorge dafür, dass der oberste Container vom Stapel 0815 auf den Stapel 4711 geschoben wird".

In dem Fall muss das Terminal wissen (oder in Erfahrung bringen können), welche Stapel mit 0815 und 4711 gemeint sind und kann den Kran entsprechend instruieren.

Der Kran wiederum muss sicherstellen, dass er keinen Unsinn treibt. Der Kran weiß, ob er den Container hochheben kann und ob er ihn "ausreichend hoch" heben kann, um ihn auf dem Zielstapel platzieren zu können.

Der Stapel dagegen weiß, aus welchen Containern er besteht und kennt daher auch die aktuelle Gesamthöhe.

Derlei Überlegungen führen dann zu einem Modell, dessen Zweckmäßigkeit Du gedanklich überprüfen kannst, indem Du die Aufgabe anhand des Modells durchspielst.

Wenn Du soweit bist, dann kannst Du anfangen, den Spaß in Code zu gießen.
 
N

Noob1234_1234

Genau deswegen bekommst Du Aufgaben gestellt, bei denen es um Modellierung geht. Das ist auch der Grund, warum ich hier auf dem Modell rumreite und relativ wenig zum Code geschrieben habe. Es bringt nichts, wenn Du Dich mit Code herumquälst, so lange das Modell nicht in Ordnung ist.



Die Aufgabe des Krans ist es, Container zu bewegen. Dazu kann er zu einem Containerstapel gefahren werden. Die Aufgabe des Krans ist nicht zu wissen, wo sich der Stapel mit der Nummer 4711 im Terminal befindet.

Dieses Wissen hat das Terminal. Aus Sicht der Modellierung stellt sich nur noch die Frage, ob es vernünftiger ist, wenn das Terminal den Kran kennt oder umgekehrt.

Man darf nicht vergessen, dass ein Modell, ganz allgemein, eine vereinfachende Abbildung eines Originals ist, die einem bestimmten Zweck dient. Ein Modell kann die Wirklichkeit nicht wahrheitsgemäß abbilden, ein Modell muss nur dazu taugen, den entsprechenden Zweck zu erfüllen.

Wenn Du z. B. in Google Maps o. ä. Dir die Karte der Welt ansiehst, stellst Du fest, dass Grönland dort fast so groß wie Afrika erscheint, obwohl Afrika etwa die 15-fache Fläche besitzt. Die Karte ist so gesehen falsch. Das macht aber nichts, da die Karte "nur" ein Modell ist, das einem Zweck dienen muss. Die Abbildung der Erde erfolgt bei diesen Karten nicht flächen- sondern winkeltreu, weil es in der Navigation (= Zweck) um korrekte Kurse (Winkel) und nicht um korrekte Flächen geht.

Man könnte sich überlegen, ein vollautomatisches Container Terminal zu bauen. Dem Terminal erteilt man nur einen Auftrag und das Terminal führt diesen selbsttätig aus. So spielt es für den Anwender des Terminals beispielsweise keine Rolle, ob dieses über einen einzigen Kran oder über 25 Kräne verfügt und welcher Kran welchen Beförderungsauftrag regelt. Ebenso uninteressant ist es für den Anwender zu wissen, wo die Container(stapel) genau stehen usw. Der Anwender sagt nur: "liebes Terminal, bitte sorge dafür, dass der oberste Container vom Stapel 0815 auf den Stapel 4711 geschoben wird".

In dem Fall muss das Terminal wissen (oder in Erfahrung bringen können), welche Stapel mit 0815 und 4711 gemeint sind und kann den Kran entsprechend instruieren.

Der Kran wiederum muss sicherstellen, dass er keinen Unsinn treibt. Der Kran weiß, ob er den Container hochheben kann und ob er ihn "ausreichend hoch" heben kann, um ihn auf dem Zielstapel platzieren zu können. ???


Der Stapel dagegen weiß, aus welchen Containern er besteht und kennt daher auch die aktuelle Gesamthöhe.

Derlei Überlegungen führen dann zu einem Modell, dessen Zweckmäßigkeit Du gedanklich überprüfen kannst, indem Du die Aufgabe anhand des Modells durchspielst.

Wenn Du soweit bist, dann kannst Du anfangen, den Spaß in Code zu gießen.
Ich glaube wir reden alle aneinander vorbei. Ihr habt mir echt viel bei der Modellierung geholfen und inzwischen ist mir auch klar, was der Sinn vom Terminal ist, aber mein grundlegendes Problem/Frage, die ich schon 3 oder 4 mal gestellt habe, wird mir nicht beantwortet.
Wie lass ich denn den Kran auf die Container zugreifen? Ich hab alles auf static gesetzt und so klappts, aber mir wurde schon gesagt, dass das der falsche Weg ist und mir ist das ja auch bewusst, aber ich versteh es echt nicht?

Code:
public class Crane {

    private static final int maxHeight = 2438; // 160 Fuß entsprechen 2438,4 cm
    private static final int maxloadCapacity = 30000;
    private int position;

    public static int getMaxheight() {
        return maxHeight;
    }

    public static int getMaxloadcapacity() {
        return maxloadCapacity;
    }

    public Crane(int position) {
        setPosition(position);
    }

    public void setPosition(int position) {
        this.position = position;
    }

    public void cranePositioningOrigin(int stackNumber) {
        setPosition(stackNumber);
    }

    public void cranePositioningDestination(int stackNumber2) {
        setPosition(stackNumber2);
    }

    public Container pick() { // Brauche ich pick und place überhaupt ??? oder kann ich meine positioning methoden mit der transport methode kopieren?
        
    }

    public Container place() {

    }

    public void transportContainer(ContainerStack origin, ContainerStack destination) {
    
    // Legitim ?
        if (Crane.getMaxloadcapacity() >= origin.getContainerWeight()
                && Crane.getMaxheight() >= (Crane.getMaxheight() - destination.calculateContainerStackHeight())) {

            Container c = origin.pick();
            destination.place(c);
        } else {
            System.out.println("zu schwer oder zu hoch");
        }
    }
}
 
N

Noob1234_1234

Laut euren Beschreibungen dachte ich, dass die Überprüfung ob und was der Kran kann auch vom Terminal passiert, denn ihr habt ja beide schon festgestellt, dass nur das Terminal sowohl Zugriff auf den Kran hat als auch auf den Stapel und da nur der Stapel Auskunft über die Container hat, kann doch auch nur das Terminal entscheiden, ob der Kran was kann oder nicht ?

Ich hab in der Aufgabe noch eine Testein- und ausgabe. Diese wird als Textdatei gelesen und soll entsprechend das gleiche wie aufm Blatt raus kommen
 
mrBrown

mrBrown

Ich glaube wir reden alle aneinander vorbei. Ihr habt mir echt viel bei der Modellierung geholfen und inzwischen ist mir auch klar, was der Sinn vom Terminal ist, aber mein grundlegendes Problem/Frage, die ich schon 3 oder 4 mal gestellt habe, wird mir nicht beantwortet.
Wie lass ich denn den Kran auf die Container zugreifen? Ich hab alles auf static gesetzt und so klappts, aber mir wurde schon gesagt, dass das der falsche Weg ist und mir ist das ja auch bewusst, aber ich versteh es echt nicht?
Dein Problem lässt sich nicht von der Modellierung trennen :)

In Kran brauchst du die Position nicht als int, oder steht der Kran vor einer Zahl?
Bring einfach mal den Satz zu Ende: „Der Kran steht vor einem ___“


Laut euren Beschreibungen dachte ich, dass die Überprüfung ob und was der Kran kann auch vom Terminal passiert, denn ihr habt ja beide schon festgestellt, dass nur das Terminal sowohl Zugriff auf den Kran hat als auch auf den Stapel und da nur der Stapel Auskunft über die Container hat, kann doch auch nur das Terminal entscheiden, ob der Kran was kann oder nicht ?
Das Terminal kennt zwar den Kran, aber nur der Kran kennt seine eigenen Daten.
Nur das Terminal kennt alle ContainerStapel - aber deshalb soll der Kran ja entsprechend positioniert werden, dann kann auch der Kran den jeweiligen Stapel kennen.
 
mihe7

mihe7

aber mein grundlegendes Problem/Frage, die ich schon 3 oder 4 mal gestellt habe, wird mir nicht beantwortet.
Wie lass ich denn den Kran auf die Container zugreifen?
Die Hoffnung besteht darin, dass der Fragesteller selbst auf die Lösung kommt. Das Problem hat sich nämlich nie wirklich gestellt. Du hast es nur zu einem Problem gemacht, weil Du im Kran unbedingt eine Stapelnummer haben willst.
 
N

Noob1234_1234

Dein Problem lässt sich nicht von der Modellierung trennen :)

In Kran brauchst du die Position nicht als int, oder steht der Kran vor einer Zahl?
Bring einfach mal den Satz zu Ende: „Der Kran steht vor einem ___“
Containerstapel?


Das Terminal kennt zwar den Kran, aber nur der Kran kennt seine eigenen Daten.
Nur das Terminal kennt alle ContainerStapel - aber deshalb soll der Kran ja entsprechend positioniert werden, dann kann auch der Kran den jeweiligen Stapel kennen.
 
N

Noob1234_1234

Ihr beiden seht wohl die Lösung schon, aber ich hänge auf dem Schlauch....
Die Hoffnung besteht darin, dass der Fragesteller selbst auf die Lösung kommt. Das Problem hat sich nämlich nie wirklich gestellt. Du hast es nur zu einem Problem gemacht, weil Du im Kran unbedingt eine Stapelnummer haben willst.
 
mihe7

mihe7

Ihr beiden seht wohl die Lösung schon, aber ich hänge auf dem Schlauch....
Die Lösung gab es schon die ganze Zeit: void transportContainer(ContainerStack origin, ContainerStack destination), nur dass Du mir hier
Nachtrag: wie ich gerade lese, wird es die Methode so nicht geben, da die Transportschritte einzeln durchzuführen sind.
nicht glauben wolltest. Jetzt wird die Methode halt in einzelne Schritte aufgeteilt. Und der Kran vor einem
positioniert.
 
N

Noob1234_1234

Hä dann ist es doch so oder wie ? Aber wo geb ich die Zahlen bitte mit und wie kombiniere ich das. Sobald alles klappt muss ich noch eine main Methode schreiben, die eine Textdatei lesen und anwenden kann. In der Textdatei steht dann irgendwo 2 Zeilen (1. Zeile 2,0 und 2. Zeile 3,2) und das bedeutet dann, dass der oberste Container vom Stappel 2 auf den 0. gepackt wird, und der oberste Container von 3 auf den 2. Stappel. Und hier liegt ja das Problem, wo nimmt mein Programm die 2 Werte entgegen und wie verarbeitet er sie ?
Code:
public void transportContainer(ContainerStack origin, ContainerStack destination) {

        if (Crane.getMaxloadcapacity() >= origin.getContainerWeight()
                && Crane.getMaxheight() >= (Crane.getMaxheight() - destination.calculateContainerStackHeight())) {

            Container c = origin.pick();
            destination.place(c);
        } else {
            System.out.println("zu schwer oder zu hoch");
        }
    }
 
mrBrown

mrBrown

Hä dann ist es doch so oder wie ?
Nein, wie @mihe7 sagte, muss die Methode in einzelne Schritte aufgeteilt werden.

Kümmer dich erstmal nur um das Positionieren. Wenn das fertig ist, kann man sich um den Rest kümmern.


Und hier liegt ja das Problem, wo nimmt mein Programm die 2 Werte entgegen und wie verarbeitet er sie ?
Später mal in main und Terminal, aber das ist grad noch irrelevant.
 
N

Noob1234_1234

Ich schätze mal mein Ansatz ist falsch, wenn du schon sagst kümmer dich ums Positionieren oder ?

Code:
public void setPosition(int position) {
        this.position = position;
    }

    public void cranePositioningOrigin(int stackNumber) {
        setPosition(stackNumber);
    }

    public void cranePositioningDestination(int stackNumber2) {
        setPosition(stackNumber2);
    }

    public Container pick(ContainerStack origin) {
        return origin.pick();
    }

    public void place(Container container, ContainerStack destination) {
        destination.place(container);
    }
 
J

Javinner

  1. Positioniere Kran vor Ursprungsstapel
  2. Entnehme obersten Container („pick“)
  3. Positioniere Kran vor Zielstapel
  4. Lege zuvor aufgenommenen Container zuoberst ab („place“)
Dein Ursprungstapel hat:
  • Container 1
  • Container 2
  • Container...
1 & 2:
Nimm ein Container aus dem Ursprungsstapel wenn das Gewicht vom Kran getragen werden kann.
Java:
class Stapel

{

    private Container aktuellerContainer;

   

    public Container gebeAktuellenContainer()

    {

        return this.aktuellerContainer;

    }

}

class Kran
{
    private final double maxHeben;
   
    //...
   
   
    boolean kannContainerHeben(Container container)
    {
        return this.maxHeben >= container.gebeGewicht();
    }
}
Wenn nicht der Fall, tausche ersten Container gegen nächst liegenden aus, wiederhole die Prüfung.


3 & 4
Lege den Container, den Kran gerade transportiert, auf der ersten Stelle ab. Eine LinkedList bietet hier eine Methode mit dem Namen addFirst(E e) an. Man könnte jetzt die vorhandenen Strukturen nehmen oder aber auch eine eigene Lösung entwickeln.
 
mrBrown

mrBrown

mihe7

mihe7

Ich schätze mal mein Ansatz ist falsch,
Ja. Dein Kran muss lediglich
1. Positioniere Kran vor Ursprungsstapel
2. Entnehme obersten Container („pick“)
3. Positioniere Kran vor Zielstapel
4. Lege zuvor aufgenommenen Container zuoberst ab („place“)
unterstützen.

D. h.

12892

Dabei bewegt die Methode moveTo() den Kran zum angegebenen Stapel, pick() nimmt von dem Stapel, vor dem der Kran aktuell steht, den obersten Container und mit place() wird der Container, der gerade am Kran hängt, auf dem Stapel abgelegt, vor dem der Kran aktuell steht.
 
N

Noob1234_1234

Ja. Dein Kran muss lediglich

unterstützen.

D. h.

Anhang anzeigen 12892

Dabei bewegt die Methode moveTo() den Kran zum angegebenen Stapel, pick() nimmt von dem Stapel, vor dem der Kran aktuell steht, den obersten Container und mit place() wird der Container, der gerade am Kran hängt, auf dem Stapel abgelegt, vor dem der Kran aktuell steht.
Och man ich hab das alles doch schon die ganze vor mir. Ich hab alle Antworten 10000 durchgelesen, aber ich checke es nicht. Wie sieht die moveTo Methode bitte aus. Mir ist doch klar, dass sie zum jewiligen Stapel soll, aber ich hab keine Ahnung wie ich das umsetzen soll. Was kommt in die Klammer der Methode, wenn s kein int ist??? Leute bitte ich bin echt am verzweifeln und ich hänge an diesem Punkt seit gestern und es fehlt noch einiges.
 
N

Noob1234_1234

Ja. Dein Kran muss lediglich

unterstützen.

D. h.

Anhang anzeigen 12892

Dabei bewegt die Methode moveTo() den Kran zum angegebenen Stapel, pick() nimmt von dem Stapel, vor dem der Kran aktuell steht, den obersten Container und mit place() wird der Container, der gerade am Kran hängt, auf dem Stapel abgelegt, vor dem der Kran aktuell steht.
Hat dieses " s : Containerstack" eine spezielle Bedeutung ? Seh ich jetzt so zum ersten Mal, Kenn den Doppelpunkt nur von der for each Schleife
 
N

Noob1234_1234

Womit modelliert ihr denn? Das ist die normale UML-Schreibweise. Übersetzt in Java wäre das einfach ContainerStack s.
Ich kenn UML nicht. Uns wurde modellieren nicht so beigebracht.

Das kann so auch noch nicht stimmen, aber gehts jetzt in die richtige Richtung ?
Java:
public void moveTo(ContainerStack s) {
        s.getContainerStackID();
    }
 
N

Noob1234_1234

Oder so? Es muss ja einen Rückgabewert haben, sonst mach das ganze doch kein Sinn oder ?
Code:
public int moveTo(ContainerStack s) {
        return s.getContainerStackID();
    }
 
Thema: 

Modellierung, vererbung,

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben