none
Datenkapselung RRS feed

  • Frage

  • Hallo,

    bin mir nicht sicher ob der Titel richtig ist, falls nicht , sorry.

    Folgendes Problem, ich habe mehrere Dateien die ich verarbeiten will. Allen Dateien haben gemein, dass die darin enthaltenen

    Daten immer eine feste Länge haben, sprich Datei_1 hat zum Beispiel den Inhalt AAA01072011BBB01072011CCC30062011.

    Was für mich heisst, 3 Datensätze mit ID und Datum

    ID   Datum

    AAA 01072011

    BBB 01072011

    CCC 30062011.

    Eine Datei_2 hat vielleicht jene Daten 001AAA011BBB071CCC

    was wiederum heisst 3 Datensätze mit Retry und ID

    Retry ID

    001 AAA

    011 BBB

    071 CCC

    Wie ihr seht, ist das ID Feld gleich. Dies ist bei allen Datenfelder so, sodass ich mich fragte ob es nicht einfacher wäre wenn ich

    eine Klasse mit Datenfeldern erstelle und weitere Klasse, welche Strukturen mit diesen DatenFeldern halten.

    Wenn sich dann die Größe eines Datenfeldes ändert, brauche ich dies nur in der Klasse zu tun, welche die DatenFelder beschreibt.

    Soweit die Theorie - nur wie macht man das in der Praxis?

    Mein Versuch dies so zu lösen

     

    Public Class DataField
      Friend _ID as Char(3)
      Friend _date as Char(8)
      Friend _retry as Char(3)
    End Class
    
    Public Class Connections
      Structure Retry
        Dim _id as DataField._ID
        Dim _retry as DataField._retry
      End Structure
    End Class
    

     

    geht nicht, da

    a) ich die Char Arrays nicht mit konstanter Grösse deklarieren/initialisieren kann

      Muss ich da üner das Marshalling gehen, oder gibt es alternativen

    b) in der Klasse conncetion bekomme ich den Hinweis das es z. B. den Typ DataField_ID nicht gibt.

    Habt Ihr eine Idee, wie ich das besser mache?

    Danke

    Reinhard

    Freitag, 1. Juli 2011 16:34

Antworten

  • Hallo Reinhard,

    ein ähnliches Problem hatte Ellen Ramcke in Ein Telegramm in eine Datenstruktur casten. Wie?

    Zuerst: Verwende durchweg String, dort wo Du eine Zeichenkette erwartest - auch wenn die eine feste Länge hat.
    Denn mit Char-Arrays kann man nur sehr schlecht weiterarbeiten, sei es für Vergleiche, Zuweisungen uam.

    Dann mache aus den Feldern jeweils eine Eigenschaft, so dass Du die Länge, Dateninhalt usw. kontrollieren kannst.

    Beim Lesen/Schreiben kannst Du ähnlich wie im obigen Beispiel die Datenstruktur zerlegen und später wieder zusammenfügen,
    entweder wie bei Ellen gezeigt oder auch über einen BinaryReader/-Writer.

    Was das Ableiten angeht:
    So funktioniert das generell nicht. Du könntest Dir zwar etwas bauen wie

    Friend Structure IDDatenTyp
      Public Property Value As String
    End Structure
    
    Friend Structure RetryDatenTyp
      Public Property Value As String
    End Structure
    
    ' und zusammenbauen
    Friend Class Connections
      Friend ID As IDDatenTyp
      Friend Retry As RetryDatenTyp
    End Class
    
    
    

    (Ich habe der Kürze halber eine AutoProperty verwendet, um die Länge und Datenwerte zu kontrollieren, verwende eine explizite Eigenschaft).

    Das bringt aber in den meisten Fällen nur wenig, außer zusätzliche Schreibarbeit.
    Denn passt bei der Verarbeitung was nicht, so bleibt es am Ende doch bei einer Ausnahme (Excption),
    wo es dann nicht mehr weitergehen würde.

    Ergo: Richtig kodiert werden muss das Ganze bereits beim Lesen/Schreiben und später bei der Verarbeitung.
    Für eine Eingabeprüfung kann sinnvoller sein, eine zusätzliche Validation wie die DataAnnotations zu verwenden.

    Gruß Elmar

     

     

    • Als Antwort markiert ReinhardH Freitag, 1. Juli 2011 23:04
    Freitag, 1. Juli 2011 18:54

Alle Antworten

  • Hallo Reinhard,

    ein ähnliches Problem hatte Ellen Ramcke in Ein Telegramm in eine Datenstruktur casten. Wie?

    Zuerst: Verwende durchweg String, dort wo Du eine Zeichenkette erwartest - auch wenn die eine feste Länge hat.
    Denn mit Char-Arrays kann man nur sehr schlecht weiterarbeiten, sei es für Vergleiche, Zuweisungen uam.

    Dann mache aus den Feldern jeweils eine Eigenschaft, so dass Du die Länge, Dateninhalt usw. kontrollieren kannst.

    Beim Lesen/Schreiben kannst Du ähnlich wie im obigen Beispiel die Datenstruktur zerlegen und später wieder zusammenfügen,
    entweder wie bei Ellen gezeigt oder auch über einen BinaryReader/-Writer.

    Was das Ableiten angeht:
    So funktioniert das generell nicht. Du könntest Dir zwar etwas bauen wie

    Friend Structure IDDatenTyp
      Public Property Value As String
    End Structure
    
    Friend Structure RetryDatenTyp
      Public Property Value As String
    End Structure
    
    ' und zusammenbauen
    Friend Class Connections
      Friend ID As IDDatenTyp
      Friend Retry As RetryDatenTyp
    End Class
    
    
    

    (Ich habe der Kürze halber eine AutoProperty verwendet, um die Länge und Datenwerte zu kontrollieren, verwende eine explizite Eigenschaft).

    Das bringt aber in den meisten Fällen nur wenig, außer zusätzliche Schreibarbeit.
    Denn passt bei der Verarbeitung was nicht, so bleibt es am Ende doch bei einer Ausnahme (Excption),
    wo es dann nicht mehr weitergehen würde.

    Ergo: Richtig kodiert werden muss das Ganze bereits beim Lesen/Schreiben und später bei der Verarbeitung.
    Für eine Eingabeprüfung kann sinnvoller sein, eine zusätzliche Validation wie die DataAnnotations zu verwenden.

    Gruß Elmar

     

     

    • Als Antwort markiert ReinhardH Freitag, 1. Juli 2011 23:04
    Freitag, 1. Juli 2011 18:54
  • Hallo Elmar,

    vielen Dank, werde versuchen deine Anregungen umzusetzen.

    Danke

    Reinhard

    Freitag, 1. Juli 2011 23:05