Typen von numerischen Zeichenfolgen
Typen von numerischen Zeichenfolgen
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
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
- Xin
- nur zu Besuch hier
- Beiträge: 8862
- Registriert: Fr Jul 04, 2008 11:10 pm
- Wohnort: /home/xin
- Kontaktdaten:
Re: Typen von numerischen Zeichenfolgen
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:hab eine allgemeine Frage zur "idiotensicheren" Programmierung.
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.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.
Name und Varname würden Klassen sein, die vermutlich einen String kapseln würden.
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: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.
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.detewe89 hat geschrieben:Gibt es da spezielle Bibliotheken für sowas oder wie wird das gehandelt?
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.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
Re: Typen von numerischen Zeichenfolgen
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!

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!
Re: Typen von numerischen Zeichenfolgen
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.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!
- cloidnerux
- Moderator
- Beiträge: 3125
- Registriert: Fr Sep 26, 2008 4:37 pm
- Wohnort: Ram (Gibts wirklich)
Re: Typen von numerischen Zeichenfolgen
Es gibt hier 2 Unterscheidungen:Wie implementiere ich so etwas bzw. was ist das Ziel von eigenen Typen? Im Grunde verwende ich ja doch primitive Typen als Grundlage.
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
quod erat expectandum
- Dirty Oerti
- Beiträge: 2229
- Registriert: Di Jul 08, 2008 5:05 pm
- Wohnort: Thurndorf / Würzburg
Re: Typen von numerischen Zeichenfolgen
Das hängt davon ab, was du machen willst.Wie implementiere ich so etwas
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 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.
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.
- Xin
- nur zu Besuch hier
- Beiträge: 8862
- Registriert: Fr Jul 04, 2008 11:10 pm
- Wohnort: /home/xin
- Kontaktdaten:
Re: Typen von numerischen Zeichenfolgen
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.detewe89 hat geschrieben:Kannst du mir eine kleine Beispiel-Implementierung (C++/Java) zeigen? Bei Beispielen lern ich immer am schnellsten^^
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; }
};
Code: Alles auswählen
Matrikelnummer m = MatrikelNummer( 83803 );
m++; // idiotisch => geht nicht
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; }
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.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
Re: Typen von numerischen Zeichenfolgen
Ich glaube das bin ichXin 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.

"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
OpenGL Tutorials und vieles mehr rund ums Programmieren: http://www.tomprogs.at
Re: Typen von numerischen Zeichenfolgen
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
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
- Xin
- nur zu Besuch hier
- Beiträge: 8862
- Registriert: Fr Jul 04, 2008 11:10 pm
- Wohnort: /home/xin
- Kontaktdaten:
Re: Typen von numerischen Zeichenfolgen
Das Forum ist dafür da, um Fragen zu stellen. Wenn's Dich interessiert... stell halt Fragen.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...
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.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.