Dateneingabe

MrDramasetter

Mitglied
Guten Tag,
ich habe vor kurzem einen Thread im Forum geöffnet bei dem es um eine Idee ging, die ich inzwischen zu teilen umgesetzt habe. Bevor ich weiter programmiere würde ich gerne von euch hören wie ihr meinen bisher fertigen Code beurteilt und ob ihr noch Anregungen habt?

Code:
public class Person {

    private int aktuellesJahr;
    private int aktuellerMonat;
    private int tatsaechlichesAlter;
    private int geburtsjahr;
    private int geburtsmonat;
    private String geschlecht;
    private String vorname;
    private String nachname;

    public int getAktuellesJahr() {
        return aktuellesJahr;
    }

    public void setAktuellesJahr(int aktuellesJahr) {
        this.aktuellesJahr = aktuellesJahr;
    }

    public int getAktuellerMonat() {
        return aktuellerMonat;
    }

    public void setAktuellerMonat(int aktuellerMonat) {
        this.aktuellerMonat = aktuellerMonat;
    }

    public int getTatsaechlichesAlter() {
        return tatsaechlichesAlter;
    }

    public void setTatsaechlichesAlter(int tatsaechlichesAlter) {
        this.tatsaechlichesAlter = tatsaechlichesAlter;
    }

    public int getGeburtsjahr() {
        return geburtsjahr;
    }

    public void setGeburtsjahr(int geburtsjahr) {
        this.geburtsjahr = geburtsjahr;
    }

    public int getGeburtsmonat() {
        return geburtsmonat;
    }

    public void setGeburtsmonat(int geburtsmonat) {
        this.geburtsmonat = geburtsmonat;
    }

    public String getGeschlecht() {
        return geschlecht;
    }

    public void setGeschlecht(String geschlecht) {
        this.geschlecht = geschlecht;
    }

    public String getVorname() {
        return vorname;
    }

    public void setVorname(String vorname) {
        this.vorname = vorname;
    }

    public String getNachname() {
        return nachname;
    }

    public void setNachname(String nachname) {
        this.nachname = nachname;
    } 

}

Code:
import java.util.Calendar;
import java.util.GregorianCalendar;
import javax.swing.JOptionPane;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

public class InputUi {

    private Person person;

    public InputUi() {
        this.person = new Person();
    }

    public void alterErfassen() {
        person.setAktuellesJahr(new GregorianCalendar().get(Calendar.YEAR));
        person.setAktuellerMonat(Calendar.MONTH);
        person.setGeburtsjahr(Integer.parseInt(JOptionPane.showInputDialog("Geben Sie ihr Geburtsjahr ein")));
        person.setGeburtsmonat(Integer.parseInt(JOptionPane.showInputDialog("Geben Sie ihren Geburtsmonat ein")));
        person.setTatsaechlichesAlter(person.getAktuellesJahr() - person.getGeburtsjahr());
        if (person.getGeburtsmonat() > person.getAktuellerMonat()) {
            person.setTatsaechlichesAlter(person.getTatsaechlichesAlter() - 1);
        } else {
            person.setTatsaechlichesAlter(person.getTatsaechlichesAlter());
        }
    }

    public void geschlechtErfassen() {
        person.setGeschlecht(JOptionPane.showInputDialog("Sind Sie männlich oder weiblich?"));
        if (person.getGeschlecht().equals("männlich")) {
            person.setGeschlecht("Herr");
        } else {
            person.setGeschlecht("Frau");
        }
    }

    public void namenErfassen() {
        person.setVorname(JOptionPane.showInputDialog("Geben Sie Ihren Vornamen ein"));
        person.setNachname(JOptionPane.showInputDialog("Geben Sie Ihren Nachnamen ein"));
    }

    public boolean richtigkeitDaten() {
        int richtig = JOptionPane.showConfirmDialog(null,
                "Bitte überprüfen Sie die folgenden Angaben. Sie sind: \n" + "Herr " + person.getVorname() + " "
                        + person.getNachname() + " " + person.getTatsaechlichesAlter() + " Jahre alt?");
        if (richtig == JOptionPane.YES_OPTION) {
            return true;
        } else {
            return false;
        }
    }

    public void datenInDatei() throws IOException {
        String pfadangabe = JOptionPane.showInputDialog("Geben sie den Pfad zum Speicherort ein");
        File datei = new File(pfadangabe);
        datei.createNewFile();
        FileWriter schreiber = new FileWriter(pfadangabe);
        schreiber.write("Alter: " + person.getTatsaechlichesAlter() + "Anrede: " + person.getGeschlecht() + " Vorname: "
                + person.getVorname() + " Nachname: " + person.getNachname());
        schreiber.flush();
        schreiber.close();

    }
}

Code:
import java.io.IOException;

public class DataSheet {

    public static void main(String[] args) throws IOException {

        InputUi person1 = new InputUi();

        person1.alterErfassen();
        person1.geschlechtErfassen();
        person1.namenErfassen();

        if (person1.richtigkeitDaten() == true) {
            person1.datenInDatei();
        } else {
            System.out.println("Fehler");
            System.exit(0);
        }
    }
}

Kurze Erklärung: Die Klasse Person verwaltet die entsprechenden Attribute, die von den Methoden der Klasse InputUi genutzt werden um ein paar Eckdaten über eine Person zu erfassen. Aufgerufen werden die Methoden letztendlich in der Klasse DataSheet.

Ich bin gespannt auf eure Antworten
Viele Grüße
 

Jardcore

Top Contributor
Java hat eine LocalDate Klasse, die ein Datum repräsentiert und einige Komfort-Features anbietet.
Die Attribute für aktuellesWhatEver und tatsaechlichesAlter usw. sind keine gut gewählten Attribute.
Besser wäre hier Methoden zu verwenden, die dir helfen die Daten zu bekommen. z.B: getAlter();
Das gleiche kann man mit den anderen Informationen machen, wenn man sie denn braucht.

Java:
public class Person {
    private LocalDate geburtstag;
    private String geschlecht;
    private String vorname;
    private String nachname;

    // Gibt das Alter zurück indem es den Geburtstag mit Heute vergleicht und die vergangenen Jahre zurückgibt.
    public int getAlter() {
        return LocalDate.now().compareTo(geburtstag);
    }

    public void setGeburtstag(LocalDate geburtstag) {
        this.geburtstag = geburtstag;
    }

Den rufst du dann wie folgt auf:
Java:
person.setGeburtstag(LocalDate.of(2017, 5, 17));

Das erstmal nur zur Personen Klasse.
 

MBadzura

Mitglied
Was definitiv noch abgeht, ist das abfangen von falschen Eingaben, wie z. B. beim Geburtsmonat. Wenn ich als Anwender Januar eingebe, was mein Geburtsmonat ist, macht Dein Programm Feierabend xD.

Was auffällt ist, dass das tatsächliche Alter falsch ist. Wenn der Geburtstag Anfang des Monats ist und der Anwender Mitte des Monats seine Daten eingibt, dann kann er nicht ruhigen Gewissens sagen, dass alles richtig ist, da das falsche Alter in diesem Falle angezeigt wird.

Ich persönlich würde das tatsächliche Alter gar nicht speichern, da dieses sich a) aus aktuellen Datum und Geburtsdatum errechnet und b) sich somit immer ändert.

Weiterhin wäre zu überlegen, ob du nicht die mit 1.8 eingeführte Klasse LocalDate verwendest. Ich finde das Arbeiten mit dieser Klasse angenehmer, als mit der Klasse GregorianCalendar.

Grob gesagt ist es aber immer abhängig von den eigenen Interessen, was du mit dem Programm verwirklichen möchtest, von daher kann ich nur sagen, was ich an dem bestehenden Gerüst anders machen würde, da ich deine Absicht hinter dem Programm nicht kenne.
 

Jardcore

Top Contributor
So nochmal ausführlicher. Deine UI Klasse ist etwas Missverstäntlich, aber ich versuche mal deine Stil zu behalten aber ein paar Kniffe einzubringen.

MBadzura hat natürlich recht, dass das Abfangen von Falscheingaben noch gemacht werden muss, aber ich würde sagen vom Lernstandpunkt aus ist das erstmal zweitrangig.

Zuerst einmal kannst du mithilfe eines Enums tolle Sachen machen, wie zum Beispiel das Geschlecht realisieren.
Java:
public enum Gender {
    MAN("Männlich", "Herr"),
    WOMAN("Weiblich", "Frau");
 
    private String name;
    private String title;
 
    Gender(String name, String title) {
        this.name = name;
        this.title = title;
    }
 
    public String getName() {
        return name;
    }
 
    public String getTitle() {
        return title;
    }
}

Die Person Klasse wird noch etwas erweitert und ein Bug gefixt, den ich oben eingebaut hab. Person benutzt nun das Enum Gender (Geschlecht)
Java:
public class Person {
    private LocalDate dayOfBirth;
    private String firstname;
    private String lastname;
    private Gender gender;

    public void setDayOfBirth(LocalDate dayOfBirth) {
        this.dayOfBirth = dayOfBirth;
    }
 
    public LocalDate getDayOfBirth() {
        return dayOfBirth;
    }
 
    public void setFirstname(String firstname) {
        this.firstname = firstname;
    }
 
    public String getFirstname() {
        return firstname;
    }
 
    public void setLastname(String lastname) {
        this.lastname = lastname;
    }
 
    public String getLastname() {
        return lastname;
    }
 
    public void setGender(Gender gender) {
        this.gender = gender;
    }
 
    public Gender getGender() {
        return gender;
    }
 
    public int getAge() {
        return Period.between(dayOfBirth, LocalDate.now()).getYears();
    }
 
    @Override
    public String toString() {
        return "Anrede: " + getGender().getTitle()
            + " Vorname: " + firstname
            + " Nachname: " + lastname
            + " Alter: " + getAge();
          
    }
}

Deine InputKlasse habe ich etwas ummodelliert und umbenannt
Java:
public class PersonInputSheet {

    private Person person;
 
    public PersonInputSheet() {
        this.person = new Person();
    }
 
    public void askForFirstAndLastname() {
        person.setFirstname(askQuestion("Geben Sie Ihren Vornamen ein"));
        person.setLastname(askQuestion("Geben Sie Ihren Nachnamen ein"));
    }
 
    public void askForDateOfBirth() {
        int year = Integer.parseInt(askQuestion("Geben Sie das Jahr Ihrer Geburt an"));
        int month = Integer.parseInt(askQuestion("Geben Sie den Monat Ihrer Geburt an"));
        int dayOfMonth = Integer.parseInt(askQuestion("Geben Sie den Tag Ihrer Geburt an"));
  
        person.setDayOfBirth(LocalDate.of(year, month, dayOfMonth));
    }
 
    public void askForGender() {
        Object[] options = {
                Gender.MAN.getName(),
                Gender.WOMAN.getName()
            };
  
        int selected = JOptionPane.showOptionDialog(
                null,
                "Welches Geschlecht besitzen Sie?",
                "Geschlecht",
                JOptionPane.DEFAULT_OPTION,
                JOptionPane.QUESTION_MESSAGE,
                null,
                options,
                options[0]);
  
        person.setGender(Gender.values()[selected]);
    }
 
    public void writePersonToFile() {
        // Hier Logik zum Schreiben in die Datei
    }
 
    private String askQuestion(String question) {
        return JOptionPane.showInputDialog(question);
    }
}

Zu guter Letzt musst du nur noch folgendes in der Main ausführen.
Java:
        PersonInputSheet sheet = new PersonInputSheet();
  
        sheet.askForFirstAndLastname();
        sheet.askForDateOfBirth();
        sheet.askForGender();
        sheet.writePersonToFile();

Achja durch das verwenden der toString() Methode in Person kannst du in der writePersonToFile() Methode deinen Code etwas vereinfachen, nämlich in:
Java:
    public void writePersonToFile() throws IOException {
        JFileChooser fileChooser = new JFileChooser();
        fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
      
        if(fileChooser.showSaveDialog(null) == JFileChooser.APPROVE_OPTION) {
            FileWriter writer = new FileWriter(fileChooser.getSelectedFile());
            writer.write(person.toString());
            writer.flush();
            writer.close();
        }
    }
 
Zuletzt bearbeitet:

BadBat

Aktives Mitglied
Mal ne blöde Frage in die Runde. Wieso die attr private machen wenn es getter und setter gibt? Ne frage der Konvention?

Und wieso setter für Geburtsjahr. Ein Mensch wird einmal geboren dann ist sense... das kann sich ja nicht mehr ändern.
 

Meniskusschaden

Top Contributor

Thallius

Top Contributor
Mal ne blöde Frage in die Runde. Wieso die attr private machen wenn es getter und setter gibt? Ne frage der Konvention?
.

Anders herum wird doch wohl ein Schuh draus. Wieso Setter und Getter für Public Attribute schreiben? Das Ist ja wohl ziemlich sinnlos undführt in den meisten Fällen sogar zu üblen Fehlern, wenn man z.b. Spezielle Setter oder Getter schreibt und dann an einer Stelle mal vergisst den zu nehmen und statt dessen direkt auf die Variable zugreift.
 

MrDramasetter

Mitglied
Guten Abend,
ich danke euch für den ganzen Input und vorallem die Mühe hier einen gesamten Entwurf zu posten! Ich werde mich die nächsten Tage wieder dran machen einige der Vorschläge umzusetzen, um mich darauf mit neuen Ideen bei euch zu melden :)
Viele Grüße
 

Neue Themen


Oben