Typen von numerischen Zeichenfolgen

Algorithmen, Sprachunabhängige Diskussionen zu Konzepten, Programmiersprachen-Design
Antworten
Benutzeravatar
detewe89
Beiträge: 15
Registriert: So Okt 05, 2008 11:07 am

Typen von numerischen Zeichenfolgen

Beitrag von detewe89 » Do Nov 18, 2010 1:16 pm

Hallo,

hab eine allgemeine Frage zur "idiotensicheren" Programmierung.
Und zwar lautet eine Aufgabe in einer Info-Musterklausur bei uns: "Von welchem Typ sind die Attribute name, vorname, matrikelnummer und personalnummer sinnvollerweise?"

Die Attribute name und vorname sind klar: Strings.
Aber bei den anderen beiden Variablen bin ich mir unsicher, wie man das am besten implementiert, da manche Leute (z. B. Praktikanten/...) keine feste Personalnummer haben oder ähnliche Probleme, wo der Datentyp Integer Probleme machen würde.

Gibt es da spezielle Bibliotheken für sowas oder wie wird das gehandelt?

Lieben Dank
Daniel

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8859
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Typen von numerischen Zeichenfolgen

Beitrag von Xin » Do Nov 18, 2010 1:49 pm

detewe89 hat geschrieben:hab eine allgemeine Frage zur "idiotensicheren" Programmierung.
Irgendwer hat einen Spruch zum Thema Idiotensichere Programmierung hier, den ich sehr gut finde. Er geht etwa so: Du entwickelst immer bessere idiotensichere Programme und die Natur immer bessere Idioten.
detewe89 hat geschrieben:Und zwar lautet eine Aufgabe in einer Info-Musterklausur bei uns: "Von welchem Typ sind die Attribute name, vorname, matrikelnummer und personalnummer sinnvollerweise?"

Die Attribute name und vorname sind klar: Strings.
Wenn Du es Idiotensicher haben willst - und das würde durchaus in meine Art der Programmierung passen, dann würde ich die Datentypen Name, Vorname, Matrikelnummer und Personalnummer nehmen.
Name und Varname würden Klassen sein, die vermutlich einen String kapseln würden.
detewe89 hat geschrieben:Aber bei den anderen beiden Variablen bin ich mir unsicher, wie man das am besten implementiert, da manche Leute (z. B. Praktikanten/...) keine feste Personalnummer haben oder ähnliche Probleme, wo der Datentyp Integer Probleme machen würde.
Kommt wohl drauf an, wie eine Personalnummer oder Matrikelnummer aussieht. Wir hatten nur Ziffern in unseren Matrikelnummern, die Zahlen dürften in ein 32 Bit-Integer passen, da es auch keine gebrochenen Matrikelnummern gab. Da mir auch negative Studenten nicht mit einer negativen Matrikelnummer gekennzeichnet wurden, könnte man auch unsigned int nehmen.
detewe89 hat geschrieben:Gibt es da spezielle Bibliotheken für sowas oder wie wird das gehandelt?
Wie gesagt - die optimale Implementation ist eine eigener Datentyp, denn eine Methode, die einen Nachnamen erwartet kann falsch verwendet werden, wenn Du ihr einen String übergibst - z.B. einen Vornamen. Das ist nicht idiotensicher. Ähnliches gilt für die Matrikelnummer. Irgendwann gibt es vielleicht verschiedene Standorte, die mit einem Buchstaben gekennzeichnet werden. Wenn Du dann alle "unsigned int" im Programm suchen musst, die eine Matrikelnummer speichern, dann hast Du ein Problem. Wenn Du nur den Datentyp "Matrikelnummer" anpassen musst, hast Du es vermutlich einfacher, bzw. der Compiler meckert überall da, wo Du ändern musst, weil Du MatrikelNummer::asInteger() aufrufst, weil Du diese Methode entfernt hast, da man eine Matrikelnummer mit Buchstaben ja nicht als Integer ausgeben kann. So markiert der Compiler gleich alle Stellen, die Du aufgrund der geänderten Matrikelnummer im C++ Code anpassen musst.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
detewe89
Beiträge: 15
Registriert: So Okt 05, 2008 11:07 am

Re: Typen von numerischen Zeichenfolgen

Beitrag von detewe89 » Do Nov 18, 2010 6:55 pm

Okay, danke, also das mit den eigenen Datentypen hat jetzt echt mein Interesse geweckt :)

Wie implementiere ich so etwas bzw. was ist das Ziel von eigenen Typen? Im Grunde verwende ich ja doch primitive Typen als Grundlage.
Sind eigene Typen dann gut für Ausnahmen-Behandlung?
Kannst du mir eine kleine Beispiel-Implementierung (C++/Java) zeigen? Bei Beispielen lern ich immer am schnellsten^^

Wär echt cool!

MoonGuy
Beiträge: 231
Registriert: Fr Okt 08, 2010 2:49 pm

Re: Typen von numerischen Zeichenfolgen

Beitrag von MoonGuy » Do Nov 18, 2010 7:04 pm

detewe89 hat geschrieben:Okay, danke, also das mit den eigenen Datentypen hat jetzt echt mein Interesse geweckt :)

Wie implementiere ich so etwas bzw. was ist das Ziel von eigenen Typen? Im Grunde verwende ich ja doch primitive Typen als Grundlage.
Sind eigene Typen dann gut für Ausnahmen-Behandlung?
Kannst du mir eine kleine Beispiel-Implementierung (C++/Java) zeigen? Bei Beispielen lern ich immer am schnellsten^^

Wär echt cool!
Ich glaube Xin meint mit eigenem Typen eigene Klassen/Strukturen und diese dann mit typedef als "Type" zu deklarieren. Zusätzlich könnten sich templates für dich lohnen, um das ganze "allgemein/idiotensicher" zu halten, wobei ein typedef und festgelegte Typen auch funktionieren wird.

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Typen von numerischen Zeichenfolgen

Beitrag von cloidnerux » Do Nov 18, 2010 7:12 pm

Wie implementiere ich so etwas bzw. was ist das Ziel von eigenen Typen? Im Grunde verwende ich ja doch primitive Typen als Grundlage.
Es gibt hier 2 Unterscheidungen:
Eine Gekapselte Klasse, um die Daten auch zu Verifizieren und mit dem Datentyp zusammenhängende Funktionen zu Kapseln
Eine Struktur/Union, Primitve, die per typedef zu deinem Typ werden.

Was XIN konkret aus meiner Sicht meint, ist die Kapselung in Klassen.
Dazu überlegst du dir, was für Daten du überhaupt für deinen Typ brauchst, z.B für den Namen einen String, für eine ID vlt noch ein Hash zum Verifizieren, etc.
Dann Überlegst du dir, wie Zugreifbar der Wert sein soll, z.B nur lesen, nur Schreiben. Auch kannst du Funktionen zur Wertzuweisung implementieren(das sollte man auch) um sicherzustellen, dass der neue Wert auch Korrekt ist, z.B das der String nicht leer ist oder Sonderzeichen(!"§$%&/()=?, etc.) enthält.
Dann noch Funktionen, die im Zusammenhang mit deinem Überordneten Problem zusammenhängen, z.B eine Funktion "GetSQLFetchString()", um einen SQL Befehl zum Abrufen des namens aus einer Datenbank zu bekommen. Das musst du dann nur noch in eine Klasse verwursten.
Redundanz macht wiederholen unnötig.
quod erat expectandum

Benutzeravatar
Dirty Oerti
Beiträge: 2229
Registriert: Di Jul 08, 2008 5:05 pm
Wohnort: Thurndorf / Würzburg

Re: Typen von numerischen Zeichenfolgen

Beitrag von Dirty Oerti » Do Nov 18, 2010 7:30 pm

Wie implementiere ich so etwas
Das hängt davon ab, was du machen willst.
Mal am Beispiel der Matrikelnummer:

Die sei jetzt mal eine Nummer, und zusätzlich noch ein Buchstabe für ... sagen wir die allgemeine Fachrichtung. Ist ja im Prinzip auch egal.

12345C (als Beispiel)

Dann nehmen wir mal an, dass du deine "Sammlung an Studenten" z.B. nach Matrikelnummer sortieren willst.
Dazu nimmst du nun einen ganz normalen, vergleichsbasierten Sortieralgorithmus (Quicksort), der die Matrikelnummern vom Typ "Matrikelnummer" vergleicht.
Irgendwo in deinem Algorithmus steht also:

Code: Alles auswählen

Matrikelnummer m1 = ...
Matrikelnummer m2 = ...
//...
if (m1 < m2)
// ...
Und jetzt könntest du den Operator "<" überladen, und dir damit selbst eine Ordnung in die Matrikelnummern zaubern (so dass z.B. die Nummern in aufsteigender Reihenfolge , aber getrennt nach Fachrichtung ausgegeben werden)
Und das eben, ohne deinen Sortieralgorithmus anzupassen.
Wenn dir also später mal einfällt: Ich könnte an die Matrikelnummer noch eine Nummer anhängen, die das Fachsemester symbolisiert, dann musst du nur die Klasse Matrikelnummer abändern, alles andere bleibt gleich.

12345C4 (wäre ein Beispiel für die obige Erweiterung)
Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne! :)
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8859
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Typen von numerischen Zeichenfolgen

Beitrag von Xin » Do Nov 18, 2010 7:51 pm

detewe89 hat geschrieben:Kannst du mir eine kleine Beispiel-Implementierung (C++/Java) zeigen? Bei Beispielen lern ich immer am schnellsten^^
Wie schon korrekt vermutet, will ich auf Klassen hinaus. Eine Klasse "klassifiziert" zunächst Daten, das ist erforderlich um objektorientiert arbeiten zu können. Dabei entsteht ein neuer Datentyp. Wenn man allerdings nicht objektorientiert arbeiten muss, sondern nur Daten als eigene Typen braucht, eignen sich dafür Klassen ebenfalls. Man hat ausschließlich Basisklassen, aber diese sind nicht miteinander kompatibel - und genau das möchte man ja erreichen.

typedef erzeugt einen Identifier, der für ein anderen Typ steht.
Ein typedef unsigned int MatrikelNummer ist mit unsigned int beschreibbar und implizit castbar. Man kann semantisch ausdrücken, dass man eine Matrikelnummer verwenden möchte, aber die Typprüfung des Compilers ist hier nicht idiotensicher. Also braucht man eine Klasse.

Code: Alles auswählen

class Matrikelnummer
{
  private:
    unsigned int Nummer;

  public:
     explicit Matrikelnummer( unsigned int data ) : Nummer( data ) {}

     unsigned int AsInteger() { return Nummer; }
};
Du kannst damit die Matrikelnummer übergeben. Du kannst damit nicht unbekümmert rechnen, also

Code: Alles auswählen

Matrikelnummer m = MatrikelNummer( 83803 );

m++; // idiotisch => geht nicht
Als meine Fachhochschule sich mit anderen Fachhochschulen zusammenschloss, änderte sich meine Matrikelnummer auf 2083803.
Hier könnte man nun intern die Methode 'AsInteger()' für einen internen Gebrauch ändern oder entsprechende Konstruktoren erstellen. Man packt eine HochschulId dazu und weiß damit, wo der Student studiert.

Code: Alles auswählen

     Matrikelnummer( HochschulId id, unsigned int data ) : SchulId( id ), Nummer( data ) {}
     unsigned int AsInteger() { return SchulId.Matrikelprafix + Data; }

     unsigned int AsInternalInteger() { return Data; }
     HochschulId GetSchulId() { return SchulId; }
Nun könnte man den anderen Konstruktor lahmlegen und bekommt damit vom Compiler alle Stellen, die eine Matrikelnummer erzeugen ohne die Hochschule anzugeben und ich wüsste sofort, wo ich das Programm korrigieren muss, um es fehlerfrei zu halten. Die Funktion AsInteger() hat sich verändert - aber wer immer die Matrikelnummer ausliest um sie z.B. auf eine Notenübersicht zu drucken hat gar nicht mitbekommen, dass sich die Nummer nun anders berechnet wird.

Man entschuldige das Denglisch... Get, As, Is, Set und Has sind Prefixe, die ich weniger gern übersetze. Die Klassen 'Matrikelnummer' und 'HochschulId' würde ich auch englisch bezeichnen, aber wir fingen damit hier so an. Wie du siehst, kapsle ich auch die Identifikationsnummer der Hochschule. Wären beides unsigned ints gewesen, dann könnte man sie verwechseln => nicht idiotensicher.

Ich programmiere jetzt seit 24 Jahren. Ich kapsele alles. Ich versuche es idiotensicher zu machen, denn wenn ich in der Zeit etwas gelernt habe, dann dass man als Entwickler immer Fehler macht und man die Qualität seiner Arbeit massiv steigern kann, wenn man sich dem Compiler als Idiot offenbart. Wer seine Schwächen im Griff haben will, muss alle Möglichkeiten nutzen, sich abzusichern und ausführliche Typisierung hilft hier sehr gut helfen. Aufgurnd dieser Erfahrung überlege ich noch, ob ich primitive Typen in meiner Sprache als Parameter zu verbieten.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
Kerli
Beiträge: 1456
Registriert: So Jul 06, 2008 10:17 am
Wohnort: Österreich
Kontaktdaten:

Re: Typen von numerischen Zeichenfolgen

Beitrag von Kerli » Fr Nov 19, 2010 9:34 pm

Xin hat geschrieben:Irgendwer hat einen Spruch zum Thema Idiotensichere Programmierung hier, den ich sehr gut finde. Er geht etwa so: Du entwickelst immer bessere idiotensichere Programme und die Natur immer bessere Idioten.
Ich glaube das bin ich :P Es stimmt ja auch irgendwie. Deshalb darf man sich nicht fragen wie macht man etwas idiotensicher, sondern wie schreibt man Code der möglichst leicht richtig und möglichst schwer falsch zu verwenden ist. Also zum Beispiel für inkompatible Typen auch wirklich inkompatible Typen verwenden (Klassen statt nur typedef).
"Make it idiot-proof and someone will invent an even better idiot." (programmers wisdom)

OpenGL Tutorials und vieles mehr rund ums Programmieren: http://www.tomprogs.at

Benutzeravatar
detewe89
Beiträge: 15
Registriert: So Okt 05, 2008 11:07 am

Re: Typen von numerischen Zeichenfolgen

Beitrag von detewe89 » Mo Nov 22, 2010 9:54 pm

Okay, viiielen Dank für die ausführlichen Antworten. Das Prinzip ist mir jetzt grob klargeworden.

Aber ich habe festgestellt, dass ich erstmal mehr C++ lernen sollte und dann Kapselung ... in unserer Vorlesung kommen wir nicht soweit laut dem Plan, wäre ja auch nur zu schön...

LG
Daniel

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8859
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Typen von numerischen Zeichenfolgen

Beitrag von Xin » Mo Nov 22, 2010 11:44 pm

detewe89 hat geschrieben:Aber ich habe festgestellt, dass ich erstmal mehr C++ lernen sollte und dann Kapselung ... in unserer Vorlesung kommen wir nicht soweit laut dem Plan, wäre ja auch nur zu schön...
Das Forum ist dafür da, um Fragen zu stellen. Wenn's Dich interessiert... stell halt Fragen.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Antworten