Validierung von Eingaben: Wo?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Hase
User
Beiträge: 106
Registriert: Donnerstag 1. Oktober 2009, 15:17
Wohnort: Bremer Speckgürtel

Hallo, ich starte mal wieder ein kleines Projekt und stoße schon ganz am Anfang auf ein Grundsatzproblem.
Ich möchte auf jeden Fall zuerst die Programmlogik machen und mich erst später für ein UI entscheiden. Kandidaten dafür sind, in Reihenfolge meiner Präferenz: Urwid/ncurses, Textterminal, Qt, Webinterface, wobei letzteres vermutlich ausscheidet, da das Ganze im wesentlichen für kleine Bildschirme (8-10 Zoll) geplant ist.

Ich habe erst ein paar Zeilen eingetippt, da soll noch nichts laufen, ich bin ja noch bei den Vorüberlegungen:

Code: Alles auswählen

class Probe(object):
    def __init__(self, labornummer=None, einwaage=None, wassergehalt=0, zementgehalt=None):
        self.labornummer=labornummer
        self.einwaage=einwaage
        self.wassergehalt=wassergehalt
        if wassergehalt>0:
            self.trockeneinwaage=self.einwaage/self.wassergehalt
        else:
            self.trockeneinwaage=self.einwaage

Das Programm wird drei Eingabebereiche haben:
Proben (siehe oben); Datenquelle: User
Stammdaten/UserConfig; Datenquelle: User
Messung; Datenquelle: Maschine

Die Eingabedaten müssen validiert werden, und zwar nicht nur auf type, sondern auch auf Sinnhaftigkeit. Die Frage ist nur, wo?
Sollte z.B. für obigen Code die Validierung ein Teil der Klasse sein, eine Methode? Oder baut man sich eine separate Validator-Klasse, strikt getrennt von der Programmlogik? Oder ist es sinnvoll, die Validierung möglichst nahe an das UI zu hängen, bei einem Web-Interface z.B. per JS direkt bei der Eingabe?

Wie ist da der Python-Weg?

Vielen Dank!

Ingo
BlackJack

@Hase: Das lässt sich IMHO nicht so pauschal beantworten. Wenn Benutzer etwas eingeben oder generell Daten in das Programm kommen sollte man das schon so nah wie möglich dort prüfen um sinnvolle Rückmeldungen geben zu können, andererseits können/sollten Prüfungen auch in der Programmlogik vorhanden sein.

Auf den Typ sollte man aber eher nicht prüfen, denn damit macht man sich das „duck typing“ kaputt.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Validierung liegt zwischen Logik und Interface, tendenziell würde ich es aber näher am Interface ansiedeln. Grund dafür ist einfach dass die Eingabemöglichkeiten die das Interface bietet sich natürlich stark auf die Validation auswirken. Wenn du eine Qt GUI hast kannst du Validation einfach vollkommen anders angehen als wenn du ein Webinterface hast. Dementsprechend bieten Qt und Webframeworks auch ihre eigenen Lösungen für Validierung an.
Benutzeravatar
MagBen
User
Beiträge: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

In meinen Projekten mache ich das mit den Validierungen so:

Bei einfachen Validierungen bekommt das GUI-Element einen Validator verpasst, der die die Eingabe prüft. Wenn's nicht OK ist, dann wird eine Exception geworfen, z.B. Eingabe soll
  • Zahl,
  • positive ganze Zahl,
  • HEX-Farbcode
sein.

Ist die Validierung dagegen komplexer, dann validiert das Objektmodell, in das das GUI-Element seine Eingabe reinschreibt, z.B.: Eingabe soll
  • gültige Postleitzahl
  • gültige Adresse
sein oder ganz generell, die Eingabe muss im Rahmen des aktuellen Projektes sinnvoll sein (wie soll das GUI-Element das wissen?).

Die GUI mache ich mit Qt, aber die Validatoren von Qt benutze ich nicht, da es mit Python zum einen sehr einfach ist Validatoren für Zahlen zu schreiben (einfach String in Zahl umwandeln, wird eine Exception geworfen, dann ist der String eine ungültige Eingabe) und zum anderen bringt Qt gleich immer noch die Lokalität mit rein. In meinen (wissenschaftlichen) Anwendungen werden Zahlen aber immer mit Punkt und nicht mit Komma eingegeben, egal ob da jetzt jemand ein deutsches oder englisches OS installiert hat.
a fool with a tool is still a fool, www.magben.de, YouTube
Antworten