schönes Programmieren: Validierungen

minzee

Bekanntes Mitglied
Hi :)

Ich hatte heute ein interessantes Buch in der Hand. Es ging darum, wie man schön Programmiert. Leider war das alles nur ziemlich theorietisch.

Wie würdet ihr z. B. Validierungen programmieren?

Ein Datum data könnte einer Klasse C zugeordnet sein:
Java:
public class C
{
   private int data;
   
   public static boolean isValidData(int data)
   {
      return data >= 0;
   }
   public void setData(int data) throws Exception
   {
      if(!isValidData(data))
      {
         throws new Exception("data");
      }
      this.data = data;
   }
   public int getData()
   {
      return data;
   }
}
Die Daten könnten aus unterschiedlichsten Datenquellen stammen. Z. B. aus einem Formular:
Java:
public class Form
{
   const int VALID = 0;
   const int INVALID = 1;
   const int NOT_A_NUMBER = 2;
   const int EMPTY = 3;
   
   public boolean isValidData(string stringData)
   {
      if(stringData == "") 
      {
         return EMPTY; // Pflichtfeld im Formular
      }
      try
      {
         int intData = Integer.parseInt(stringData);
         return C.isValidData(intData) ? VALID : INVALID;
      }
      catch(NumberFormatException e)
      {
         return NOT_A_NUMBER;
      }
   }
}

Würdet ihr das auf diese Weise programmieren?
 

minzee

Bekanntes Mitglied
Exceptions darf man nur werfen, wenn ein Ausnahmefall eintritt. Das ist beim Ausfüllen von Formularen nicht gegeben. Es ist kein Ausnahmefall, wenn ein User ein Pflichtfeld nicht ausfüllt.
 

Agaton Sax

Mitglied
Meine Antwort bezog sich auf das Datenobjekt und die Argumentvalidierung innerhalb des Setters. Nicht auf irgendwelche Formular-Validierungen die obendrüber liegen.
 

minzee

Bekanntes Mitglied
OK :)

Wie würde dann bei dir das Programm aussehen? Muss nicht funktionieren, kann ruhig Syntaxfehler beinhalten. Geht nur ums Prinzip.
 
Zuletzt bearbeitet:

Agaton Sax

Mitglied
Java:
public void setData(int data) {
    Preconditions.checkArgument(data >= 0, "data must not be negative");
    this.data = data;
}
bzw. händisch:
Java:
public void setData(int data) {
    if (data < 0) {
        throw new IllegalArgumentException("data must not be negative");
    }
    this.data = data;
}
 

Saheeda

Top Contributor
@Agaton Sax

Vielleicht auch mehr n philosophisches Problem:
Hier im Forum habe ich schon häufiger den Satz gelesen: "Exceptions sollten nicht der Programmsteuerung dienen."
Wäre zur Validierung da nicht z.B. ein boolscher Wert besser?

Sollten Exceptions nicht nur geworfen werden, wenn wirklich schwerwiegende Probleme (Daten nicht gefunden, Pfade falsch, Verbindung unterbrochen) auftreten? N negatives Alter z.B. ist zwar doof, würde ich aber nicht als schwerwiegendes Problem bezeichnen.
 

minzee

Bekanntes Mitglied
Wenn etwas passiert, was nicht passieren soll, obwohl man entsprechende Prüfmöglichkeiten anbietet, dann sollte meiner Meinung nach eine Exception geworfen werden. In der Raumfahrt könnte so ein Fehler fürchterliche Auswirkungen haben. Womöglich würde eine Raumsonde dann in die entgegengesetzte Richtung fliegen :)
 

Thallius

Top Contributor
Wenn etwas passiert, was nicht passieren soll, obwohl man entsprechende Prüfmöglichkeiten anbietet, dann sollte meiner Meinung nach eine Exception geworfen werden. In der Raumfahrt könnte so ein Fehler fürchterliche Auswirkungen haben. Womöglich würde eine Raumsonde dann in die entgegengesetzte Richtung fliegen :)

Na da ist es natürlich super wenn die Software der Raumsonde eine Exception wirft und mit einem stacktrace aussteigt.
Also eine dümmeres Beispiel gibt es wohl kaum.

Eine Exception sollte wirklich nur dann geworfen werden wenn es keine Möglichkeit gibt den Fehler abzufangen. Wenn der User etwas falsches eingibt, dann ist das keine Exception sondern dann kann man den User darüber informieren und auffordern das richtige einzugeben und das solange bis er das auch tut.

Genauso kann man viele Fehler mit einer Vernünftigen fehlerbehandlung abfangen. Dafür muss man sich aber Gedanken machen und u.u. Viel Code schreiben. DaZu sind die meisten schlicht und einfach zu faul. Eine Exception zu werfen ist ja viel einfacher und. Der User kann ja die Software einfach neu starten nach dem Crash. Wen interessierte.

Gruß

Claus
 

Agaton Sax

Mitglied
@Agaton Sax

Vielleicht auch mehr n philosophisches Problem:
Hier im Forum habe ich schon häufiger den Satz gelesen: "Exceptions sollten nicht der Programmsteuerung dienen."
Wäre zur Validierung da nicht z.B. ein boolscher Wert besser?
Von Fluent Interfaces abgesehen haben Setter im Normalfall keinen Rückgabewert. Ich sehe da auch keinen Missbrauch als Programmsteuerung, sondern es ist nun mal das etablierte Vorgehen bei Settern, die reingegebenen Daten zu überprüfen und nicht stillschweigend nichts zu tun oder gar den Objektzustand zu korrumpieren. Der Aufrufer sollte eher dafür sorgen, dass er keinen offensichtlichen Müll in den Setter reingibt. Und genau da kommt die von dir genannte Validierung ins Spiel. Aber eben zwischen Nutzereingabe und möglichem Aufruf des Setters, und nicht erst im Setter.
 
Zuletzt bearbeitet:

minzee

Bekanntes Mitglied
isValidData von Form sollte man noch umbenennen. Es liefert kein boolean wie die gleichnamige Methode in C, sondern einen int-Code. Also ist vielleicht validateData besser.
 

Java20134

Bekanntes Mitglied
Zur ersten Antwort:
Es ist schon richtig, dass man die Libs benutzt. Ich finde es aber ziemlich sinnvoll, die Libs auch mal teilweise selbst zuschreiben, um zu sehen, was da überhaupt passiert!
 

minzee

Bekanntes Mitglied
Ich glaube, das ist noch nicht schön programmiert. Momentan schaut es folgendermaßen aus:
Java:
/**
 * Model-Klasse.
 * Nimmt ein Datum auf, das zuvor validiert werden muss.
 * Sollte ein invalides Datum übergeben werden, wird eine Exception geworfen.
 * Zum Validieren wird eine statische Methode bereitgestellt.
 */
public class C
{
   private int data;
   
   /**
    * Prüft die Gültigkeit des Datums.
    * @param int data
    * @throws IllegalArgumentException
    */
   public static boolean isValidData(int data)
   {
      return data >= 0;
   }
   /**
    * Setzt das Datum.
    * @param int data
    * @throws IllegalArgumentException
    */
   public void setData(int data) throws IllegalArgumentException
   {
      if(!isValidData(data))
      {
         throw new IllegalArgumentException("data");
      }
      this.data = data;
   }
   /**
    * Gibt das Datum zurück.
    * @param int
    */
   public int getData()
   {
      return data;
   }
}
Java:
/**
 * Müssen alle Klassen implementieren, die ein DAtum validieren.
 */
public interface Source
{
   public static final int VALID = 0;
   public static final int INVALID = 1;
   public static final int NOT_A_NUMBER = 2;
   public static final int EMPTY = 3;
   
   public int validateData(String stringData);
}
Java:
/**
 * Formular-Klasse.
 */
public class Form implements Source
{
   /**
    * Prüft, ob im Formular ein gültiges Datum eingegeben wurde.
    * @param String stringData
    * @return int Ergebnis der Prüfung.
    */
   public int validateData(String stringData)
   {
      if(stringData == "") 
      {
         return EMPTY;
      }
      try
      {
         int intData = Integer.parseInt(stringData);
         return C.isValidData(intData) ? VALID : INVALID;
      }
      catch(NumberFormatException e)
      {
         return NOT_A_NUMBER;
      }
   }
}
Java:
public class Main
{
   public static void main(String[] args)
   {
      String data = "123"; 
      
      Form form = new Form();
      switch(form.validateData(data))
      {
         case Form.VALID:
            C c = new C();
            try
            {
               c.setData(Integer.parseInt(data));
               System.out.println("data " + c.getData() + " ist eine gültige Zahl");
            }
            catch(NumberFormatException e)
            {
               System.out.println("Programmierfehler: parseInt wirft Exception trotz vorhergehender Validierung");
            }
            catch(IllegalArgumentException e)
            {
               System.out.println("Programmierfehler: setter wirft Exception trotz vorhergehender Validierung");
            }
            
            break;
            
         case Form.INVALID:
            System.out.println("data ist keine Zahl >= 0");
            break;
            
         case Form.NOT_A_NUMBER:
            System.out.println("data ist keine Zahl");
            break;
            
         case Form.EMPTY:
            System.out.println("data ist leer");
            break;
            
         default:
            System.out.println("Programmierfehler: unbekannte Validierungsrückgabe");
      }      
   }
}
Das Integer.parseInt im Main stört mich irgendwie. Das mache ich schon in der Klasse Form. Ich mache es also doppelt.

Sollte validateData gleich den gültigen Wert (also den int-Wert) zurückgeben?
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
haemi Unterlagen für 'schönes' Programmieren? Java Basics - Anfänger-Themen 12
DeeDee0815 Java-newbie will Dialoge zentrieren und ein schönes GUI-Desi Java Basics - Anfänger-Themen 7
A so schönes GUI wie Poseidon möglich? Java Basics - Anfänger-Themen 7
N Hey Leute und zwar versuche ich gerade ein 2D Spiel zu Programmieren aber die Figur will sich nicht nach links oder rechts bewegen :( Java Basics - Anfänger-Themen 12
B OOP was heißt objektorientiertes Programmieren (fragt ein absoluter Anfänger) Java Basics - Anfänger-Themen 17
laxla123 Rechteck programmieren Java Basics - Anfänger-Themen 4
A Erste Schritte Dynamische Stempel im PDF Exchange programmieren Java Basics - Anfänger-Themen 0
D Programmieren nach UML Java Basics - Anfänger-Themen 2
Y Taschenrechner programmieren Java Basics - Anfänger-Themen 3
B Überweisung programmieren Java Basics - Anfänger-Themen 7
bluetrix Programmieren eines Bots für Zahlen-Brettspiel Java Basics - Anfänger-Themen 9
D Ampel Programmieren die jede 10 sekunden ihre farbe wechselt Java Basics - Anfänger-Themen 6
J ArrayList add methode selbst programmieren Java Basics - Anfänger-Themen 10
00111010101 Objektorientiertes Programmieren mit Vererbung (Zahlen in Array verschwinden) Java Basics - Anfänger-Themen 3
thor_norsk Fernseher programmieren mit Java Java Basics - Anfänger-Themen 4
M Jenga Regeln Java Programmieren Java Basics - Anfänger-Themen 1
M Ressourcensparend programmieren Java Basics - Anfänger-Themen 3
brypa Wie Programmieren lernen? Java Basics - Anfänger-Themen 15
G Spielerwechsel programmieren Java Basics - Anfänger-Themen 1
J Solitär (Brettspiel) programmieren Java Basics - Anfänger-Themen 3
H Objektorientiertes Programmieren Java Basics - Anfänger-Themen 4
K 12- Stunden Konverter Programmieren Java Basics - Anfänger-Themen 1
WAB9703-04 Programm zum automatischen Ausfüllen von Formularen programmieren Java Basics - Anfänger-Themen 3
L Zahlenspiel programmieren Java Basics - Anfänger-Themen 1
TimoN11 Automat programmieren Java Basics - Anfänger-Themen 4
G Erste Schritte Array Mittelwert Methode Programmieren Java Basics - Anfänger-Themen 5
ehmo würfelspiel programmieren anfänger Java Basics - Anfänger-Themen 1
N Ufospiel programmieren Java Basics - Anfänger-Themen 13
KogoroMori21 Vorbereitung auf die Programmieren Klausur vom ersten Semester Java Basics - Anfänger-Themen 4
Drinkerbell Erste Schritte Zu blöd zum Programmieren? Java Basics - Anfänger-Themen 9
G Stack programmieren Java Basics - Anfänger-Themen 6
I Brauche Hilfe bei Objektorientiertem programmieren Java Basics - Anfänger-Themen 23
T Auf einem Schachbrett bewegen programmieren Java Basics - Anfänger-Themen 2
G Bruchrechner programmieren Java Basics - Anfänger-Themen 6
G Ufo Spiel programmieren Java Basics - Anfänger-Themen 13
D Schachbrett (8x8) programmieren Java Basics - Anfänger-Themen 3
J Spiel programmieren Java Basics - Anfänger-Themen 16
J Hilfe beim Programmieren Java Basics - Anfänger-Themen 5
S Kreisberechnung3 Buch: Programmieren lernen mit Java von Hans-Peter Habelitz Java Basics - Anfänger-Themen 39
M Quiz in Java programmieren mit Array Java Basics - Anfänger-Themen 8
S Spiel-Programmieren. Wenn ein Objekt den anderen berührt. Java Basics - Anfänger-Themen 6
K Java programmieren Java Basics - Anfänger-Themen 6
V_Fynn03 Kontrolle des Quelltextes (Bank programmieren)(GUI) Java Basics - Anfänger-Themen 6
D Was tun gegen zu komplzierten Denken beim Programmieren Java Basics - Anfänger-Themen 27
V_Fynn03 Bruchrechner programmieren (2 Klassen) Java Basics - Anfänger-Themen 9
N Ticketautomat programmieren Java Basics - Anfänger-Themen 63
M Rechner programmieren Java Basics - Anfänger-Themen 3
V_Fynn03 Java Bruchrechner programmieren Java Basics - Anfänger-Themen 13
J Java Suchfunktion Programmieren Java Basics - Anfänger-Themen 1
L Erste Schritte Bin ich "zu dumm" oder nicht geeignet zum Programmieren? Java Basics - Anfänger-Themen 3
U Ist jemad gut in programmieren (JAVA) und kann mir helfen? Java Basics - Anfänger-Themen 1
H Uhr programmieren Java Basics - Anfänger-Themen 10
T Schalter programmieren Java Basics - Anfänger-Themen 17
S Ampel Programmieren Java Basics - Anfänger-Themen 5
P Erste Schritte Probleme mit dem Programmieren Java Basics - Anfänger-Themen 12
D Richtig für Programmieren an der UNI lernen Java Basics - Anfänger-Themen 8
B Folgende Abfrage dynamisch programmieren? Java Basics - Anfänger-Themen 8
D Beim Programmieren auf die Logisch einfache Lösung kommen. Java Basics - Anfänger-Themen 17
B UML Klassen Diagramm zu Java Code Programmieren und ausführen Java Basics - Anfänger-Themen 21
steven789hjk543 Kann man mit Java und Eclipse einen Virus programmieren? Java Basics - Anfänger-Themen 13
S Spiel programmieren mit Java Java Basics - Anfänger-Themen 11
A Kalender programmieren, ich finde meinen Fehler nicht. Java Basics - Anfänger-Themen 9
S Erste Schritte Hilfe beim lernen von Programmieren Java Basics - Anfänger-Themen 2
V Zeichenkette programmieren Java Basics - Anfänger-Themen 20
O Fenster programmieren Java Basics - Anfänger-Themen 2
R Uebersichtlicher bzw. besser Programmieren Java Basics - Anfänger-Themen 13
N Dynamisches Programmieren/Fibonacci Java Basics - Anfänger-Themen 1
B Spielfiguren für ein Beute-Jägerspiel programmieren Java Basics - Anfänger-Themen 12
A Programmieren lernen Java Basics - Anfänger-Themen 28
F ArrayListe manuell programmieren? Java Basics - Anfänger-Themen 24
X Erste Schritte Einstieg ins Programmieren Java Java Basics - Anfänger-Themen 2
O Erste Schritte ln(1+x) Reihe Programmieren Java Basics - Anfänger-Themen 6
Ellachen55 Weihnachtsbaum in Eclipse programmieren Java Basics - Anfänger-Themen 6
L Klassen Geldrückgabe - Aufgabe Programmieren Java Basics - Anfänger-Themen 23
H Stern Dreieck (Buch: Grundkurs Programmieren) Java Basics - Anfänger-Themen 2
V Variablen Vorkommen programmieren Java Basics - Anfänger-Themen 18
S Dreieckssignal programmieren Java Basics - Anfänger-Themen 5
K Fehler beim Programmieren von TicTacToe Java Basics - Anfänger-Themen 12
M Spiel programmieren Java Basics - Anfänger-Themen 16
A Fenster programmieren Java Basics - Anfänger-Themen 1
V OOP Kassensystem objektorientiert programmieren Java Basics - Anfänger-Themen 15
A Erste Schritte DoodleJump programmieren: Kollisionsabfrage Java Basics - Anfänger-Themen 4
CT9288 Kleine Simulation programmieren, denkanstöße erbeten Java Basics - Anfänger-Themen 19
H Welche IDE zum Buch "Programmieren mit Java" von Reinhard Schiedermeier des Verlags Pearson Studium Java Basics - Anfänger-Themen 19
D Könnt ihr mir helfen beim Programmieren eines Ping Pong Spieles? Java Basics - Anfänger-Themen 9
M Rekursive Methode Programmieren Java Basics - Anfänger-Themen 3
I Spielbrett programmieren: Datenstruktur Java Basics - Anfänger-Themen 3
G Rekursives Programmieren --> harmonische Reihe Java Basics - Anfänger-Themen 3
A Endlich anfangen mit Programmieren ! Java Basics - Anfänger-Themen 8
L Karawane programmieren Java Basics - Anfänger-Themen 0
kokojamboo92 Spiel programmieren Java Basics - Anfänger-Themen 1
E Mastermind programmieren, wie den falschen Platz aber richtige Farbe schecken? Java Basics - Anfänger-Themen 23
steven789hjk543 Erste Schritte java programmieren/ Schritt für Schritt Java Basics - Anfänger-Themen 14
I Spiel programmieren. Java Basics - Anfänger-Themen 16
H [Studium] Mäxchenspiel programmieren Java Basics - Anfänger-Themen 10
C BlueJ Zahlenschloss programmieren Java Basics - Anfänger-Themen 5
steven789hjk543 mit dem Smartphone java programmieren Java Basics - Anfänger-Themen 44
F Okjektorientiert programmieren Java Basics - Anfänger-Themen 2
S OOP Ticketsystem programmieren Java Basics - Anfänger-Themen 6
P Selber Programmieren lernen oder Uni? Java Basics - Anfänger-Themen 12

Ähnliche Java Themen

Neue Themen


Oben