# Überprüfungsmethode



## Ostkreuz (17. Dez 2022)

a)       Schreiben Sie einen Konstruktor für die Klasse Kaperfahrt, der ein *Ship* als Parameter entgegennimmt.

b)      Schreiben Sie eine Methode *public boolean klarZumAuslaufen()*. Die Methode gibt true zurück, wenn die Kaperfahrt ein Schiff zugewiesen bekommen hat, das Schiff einen Kapitän und einen Quartiermeister und mindestens 5 Piraten hat.

Hallo ich verstehe nicht ganz wie ich das jetzt überprüfen soll. Muss ich in der Methode ein neues Objekt Kaperfahrt erstellen und diesem ein Schiff zuweisen, welches ich dann überprüfen muss oder muss ich ein neues Objekt Kaperfahrt bereits als Parameter zur Methode hinzufügen?


----------



## LimDul (17. Dez 2022)

Die Methode soll in der Klasse Kaperfahrt geschrieben werden und keine parameter haben. Sieht man schon an der Signatur der Methode.

Ein Objekt sollst du da nicht erstellen - die Informationen sollten alle in der Klasse verfügbar sein


----------



## wer112 (17. Dez 2022)

Ostkreuz hat gesagt.:


> a)       Schreiben Sie einen Konstruktor für die Klasse Kaperfahrt, der ein *Ship* als Parameter entgegennimmt.
> 
> b)      Schreiben Sie eine Methode *public boolean klarZumAuslaufen()*. Die Methode gibt true zurück, wenn die Kaperfahrt ein Schiff zugewiesen bekommen hat, das Schiff einen Kapitän und einen Quartiermeister und mindestens 5 Piraten hat.
> 
> Hallo ich verstehe nicht ganz wie ich das jetzt überprüfen soll. Muss ich in der Methode ein neues Objekt Kaperfahrt erstellen und diesem ein Schiff zuweisen, welches ich dann überprüfen muss oder muss ich ein neues Objekt Kaperfahrt bereits als Parameter zur Methode hinzufügen?


Ich bin selber net gut in Programmieren und bin eher "Anfänger ca." aber ich habe da ne Idee. 
Ich persöhnlich würde erstmal die Methode aufrufen und die Variablen übergeben.
Danach würde ich eine mehrfach verschachtelte If Abfrage starten.

Und das Ergebniss per return wieder an den Aufrufer zurück geben und dann mit dem Ergebniss weiter arbeiten. 

das würde ich generell somachen. Mit Aufgabe a) würde ich es net wissen, (evtl. Strings Arrays und BaseAdapter...)


Aber hör lieber auf die anderen xD

Und jeder könnte mich berichtigen xD


----------



## mihe7 (17. Dez 2022)

wer112 hat gesagt.:


> Aber hör lieber auf die anderen xD


Es geht nicht um die anderen sondern um die Aufgabenstellung und die ist eindeutig:



> a)       Schreiben Sie einen Konstruktor für die Klasse Kaperfahrt, der ein *Ship* als Parameter entgegennimmt.



Da gibts es nichts zu rütteln: die Klasse Kaperfahrt soll einen Konstruktor bekommen, der ein Ship als Parameter erwartet. Heißt:

```
class Kaperfahrt {
    public Kaperfahrt(Ship someShip) { ... }
}
```
Ob der Konstruktor public sein soll oder nicht, ist im Text nicht angegeben.

Bei 


> b)      Schreiben Sie eine Methode *public boolean klarZumAuslaufen()*.


ist das nicht anders:

```
class Kaperfahrt {
    public Kaperfahrt(Ship someShip) { ... }
    public boolean klarZumAuslaufen() { ... }
}
```
Jetzt müssen noch geeignete Instanzvariablen hinzugefügt und die Code-Blöcke mit Inhalt gefüllt werden. 

Wie man sieht, bekommt der Konstruktor ein Ship, klarZumAuslaufen aber nichts übergeben. Logischerweise muss klarZumAuslaufen aber auf das Ship zugreifen können, folglich muss es eine Instanzvariable für das Schiff geben:


```
class Kaperfahrt {
    private Ship ship;
    public Kaperfahrt(Ship someShip) { 
        ship = someShip;  
    }
    public boolean klarZumAuslaufen() { ... }
}
```

Damit ist a) gelöst und in klarZumAuslaufen kann nun ship verwendet werden, um b) zu lösen.


----------



## wer112 (17. Dez 2022)

mihe7 hat gesagt.:


> Es geht nicht um die anderen sondern um die Aufgabenstellung und die ist eindeutig:


Ich meine, dass er nicht unbedingt auf mich hören muss, sondern auf die anderen Java Mitglieder, die besser sind als ich und gut programmieren können 


mihe7 hat gesagt.:


> Da gibts es nichts zu rütteln: die Klasse Kaperfahrt soll einen Konstruktor bekommen, der ein Ship als Parameter erwartet. Heißt:
> 
> ```
> class Kaperfahrt {
> ...


Und wie kann dann geprüft werden, ob das Schiff auslaufen darf oder nicht, wenn keine Daten vorhanden sind, die man übergeben kann, zum ermitteln?


----------



## mihe7 (17. Dez 2022)

wer112 hat gesagt.:


> Und wie kann dann geprüft werden, ob das Schiff auslaufen darf oder nicht, wenn keine Daten vorhanden sind, die man übergeben kann, zum ermitteln?


Auch das steht in der Aufgabe:


Ostkreuz hat gesagt.:


> Die Methode gibt true zurück, wenn die Kaperfahrt ein Schiff zugewiesen bekommen hat, das Schiff einen Kapitän und einen Quartiermeister und mindestens 5 Piraten hat.


Den ersten Teil kann man anhand der Beschreibung lösen (prüfe, ob ship == null gilt), für den Rest braucht man Informationen zur Klasse Ship aber grundsätzlich greift man eben über die Instanzvariable ship auf die Informationen des Schiffs zu.


----------



## Ostkreuz (18. Dez 2022)

mihe7 hat gesagt.:


> Auch das steht in der Aufgabe:
> 
> Den ersten Teil kann man anhand der Beschreibung lösen (prüfe, ob ship == null gilt), für den Rest braucht man Informationen zur Klasse Ship aber grundsätzlich greift man eben über die Instanzvariable ship auf die Informationen des Schiffs zu.


Danke erstmal die crew ist ein Array wie kann ich dort nun abfragen, ob die ersten 5 Piraten vorhanden sind?
In der Klasse ship sieht das Array so aus:

```
private Pirate[] crew = new Pirate[10];
```

und der Konstruktor der Klasse Pirat sieht so aus:

```
public Pirate(String firstName, String lastName, int yearOfBirth) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.yearOfBirth = yearOfBirth;
```


----------



## mihe7 (18. Dez 2022)

Ostkreuz hat gesagt.:


> Danke erstmal die crew ist ein Array wie kann ich dort nun abfragen, ob die ersten 5 Piraten vorhanden sind?


Ob das ein Array ist, ist für die Klasse Kaperfahrt erstmal egal. Die Frage ist: welche Methoden bietet denn die Klasse Ship an?


----------



## Ostkreuz (18. Dez 2022)

mihe7 hat gesagt.:


> Ob das ein Array ist, ist für die Klasse Kaperfahrt erstmal egal. Die Frage ist: welche Methoden bietet denn die Klasse Ship an?


Setter für alle Attribute und einmal 

```
public void addPirate(Pirate pirate) {
        for (int i = 0; i < this.crew.length; i++) {
            if (crew[i] == null) {
                crew[i] = pirate;
                break;
            }
        }
    }
```
und 

```
public void deletePirate(String firstName, String lastName) {
        for (int i = 0; i < this.crew.length; i++) {
            Pirate pirate = crew[i];
            if (pirate.getFirstName().equals(firstName) && pirate.getLastName().equals(lastName)) {
                crew[i] = null;
                break;
```


----------



## mihe7 (18. Dez 2022)

Dann spendierst Du Ship noch eine Methode, die die Anzahl an Piraten zurückgibt. Dann kannst Du das abprüfen.


----------



## Ostkreuz (18. Dez 2022)

mihe7 hat gesagt.:


> Dann spendierst Du Ship noch eine Methode, die die Anzahl an Piraten zurückgibt. Dann kannst Du das abprüfen.




```
public int countPirate() {
        int counter = 0;
            for (int i = 0; i < crew.length; i ++) {
                if (crew[i] != null)
                    counter ++; 
            }

          return counter; 
    }
```
Wenn das so richtig ist wie soll ich die denn jetzt einsetzen und durch if überprüfen?


----------



## Ostkreuz (18. Dez 2022)

```
public boolean klarZumAuslaufen() {
        if (ship != null) {
        if (ship.getCaptain() != null && ship.getQuartermaster() != null) {
        if (ship.countPirate() >= 5) {
                
            }
            }
            
        }
        return true;
    }
```

Wenn ich es so versuche kommt bei der Kontrolle immer noch 0 Punkte


----------



## mihe7 (18. Dez 2022)

Das gibt ja auch keinen Sinn, schon weil Du nie false zurückgibst.


----------



## KonradN (18. Dez 2022)

Bei sowas doch einfach immer genau vorstellen, wie man bei sowas vorgehen würde.

Du hast eine Checkliste und die willst Du durchgehen - dabei interessiert Dich nur, ob alle punkte erfüllt sind oder nicht.

Da geht man doch einfach die Liste durch. Wenn man einen Punkt findet, der nicht ok ist, dann weiss man: Die Checkliste ist nicht erfüllt.
Wenn man durch die Liste durch ist und hat kein Element gefunden, das nicht erfüllt gewesen wäre, dann weiss man: Die Checkliste ist erfüllt.

Daher das, was ich eigentlich immer wieder schreibe: Überlege es Dir in Worten. Stell Dir vor, die Objekte wären Lebewesen. Da kann man dann Fragen stellen:


Habe ich ich Schiff? -> Nein? -> nicht bereit zum auslaufen.
Hey Schiff! Hast Du ein Captain? -> Nein? nicht bereit zum auslaufen.
...
Liste durch? -> Bereit zum auslaufen.

Also nicht erst versuchen, sich das abstrakt als Code vorzustellen. Das kann so gut funktionieren mit den Objekten. Und das hilft übrigens auch beim Design, denn es gibt Zuständigkeiten und all sowas ...


Edit: Bei einem Return hat er abgeschickt ... keine Ahnung, was ich da gedrückt habe ....
Edit2 : Command Enter schickt ab ... jetzt habe ich es noch einmal ausprobiert gehabt


----------



## Ostkreuz (18. Dez 2022)

KonradN hat gesagt.:


> Bei sowas doch einfach immer genau vorstellen, wie man bei sowas vorgehen würde.
> 
> Du hast eine Checkliste und die willst Du durchgehen - dabei interessiert Dich nur, ob alle punkte erfüllt sind oder nicht.
> 
> ...


Aber wie überprüfe ich das den bei den ersten 5 Stellen eines Arrays?


----------



## temi (18. Dez 2022)

Ostkreuz hat gesagt.:


> Aber wie überprüfe ich das den bei den ersten 5 Stellen eines Arrays?


Für das Array mit der Mannschaft hast du doch oben schon eine Lösung. Was Konrad meinte ist die Punkte einzeln "abzuhaken".


```
public boolean klarZumAuslaufen() {
  
        if (ship == null) { return false; } // kein Schiff, dann nicht auslaufen
       
        // weitere Punkte der Liste...
       
        return true; // alles erledigt
}
```

Diese Technik nennt man auch "early return", weil man die Methode vorzeitig beendet, in dem Fall, wenn eine wichtige Bedingung nicht erfüllt ist.


----------

