Autor Thema: Wie kann ich eine Klasse sinnvoll aufbauen ?  (Gelesen 128417 mal)

Offline animate

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.540
  • Uh, I'm just gonna go find a cash machine.
    • LA2
Re:Wie kann ich eine Klasse sinnvoll aufbauen ?
« Antwort #160 am: 06.07.04 - 21:36:39 »
arbeitest du noch mit einem Modell?
wenn ja wärs schön, wenn du das mal posten könntest, dann könnten wir deine Fortschritte analysieren :D
Thomas

Fortunately, I'm adhering to a pretty strict, uh, drug, uh, regimen to keep my mind, you know, uh, limber.

Offline TMC

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 3.660
  • Geschlecht: Männlich
  • meden agan
Re:Wie kann ich eine Klasse sinnvoll aufbauen ?
« Antwort #161 am: 06.07.04 - 21:43:54 »
Sorry, nicht wirklich Thomas  :P

Mein nächstes Ziel ist es jetzt, eine Klasse HistoryField zu erstellen.

Wobei HistoryField abstrakt sein soll, und daraus abgeleitet eben HistoryFieldText, HistoryFieldRTF etc. Also so wie von Dir schon vorgeschlagen.



Bevor ich das mache, will ich aber erst mal Basics kapieren. Daher teste ich noch ein wenig rum, bevor ich loslege. Aktuell versuche ich eben, eine Property in der abstrakten Klasse zu Setten, aber der eigentliche Code läuft dann in einer Unterklasse (HistoryFieldText / HistoryFieldRTF, etc.).

« Letzte Änderung: 06.07.04 - 21:44:19 von TMC »
Matthias

A good programmer is someone who looks both ways before crossing a one-way street.


Offline animate

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.540
  • Uh, I'm just gonna go find a cash machine.
    • LA2
Re:Wie kann ich eine Klasse sinnvoll aufbauen ?
« Antwort #162 am: 06.07.04 - 21:45:21 »
Fehlermeldung kommt in Zeile "myDifference = .getDifference("Wert 1")" (steht in der abstrakten Klasse).
also diese Schreibweise habe ich noch nicht gesehen.

wenn ein Objekt eine Methode von sich selbst aufruft, kann das auf 2 Arten erfolgen:

entweder Me.getDifference()
oder einfach getDifference()


Was du willst, kannst du erreichen, wenn du in dre Basisklasse die Methode hast und ebenfalls in den Subklassen.
In der Basisklasse hast du allerdings nur die Signatur der Methode, die Implementierung machst du in den Subklassen.

D.h. in der Basisklasse steht wirklich nur

Public Property Get Wert As String
End Property

Thomas

Fortunately, I'm adhering to a pretty strict, uh, drug, uh, regimen to keep my mind, you know, uh, limber.

Offline animate

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.540
  • Uh, I'm just gonna go find a cash machine.
    • LA2
Re:Wie kann ich eine Klasse sinnvoll aufbauen ?
« Antwort #163 am: 06.07.04 - 21:49:37 »
in dem Link, den du im Tipps Bereich gepostet hast
(http://www.lotusgeek.com/SapphireOak/LotusGeekBlog.nsf/plinks/ROLR-5UV6YM)
da ist ein Posting von mir, dass zeigt, wie du das machen kannst.
Da sind zwei Klassen (AbstractImportFactory und ExcelFactory).
In der AbstractImportFactory ist die Methode init(), allerdings nur die Signatur.
In der Excel Factory gibts die Methode auch, hier ist die wirkliche Funktionalität implementiert.
Thomas

Fortunately, I'm adhering to a pretty strict, uh, drug, uh, regimen to keep my mind, you know, uh, limber.

Offline TMC

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 3.660
  • Geschlecht: Männlich
  • meden agan
Re:Wie kann ich eine Klasse sinnvoll aufbauen ?
« Antwort #164 am: 06.07.04 - 22:09:01 »
Fehlermeldung kommt in Zeile "myDifference = .getDifference("Wert 1")" (steht in der abstrakten Klasse).
also diese Schreibweise habe ich noch nicht gesehen.

 ;D

Ich hatte da 1 + 1 zusammengezählt bei der DotDot-Notation  ;D

Habe es aber jetzt so verstanden:
Ich muss also in der Basisklasse (hier = abstrakte Klasse) die Function/Sub genau so reinschreiben (Function / End Function), aber nur ohne Code dazwischen. Nur dann kann ich dann auch auf die Unterklassen - Function/Sub zugreifen.

Danke, so klappt es auch jetzt  :D
« Letzte Änderung: 06.07.04 - 22:11:12 von TMC »
Matthias

A good programmer is someone who looks both ways before crossing a one-way street.


Offline animate

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.540
  • Uh, I'm just gonna go find a cash machine.
    • LA2
Re:Wie kann ich eine Klasse sinnvoll aufbauen ?
« Antwort #165 am: 06.07.04 - 22:17:52 »
Habe es aber jetzt so verstanden:
Ich muss also in der Basisklasse (hier = abstrakte Klasse) die Function/Sub genau so reinschreiben (Function / End Function), aber nur ohne Code dazwischen. Nur dann kann ich dann auch auf die Unterklassen - Function/Sub zugreifen.

jein.
1. In der Methode der abstrakten Klasse kann sehr wohl auch Funktionalität implemetiert sein. Funktionalität, die in allen Subklassen benötigt wird (damit du nicht redundanten Code hast).

Diese Methode in der Basisklasse

Sub doIt()
   Print "Basisklasse"
End Sub

und diese in der Subklasse

Sub doIt()
   Call Basisklasse..doIt()
   Print "Subklasse"
End Sub


2. (aber nicht groß drüber nachdenken, ist nicht so wichtig und verwirrt an dieser Stelle wohl nur) Du musst die Methode nicht zwingend in der Basisklasse haben.
Thomas

Fortunately, I'm adhering to a pretty strict, uh, drug, uh, regimen to keep my mind, you know, uh, limber.

Offline TMC

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 3.660
  • Geschlecht: Männlich
  • meden agan
Re:Wie kann ich eine Klasse sinnvoll aufbauen ?
« Antwort #166 am: 06.07.04 - 22:27:26 »
2. (aber nicht groß drüber nachdenken, ist nicht so wichtig und verwirrt an dieser Stelle wohl nur) Du musst die Methode nicht zwingend in der Basisklasse haben.

Dann hab ich das glaub ich richtig verstanden (nur nicht verständlich rübergebracht).

Genau das war mein Ziel:
- Wiederkehrendes an 1 Stelle (hier: abstrakte Klasse)
- Spezielles in die abgeleiteten Klassen
- Der Call aber immer gleich (wenn ich Call sportauto.Feature mache, soll sich die Lachgaseinspritzung einschalten, wenn ich Call cabrio.Feature mache, soll sich das Dach öffnen).
Matthias

A good programmer is someone who looks both ways before crossing a one-way street.


Offline TMC

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 3.660
  • Geschlecht: Männlich
  • meden agan
Re:Wie kann ich eine Klasse sinnvoll aufbauen ?
« Antwort #167 am: 07.07.04 - 22:59:09 »
OK, ich stecke nun mittendrin.

Damit das nun überhaupt noch wer kapiert von was ich rede, hole ich etwas weiter aus:

Wir haben als Aufgabe, Feldänderungen einer Maske in eine History zu schreiben.
Um das zu machen, habe ich
+ alle Feldnamen
+ alle Feldtitel (die ja abweichen können vom Feldnamen, z.B. Titel "Inhalt", Name aber "Sbj1")
+ alle Feldinhalte
jeweils in einem Array.

Um z.B. das Array "Feldinhalte" zu erzeugen, nutze ich eine Function:
Private Function ExtItemValuesToArray(doc As NotesDocument, vFieldList As Variant) As Variant

Nun sagt Thomas zurecht: Du hast ja da eine ScriptLib, wo Du Felder behandelst, mach doch daraus eine Klasse "Field".
Zitat
Ein Objekt der Klasse 'Feld' repräsentiert genau ein zu überwachendes Feld aus dem Notesdokument.
D.h., wenn ich drei Felder überwachen will, dann brauche ich drei Objekte. Jedes Objekt kann mir Auskunft darüber
geben, welchen Wert 'sein' Feld hat, welchen es ürsprünglich hatte bzw. worin der Unterschied zwischen den beiden Werten besteht.


Das mache ich auch jetzt dann.

Mein Problem ist jetzt:
Ich muss ja den einzelnen Objekten u.a. Feldinhalte geben.
Bisher mach ich es mir einfach.

Code
Private Function ExtItemValuesToArray(doc As NotesDocument, vFieldList As Variant) As Variant
   '**************************************************************************************************
   'Purpose: Loops through the provided field list and puts the item values to an Array
   '   
   'In case of RichTextField, it sets a prefix "I_AM_A_RTF" and the last modified date. So we 
   'are easily able to find out if the array-entry-source was richtext.
   '**************************************************************************************************   
   
   On Error Goto ERRORHANDLER
   
   Dim item As NotesItem
   Dim vItemValues() As Variant
   Dim strItemValue As String
   Dim i As Integer
   
   'We loop through the field list and set the item values to the HistorySourceArray
   Redim vItemValues(Ubound(vFieldList))
   For i = 0 To Ubound(vFieldList)
      Set item = doc.GetFirstItem( vFieldList(i) )
      If item.Type = RICHTEXT Then
         vItemValues(i) = "I_AM_A_RTF" & Cstr(item.LastModified)
      Else
         '--> We find out if the item contains more than one value; if so: we put 'em together in a string      
         strItemValue = ""
         Forall v In item.values
            If strItemValue = "" Then
               strItemValue = Cstr(v)
            Else
               strItemValue = strItemValue & " / " & Cstr(v)
            End If
         End Forall
         '<--------------
         vItemValues(i) = strItemValue
      End If 'item.Type = RICHTEXT Then
   Next
   
   ExtItemValuesToArray = vItemValues
   
EXITSCRIPT:
   Exit Function
ERRORHANDLER:
   Call AuxErrorHandler("ExtItemValuesToArray")
   Resume EXITSCRIPT
End Function

Damit mache ich mir ein Array aus den Feldinhalten eines Dokumentes. Ich sehe dabei auch sofort, ob ein Array-Eintrag aus einem RT-Feld stammt und kann das dann weiterbearbeiten.

Unser Zielanspruch ist aber, mehrere Unterklassen zu haben (FieldText, FieldRTF, etc.).

Wie gebe ich jetzt die Feldinhalte in die Klassen FieldText und FieldRTF?
Ich müsste dann ja im Code abfragen, um was es sich für ein Feld handelt, und dann die entsprechende Klasse erstellen.

Dann habe ich eine Ansammlung an Objekte als Ergebnis: Einige FieldText-Objekte und einige FieldRTF-Objekte (kunterbunt gemischt).

Bisher war die Ausgabe der Reihenfolge in die Historie vorgegeben durch die Reihenfolge im Array. Jetzt muss ich wohl zusätzlich noch einen Zähler mitlaufen lassen um die Reihenfolge zu beizubehalten.

Außerdem blähe ich so den Code auf in dem ich die Objekte erstelle. All das hatte ich mit der Function vermieden.

Fazit:
Mittlerweile sehe ich nicht mehr so ganz den Sinn, eine Field-Klasse zu erstellen um z.B. obengenannte Function abzulösen.

Aber vielleicht kann mir das wer erklären (wenn da jetzt überhaupt noch wer durchsteigt  ::) )

Danke
Matthias

A good programmer is someone who looks both ways before crossing a one-way street.


Offline TMC

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 3.660
  • Geschlecht: Männlich
  • meden agan
Re:Wie kann ich eine Klasse sinnvoll aufbauen ?
« Antwort #168 am: 07.07.04 - 23:04:35 »
Hier noch ein wenig Code als Ansatz für die Field-Klasse.

a) Die abstrakte Klasse
Code
Public Class HistoryField2

   Private m_vInitialValue As Variant
   Private m_vNewValue As Variant
   Private m_strTitle As String
   Private m_vDifference As Variant

   '-------------------------------------------------------------------------------------------------
   'Get/Set-Methoden
   Public Property Set NewValue As Variant
      m_vNewValue = NewValue
   End Property
   Public Property Get Difference As Variant
      Difference = getDifference(m_strTitle, m_vInitialValue, m_vNewValue)
   End Property
   '-------------------------------------------------------------------------------------------------
   Public Sub new(strTitle As String, vInitialValue As Variant)
      m_strTitle = strTitle
      m_vInitialValue = vInitialValue
   End Sub
   '-------------------------------------------------------------------------------------------------
   Private Function getDifference(strName As String, vSource As Variant, vTarget As Variant) As String
      'Nichts. Code wird in der abgeleiteten Klasse ausgeführt !
   End Function
   '-------------------------------------------------------------------------------------------------
End Class

b) Eine Unterklasse
Code
Public Class HistoryField2Text As HistoryField2
%REM
Diese Klasse nutzt die abstrakte Klasse "HistoryField2 !
%END REM
   '-------------------------------------------------------------------------------------------------   
   Public Sub new(strName As String, vInitialValue As Variant)
      
   End Sub
   '-------------------------------------------------------------------------------------------------      
   Private Function getDifference(strName As String, vSource As Variant, vTarget As Variant) As String
      Dim strResult As String
      If vSource = vTarget Then
      Else 'Nein, Quelle und Ziel sind nicht identisch
         strResult = AuxImplode(vSource, " / ") 'erstmal alles in ein String   
         strResult = AuxRemoveLinebrakes(strResult, " ")
         strResult = "Changed Field '" & strName & "' (former value: '" & strResult & "')"
      End If
   End Function
   '-------------------------------------------------------------------------------------------------      
End Class

Hier brauch ich aber noch eben die ursprünglichen Feldinhalte, und dann auch die neuen Feldinhalte.
Matthias

A good programmer is someone who looks both ways before crossing a one-way street.


Offline TMC

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 3.660
  • Geschlecht: Männlich
  • meden agan
Re:Wie kann ich eine Klasse sinnvoll aufbauen ?
« Antwort #169 am: 07.07.04 - 23:22:28 »
Kommando zurück:

Ich habe glaub ich den Fehler gemacht, auf den bisherigen Code was aufzusetzen.

Was imho besser wäre, nochmal neu anzufangen.

- Man hat ein Dokument und öffnet dieses
- dabei schreibt man pro zu überwachendes Feld was in ein FieldObjekt (Name, Inhalt, etc.)
- Beim Speichern schreibt man zusätzlich die neuen Werte in die FieldObjekte und lässt sich die Unterschiede geben.

Der bisherige Codeteil ist dafür nicht wirklich brauchbar.
Ich glaube das beste ist es das ganze nochmal neu aufzusetzen.

Matthias

A good programmer is someone who looks both ways before crossing a one-way street.


Offline animate

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.540
  • Uh, I'm just gonna go find a cash machine.
    • LA2
Re:Wie kann ich eine Klasse sinnvoll aufbauen ?
« Antwort #170 am: 07.07.04 - 23:44:02 »
ich versuche mal zu beschreiben, was ich jetzt verstanden habe kombiniert mit dem, was ich mir dachte.

du sagst, du erstellst verschiedene Feld-Objekte. Das ist gut so.
Wo erstellst du die denn?
Ich dachte, dass das History-Objekt, diese Feld-Objekte erstellt.
Das History-Objekt holt sich (woher ist egal) eine Liste aller zu überwachender Felder.
Es erzeugt dann auf Basis dieser Liste alle nötigen Feld-Objekte und hält diese Objkete in einem Array (sozusagen als Membervariable)
Beim Erzeugen muss das History-Objekt ermitteln, welches spezielle Feld-Objekt  erzuegt werden muss.
Dem Konstruktor des Feld-Objekts wird das entsprechende NotesItem-Objekt als Parameter mitgegeben, das Feld-Objekt hält dieses NotesItem-Objekt als Membervariable.
Das Feld-Objekt holt sich dann seinen Initialwert aus diesem Feld. (Private Methode, die vom Konstruktor aufgerufen wird.

Wenn jetzt ein neuer History-Eintrag gemacht werden muss, dann tritt ja wieder unser History-Objekt in Aktion, es muss ja das HistoryEntry-Objekt erstellen.
Dem HistoryEntry-Objekt muss es allerdings den Text mitgeben, der im Eintrag stehen soll.
Deshalb fragt das History-Objekt nun alle seine Feld-Objekte:
"Gib mir doch bitte mal das Delta zwischen deinem Initialwert und dem, der jetzt in deinem NotesItem drin steht."
(Jetzt kommt das mit der Reihenfolge. Das verstehe ich nicht. Die ist ja immer die gleiche. Dieses Fragen ist eine Schleife über den Array mit den Feld-Objekten, und die verändern nicht die ihre Position innerhalb des Arrays)

So, die History bekommt von jedem Feld eine Antwort und erstellt daraus etwas Geeignetes, um es dem HistoryEntry zu übergeben, der das Ganze dann ins Dokument schreiben soll.

So, das wars.

Du hast recht, dass das ein paar mehr Zeilen Code sind.
Dafür gewinnst du ein sehr großes Maß an Flexibilität.

Du kannst, wenn die History mal etwas anders aussieht, als jetzt (1 Textfeld) immer noch deine Feldklassen einsetzen - unverändert.
Was du ändern musst ist, was die History mit dem Delta eines Felds macht bevor es an den HistoryEntry gegeben wird.

Ich versuche mal, am WE (muss schaun, ob ich Zeit hab) sowas in die letzte hier angehängte Version der DB einzubauen.
Thomas

Fortunately, I'm adhering to a pretty strict, uh, drug, uh, regimen to keep my mind, you know, uh, limber.

Offline animate

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.540
  • Uh, I'm just gonna go find a cash machine.
    • LA2
Re:Wie kann ich eine Klasse sinnvoll aufbauen ?
« Antwort #171 am: 07.07.04 - 23:45:16 »
- Man hat ein Dokument und öffnet dieses
- dabei schreibt man pro zu überwachendes Feld was in ein FieldObjekt (Name, Inhalt, etc.)
- Beim Speichern schreibt man zusätzlich die neuen Werte in die FieldObjekte und lässt sich die Unterschiede geben.

aha. von alleine draufgekommen. sehr schön.
Thomas

Fortunately, I'm adhering to a pretty strict, uh, drug, uh, regimen to keep my mind, you know, uh, limber.

Offline TMC

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 3.660
  • Geschlecht: Männlich
  • meden agan
Re:Wie kann ich eine Klasse sinnvoll aufbauen ?
« Antwort #172 am: 07.07.04 - 23:56:19 »
Vielen Dank, Thomas, für Deine Erklärung.

Habe es soweit glaub ich verstanden (incl. Reihenfolge, die ja easy über das Array der Field-Objekte gelöst wird).

Ich werde mal versuchen, das soweit selber hinzubekommen.
Dabei werde ich aber ein Ctrl+N im Client machen - also wohl nochmal neu anfangen mit den Klassen (da fällt mir das glaub ich leichter).
Matthias

A good programmer is someone who looks both ways before crossing a one-way street.


Offline TMC

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 3.660
  • Geschlecht: Männlich
  • meden agan
Re:Wie kann ich eine Klasse sinnvoll aufbauen ?
« Antwort #173 am: 10.07.04 - 16:13:47 »
Ich hab jetzt mal die Klasse "HistoryField" neu erstellt. Ich glaube hier brauchts gar keine Auftrennung Abstrakte Klasse / Unterklassen. Aber bestimmt noch an anderer Stelle der History-Klassen.

Code
Public Class HistoryField
   Private m_itmField As NotesItem
   Private m_strFieldTitle As String
   Private m_vInitialValue As Variant
   Private m_vNewValue As Variant   
   '-------------------------------------------------------------------------------------------------
   Public Sub new(itmField As NotesItem, strItemTitle As String)
      Dim iItemType As Integer      
      'Das Item und den Item-Titel in die Membervariable
      Set m_itmField = itmField
      m_strFieldTitle = strItemTitle
      '----> Den Iteminhalt auslesen
      m_vInitialValue = GetFieldValue()
      '<----
   End Sub
   '-------------------------------------------------------------------------------------------------
   Public Sub setInitialValue()
      'Setzt den aktuellen Feldinhalt als InitialValue. Vielleicht brauchen wir
      'das irgendwann einmal :-)
      m_vInitialValue = GetFieldValue() 
   End Sub
   '-------------------------------------------------------------------------------------------------
   '########################################################   
   'Get/Set-Methoden
   '-------------------------------------------------------------------------------------------------
   Public Property Get difference As String
      Dim strDiff As String      
      Dim iItemType As Integer
      
      'Der neue Iteminhalt
      m_vNewValue = GetFieldValue()
      
      '---> Item-Typ      
      On Error 91 Goto OBJECTNOTSET   'If it is a new doc and field is RTF
      iItemType = m_itmField.Type
      On Error Goto 0   'Fehlerbehandlungsroutine wieder zurücksetzen
      '<---
      
      Select Case iItemType
      Case RICHTEXT:
         If m_vInitialValue = m_vNewValue Then
            'Keine Feldänderung            
            strDiff = ""
         Else
            'Feldinhalt hat sich geändert
            strDiff = "Changed Richtext-Field '" & m_strFieldTitle & "'"            
         End If
      Case Else:
         m_vNewValue = m_itmField.Values
         If m_vInitialValue = m_vNewValue Then
            'Keine Feldänderung                        
            strDiff = ""
         Else
            'Feldinhalt hat sich geändert
            strDiff =    AuxImplode(m_vInitialValue, " / ") 'erstmal alles in ein String   
            strDiff = AuxRemoveLinebrakes(strDiff, " ")
            strDiff = "Changed Field '" & m_strFieldTitle & "' (former value: '" & strDiff & "')"
         End If
      End Select 'Case iItemType
      
      difference = strDiff
      
EXITSCRIPT:
      Exit Property
OBJECTNOTSET:      
      iItemType = RICHTEXT
      Resume Next
   End Property
   '########################################################
   '-------------------------------------------------------------------------------------------------   
   Private Function GetFieldValue() As Variant      
      'Den Item-Inhalt bzw. bei RTF Datum letzter Änderung auslesen .........
      Dim iItemType As Integer
      
      '-> Item-Typ      
      On Error 91 Goto OBJECTNOTSET   'If it is a new doc and field is RTF
      iItemType = m_itmField.Type
      On Error Goto 0   'Fehlerbehandlungsroutine wieder zurücksetzen
      '<-
      Select Case iItemType
      Case RICHTEXT:      
         GetFieldValue = m_itmField.LastModified
      Case Else:
         GetFieldValue = m_itmField.Values
      End Select
      '<----
EXITSCRIPT:
      Exit Function
OBJECTNOTSET:      
      GetFieldValue = "NEWRTF"
      Resume EXITSCRIPT   
   End Function
   '-------------------------------------------------------------------------------------------------   
   
   
End Class

Mit dem Rest mache ich noch gelegentlich weiter...

*Edit*
Hier hab ich noch die Klasse beschrieben:
« Letzte Änderung: 10.07.04 - 16:38:18 von TMC »
Matthias

A good programmer is someone who looks both ways before crossing a one-way street.


Offline animate

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.540
  • Uh, I'm just gonna go find a cash machine.
    • LA2
Re:Wie kann ich eine Klasse sinnvoll aufbauen ?
« Antwort #174 am: 10.07.04 - 17:41:19 »
Ich glaube hier brauchts gar keine Auftrennung Abstrakte Klasse / Unterklassen.

nun ja, du hast diese Aufteilung in der Klasse gemacht. In mehreren Methoden sogar.
Lass da mal, rein theoretisch, noch ein paar Fälle dazu kommen. Dann wirds unangenehm.
Also: eine weitere Feldart kommt dazu. Du musst Änderungen an deiner Klasse machen und diese Klasse für alle Feldarten nochmal testen (kann ja sein, dass da was schiefgelaufen ist).

Wenn du die Unterscheidung durch verschiedene Subklassen machst, dann siehts so aus:
Neue Klasse, Funktionalität implementieren (musst du ja bei der ARt, die du gewählt hast, auch), diese (und nur diese) Klasse testen. Die bereits funktionierenden Klassen werden nicht angerührt.
Das ist nur ein Vorteil.
Thomas

Fortunately, I'm adhering to a pretty strict, uh, drug, uh, regimen to keep my mind, you know, uh, limber.

Offline TMC

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 3.660
  • Geschlecht: Männlich
  • meden agan
Re:Wie kann ich eine Klasse sinnvoll aufbauen ?
« Antwort #175 am: 10.07.04 - 17:48:58 »
Stimmt, Thomas  ::)

Allerdings macht es dann wohl nicht Sinn, mit einer abstrakten Klasse zu arbeiten, oder?

Ich will die Entscheidung, um welches Feld es sich handelt nicht der Routine überlassen, die das Feld-Objekt erstellt. Somit fällt wohl das Konstrukt

aus.

Ergo erstelle ich ein Objekt, und das Objekt muss dann je nach Feldtyp (Text, RTF, Datum etc.) entsprechendes machen und mir mit Call Field.difference den Unterschied geben.

Wie würdest Du das machen? Gleich im Konstruktor eine Select Case einbauen und dann je nach Feldtyp entsprechende Field-Text/RTF/Datum etc. - Objekte erzeugen?
Matthias

A good programmer is someone who looks both ways before crossing a one-way street.


Offline animate

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.540
  • Uh, I'm just gonna go find a cash machine.
    • LA2
Re:Wie kann ich eine Klasse sinnvoll aufbauen ?
« Antwort #176 am: 10.07.04 - 17:58:53 »
das macht üblicherweise eine sog. Factory.

Das ist eine Klasse, deren einzige Aufgabe es ist, Objekte zu erzeugen.

So in der Art:

Class FieldFactory

   Public Function getInstance(item As NotesItem) As HistoryField
      Select Case item.Type
         Case 1
            Set getInstance = New RTHistoryField()
         Case Else
            REM your code goes here
      End Select
   End Function

End Class
Thomas

Fortunately, I'm adhering to a pretty strict, uh, drug, uh, regimen to keep my mind, you know, uh, limber.

Offline TMC

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 3.660
  • Geschlecht: Männlich
  • meden agan
Re:Wie kann ich eine Klasse sinnvoll aufbauen ?
« Antwort #177 am: 10.07.04 - 18:12:14 »
Danke Thomas, die Fabrik ist wohl genau das was wir hier brauchen  :)

Hab aber noch ein paar Fragen:

* Wie würde ein UML-Diagramm hierzu aussehen ? (habe im Index von Oestereich's Buch [OO SW-Entwicklung] nix gefunden zu Factory)
* Was macht dann die HistoryField Klasse überhaupt noch?
Matthias

A good programmer is someone who looks both ways before crossing a one-way street.


Offline animate

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.540
  • Uh, I'm just gonna go find a cash machine.
    • LA2
Re:Wie kann ich eine Klasse sinnvoll aufbauen ?
« Antwort #178 am: 10.07.04 - 18:24:15 »
du musst in das bisherige UML DIagramm nur noch die Factory-Klasse dazu malen. Sie hat keine Assoziationen zu anderen Klassen.

Die Feld-Klassen tun das Gleiche, was sie jetzt auch tun: Unterschiede vergleichen und dem Aufrufer zurückgeben.
Thomas

Fortunately, I'm adhering to a pretty strict, uh, drug, uh, regimen to keep my mind, you know, uh, limber.

Offline animate

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.540
  • Uh, I'm just gonna go find a cash machine.
    • LA2
Re:Wie kann ich eine Klasse sinnvoll aufbauen ?
« Antwort #179 am: 10.07.04 - 18:33:12 »
Factory ist ein "Design Pattern".
Schlaue Leute haben bemerkt, dass manche Probleme beim SW-Design immer wieder kehren und haben dafür allgemeingültige oo Lösungen zusammengefasst - die Design Patterns.
Standardbuch dazu ist das hier: http://www.amazon.de/exec/obidos/ASIN/3827318629/ref=lpr_g_1/302-7117918-1136836
Ok, das ist die deutsche Version, Original ist in Englisch geschrieben. Ist wohl ein Buch für etwas Fortgeschrittene. Kann aber auch einem weniger Fortgeschrittenem nix schaden. Im Gegenteil.
Es gibt auch Analyse-Muster. Für immer widerkehrende Probleme, auf die du in der Analyse triffst (hier drin sind unter Anderem ein paar beschrieben: http://www.amazon.de/exec/obidos/ASIN/3827402859/qid=1089476915/sr=2-1/ref=sr_2_11_1/302-7117918-1136836)
Das habe ich glaube ich schonmal empfohlen. Das ist ein gutes Lehrbuch. Hat sogar mir bis über die Mitte des Buchs hinaus gefallen.
Thomas

Fortunately, I'm adhering to a pretty strict, uh, drug, uh, regimen to keep my mind, you know, uh, limber.

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz