# Java OOP



## Buroto (14. Dez 2022)

Hallo zusammen,
habe die folgendes aufgabe  von Azubi Betrieb gekriegt
Es soll zu der gegebenen ISBN2.txt ein passendes Klassenmodell erstellt werden.

Gegeben ist eine Text Datei <ISBN2.txt> mit ISBN Nummern, Autor(en), Titel und Erscheinungsdatum.

Die einzelnen Einträge sind Komma separiert.

Die einzelnen Zeilen sollen ausgelesen werden und in das Klassenmodell übertragen werden.

Bsp.:

Carmen,Korn, Zeiten des Aufbruchs, 23.06.2017,9783499272141

Hendrikje, Balsmeyer,Peter, Maffay,Anouk dein nächstes Abenteuer ruft!,30.08.2022,978-3-8458-5078-8

Es gibt mindestens 5 Einträge pro Buch.

Gibt es mehr Einträge, ist davon auszugehen, dass es mehrere Autoren gibt.



Zu beachten:

· Der Pfad zu der Datei wird als Parameter über die Kommandozeile eingegeben

· Das Programm darf nicht mit einer Exception beendet werden

· Die Ausgabe ist folgendermaßen:

o Laufende Nummer

o <TAB>Nachname: <Eintrag aus der Datei>

o <TAB>Name: <Eintrag aus der Datei>

o <TAB>Titel: <Eintrag aus der Datei>

o <TAB>Datum: <Eintrag aus der Datei> im Format Bsp.: 01.01.2018 ist auszugeben als 01. Januar 2018

o <TAB>ISBN: <Eintrag aus der Datei>

· Im Fehlerfall sollten sinnige Ausgaben angezeigt werden

· Eine fehlerhafte Zeile aus der zu bearbeitenden Datei, ist nicht zu übertragen.

ich habe die folgendes Programm geschrieben aber etwas stimmt nicht und komme nicht zu weit 
krieg immer einen Fehler 


```
public class Author {
    String name , nachname;

    public Author(String name, String nachname) {
        this.name = name;
        this.nachname = nachname;
    }
}

public class Book {
    ArrayList<Author> author;
    String titel, isbn;
    Date date;

    public String getTitel() {
        return titel;
    }

    public void setTitel(String titel) {
//        if (bookArrayList.length % 2 != 0) {
//            while (file.hasNext()) {
//                bookArrayList = file.nextLine().split(",");
//                titel = bookArrayList[bookArrayList.length - 3];
        this.titel = titel;
    }

    public Date getDate() {
        return date;
    }

    public void setDate(Date date) {

        this.date = date;
    }

    public String getIsbn() {
        return isbn;
    }

    public void setIsbn(String isbn) {
        this.isbn = isbn;
    }

    public Book(ArrayList<Author> author, String titel, Date date, String isbn) {
        this.author = author;
        this.titel = titel;
        this.date = date;
        this.isbn = isbn;
    }
}

import java.io.File;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Locale;
import java.util.Scanner;

public class Main {
    public static Scanner scan = null;
    private static String[] authorsArray;
    private static String[] bookArray;
    static Date date;

    public static void main(String[] args) {

        try{
            File file = new File(args[0]);
            System.out.println("is the readable file is valid ? "+file.isFile());
            Scanner scan = null;
            //read file and call the build-in methode
            scan = new Scanner(file);

            // test Authors implementation

            addAuthor(scan);


            // in case of any failure
        }
        catch (Exception e) {
            System.out.println("file not valid ");
            System.exit(-1);
        }
    }

    public static void  addAuthor ( Scanner file) {
        authorsArray = file.nextLine().split(",");
        ArrayList<Author> authorArrayList = new ArrayList<>();
        int linecount = 1;
        while (file.hasNextLine()) {
            for (int i = 0 ; i < authorsArray.length - 3 ; i++) {
                int nameindex = 0;
                int nachnameindex;
                nachnameindex = (nameindex) + 1;
                authorArrayList.add(new Author(
                        authorsArray[nameindex], authorsArray[nachnameindex]
                ));
            }
        }
    }

    private static void showBookData(Scanner file) {
        // input Date 1formater
            bookArray=file.nextLine().split(",");
         SimpleDateFormat formatter = new SimpleDateFormat("dd.MM.yyyy", Locale.ENGLISH);
        //output formatter
        SimpleDateFormat formatter2 = new SimpleDateFormat("dd.MMMMM yyyy", Locale.GERMAN);
        // variable where you store the array index as String to re conver it // (( not necessary can be done directly))
        String dateInString = "";
        int lineCount=1;
                while (file.hasNextLine()){
                    System.out.println(lineCount);
                    String[] Bookoutput = file.next().split(",");
                    bookArray = file.nextLine().split(",");
                    dateInString = bookArray[bookArray.length-2];
                    // prevent Parsing fails
                    try {
                        date = formatter.parse(dateInString);
                    } catch (ParseException e) {
                    }
                    if (bookArray != null) {
                        addAuthor(file);
                        System.out.println("\t" + " Nachname : " + authorsArray[1]);
                        System.out.println("\t" + " Name : " + authorsArray[0]);
                        System.out.println("\t" + " Titel : " + bookArray[bookArray.length-3]);
                        System.out.println("\t" + " Datum  : " + (formatter2.format(date)));
                        System.out.println("\t" + " ISBN  : " + bookArray[bookArray.length-1]);
                    }
                    ++lineCount;
                }

        }
}
```

bitte um helfe !!


----------



## KonradN (14. Dez 2022)

Ich muss Dir leider mitteilen, dass das Zaubereiministerium untersagt hat, dass wir unsere Glaskugeln nutzen um euch Muggel zu helfen. Ich bitte da um Dein Verständnis: Niemand von uns Zauberern möchte nach Akzaban nur wegen so einer Java Aufgabe! 

Daher ist es leider zwingend notwendig, dass Du uns konkrete Informationen gibst.

Du bekommst einen Fehler: Ja was für ein Fehler denn? Ohne Glaskugel wissen wir das nicht!
Etwa stimmt nicht - ja, was denn? Was passiert? Was soll passieren? Wie gesagt: Ohne Glaskugel wissen wir das schlicht nicht!


Ansonsten:

Du solltest auf die Bezeichner achten. Die Liste mit Author Elementen wird prinzipiell mehrere Autoren beinhalten können, daher wäre da der Plural richtig: authors.
Du solltest Dinge validieren statt in eine Exception zu rennen, die Du dann fängst. Und man fängt nicht "Exception" sondern nur konkrete Exceptions. Und gewisse Exceptions heißen ins Deutsche übersetzt: EntwicklerIstZuDoofException - diese werden nicht gefangen sondern vermieden! Beispiele sind die NullPointerException (Prüfen ob etwas null ist) und die IndexOutOfBoundsException (Sicher stellen, dass der Index gültig ist!)
Eine Exception zu fangen und dann einfach die Exception zu ignorieren ist eigentlich immer ein Zeichen für einen Programmierfehler!
Static Variablen sind immer schlecht - sollten vermieden werden. Arbeite mit Instanzen von deinen Klassen!


*Aber das eigentliche Problem ist natürlich:*
Dann ist die Logik extrem wirr - Du hast eine Methode, in der Du Zeile für Zeile durch die Datei gehst - Du liest also eine Zeile. Und dann übergibst Du diesen Scanner an eine andere Methode? In der liest Du dann die nächste Zeile? Wenn pro Zeile ein Buch ist, dann würdest Du also die Autoren der ersten Zeile ignorieren und dann die nächste Zeile als Autoren für das erste Buch nehmen?
Davon abgesehen: Du hast eine globale Variable, die Du dann dort füllen lässt um diese dann im Anschluss zu nutzen? Das ist extremst verwirrender Code. So schreibt man keinen Code!

Strukturiere es sauber! Dann hast Du eine Klasse, die so Dateien liest. BookImporter oder wie auch immer Du dies nennst. Da kannst Du dann eine neue Instanz von erzeugen und da ist dann ein Methode, der eine Datei einliest und eine List<Book> zurück gibt.

Book kann dann so eine Entity sein. Diese Entity mag eine Methode haben "fromCsvString" oder die Methode ist separat (eine eigene BookCsvImporter Klasse oder von mir aus die BookImporter Klasse ... egal wo, das kannst Du Dir überlegen. Wenn einfache POJOs gewünscht sind, dann kommt es nicht in die Entity.
Auf jeden Fall hast Du einen Aufbau a.la:

DateiEinlesen:

neue Liste erzeugen
für jede Zeile:
--> Neue Book Instanz aus der Zeile erzeugen
--> Neue Instanz zu Liste hinzufügen
- Liste zurück geben

Das ist der Code ... die Schritte werden, so sie nicht einfache Java Befehle sind, Methoden.

Es kann dann also eine Methode geben für:
Neue Book Instanz aus der Zeile erzeugen
-> da ist aber klar: Es wird eine Zeile übergeben und es kommt ein Book zurück. Nichts anderes. Woher die Zeile kommt, ist schlicht egal!

Und dann arbeite mit Unit Tests. Ich habe verstanden, dass Du ein Azubi bist, dass Du das mit der Software Entwicklung also beruflich machen willst. Da ist das ein absolutes muss. Klar, am Anfang werden die nicht schön sein, aber gewöhn es Dir von Anfang an an! Das kann ich nicht gar nicht stark genug betonen!

Und dann hast Du ein Bottom Up Ansatz: 
Es ist klar, dass es eZeile Text gibt und aus der wird ein Book gemacht. Das ist eine Methode und die kann man testen.

Dann hast Du also diverse Zeilen für die Tests und der Test macht dann nur:

Methode aufrufen mit der jeweiligen Zeile
Dann die book Elemente prüfen, dass diese richtig sind.

Wenn Du beim Bau der methode merkst: Ich brauche eine Methode, die eine List<Author> erzeugt aus irgendwas: Dann bau dafür auch so Tests. 

Wenn Du das etwas probierst, dann wirst Du merken, dass dies nicht wirklich schwer ist! Kompliziert wird es zwar mit der Zeit auch, wenn dann Mocking und so dazu kommt, aber das ist erst einmal egal. Denn das kannst Du dann nach und nach erarbeiten. Mit etwas Glück mit einem erfahrenen Entwickler, der Dir nach und nach so Dinge zeigt.


----------



## AndiE (18. Dez 2022)

Erstmal würde ich ergänzend sagen, dass du das Klassenmodell ausformulieren solltest. Du brauchst auf jeden Fall eine Klasse "BookItems", die eine Anzahl "Books" abspeichert. Jedes "Book" kann mehrere Einträge von "Author" enthalten.

In der Methode "addAuthor" der Klasse "Main" ist ein Indizierungsfehler vorhanden. Wenn du 5 Werte übergeben bekommst, dann werden die mit 0 bis 4 indiziert. Bei 5 Werten sind also in Indizes 0 und 1 der Nach und Vorname des Autors. Bei 7 also die werte 0 und1 für den 1. und 2 und 3 für den 2. 

Ich würde die Methoden auch nicht "static" deklarieren.

Ansonsten ist es neben den angeführten Tests auch immer sinnvoll sich die übergebenen Werte anzusehen. In diesem Falle z.B., was gibt 
"authorsArray = file.nextLine().split(",");"
genau zurück? Was steht in "authorsArray" genau drin?


----------

