Domino 9 und frühere Versionen > ND6: Entwicklung

Gültigkeit von Variablen

<< < (3/5) > >>

BigWim:
@Markus

Ich gebe Dir natürlich vollkommen Recht. Da es in dieser Funktion aber "nur" um das Drumherum geht; die eigentliche Berechnung findet in einer Klasse steht, dachte und hoffte ich mir hier, den Aufwand sparen zu können. Aber ....

Markus

koehlerbv:

--- Zitat von: BigWim am 13.03.09 - 10:28:45 ---... und so ganz verstehe ich das nicht.
--- Ende Zitat ---

Hallo Markus,

stell Dir vor, Du gehst durch die Stadt und quatschst ein wildfremdes Kind an und teilst diesem mit, dass Du sein Vater bist: Das Kind zeigt Dir einen Vogel  ;D

Würdest Du hingegen Deiner Sub als Parameter auch die zugehörige View mit übergeben und sich dann bei Set NotesDocument Dich wiederum darauf beziehen, dann klappt das auch mit der Vererbung.

Bernhard

MadMetzger:
An der Stelle ist auch keine Vererbung im Spiel. Es geht an der Stelle um eine Assoziation, die aber wiederum bei Bernhards Beschreibung dann richtig besetzt ist. Ich finde die Bezeichnungen child und parent legen hier begrifflich eine Vererbung nahe, dabei ist es einfach keine. Oder kannst du an jeder Stelle das Notesdokument verwenden, wo eine View verwendet wurde? ... Nein, natürlich nicht, denn Notesdocument ist keine Unterklasse Notesview.

Ich denke nämlich nicht, dass Notesdocument so declariert ist (Bitte nagelt mich nicht auf Syntax fest, aber so war doch Vererbung in LS, oder?):

--- Code: ---public class Notesdocument As NotesView
...
end class

--- Ende Code ---

@Markus: Offensichtlich sparst du durch diesen Code keinen Aufwand, wie wir hier ja gerade sehen. Selbst wenn die Funktion zum Berechnen nur die Klasse verwendet, wäre das schon eine sinnvolle Trennung, in Iteration, Aufruf der Logik und Ausführung der Logik.

BigWim:
Hallo Bernhard, hallo Markus,

Wow, da habe ich ja was losgetreten. Ein NotesDocument und eine NotesView haben zunächst einmal gar nichts miteinander zu tun. Aber NotesDocument benötige ich, wenn ich an die Items will, die in der View angezeigt werden. Das Prinzip der Vererbung verstehe ich ja - glaube ich zumindest, aber meiner Meinung darf es bei der Deklaration keinen Unterschied geben. Offensichtlich ist ein Unterschied, ob ich mein Objekt im Funktionsaufruf deklariere, also

Sub Funktion (docTmp as Notesdocument)
End Sub

oder innerhalb einer Funktion, also

Sub Funktion
    Dim docTmp as Notesdocument
End Sub


Macht Euch bitte nicht so viel Mühe. Ich habe es jetzt umgeschrieben es läuft. Aber wenn es euch interessiert, ich wette, es funktioniert auch bei Euch nicht, wenn ihr folgendes probiert.

call Test (nothing)

Sub Test (docTmp es Notesdocument)
      Dim uiws as new notesuiworkspace
      Dim viewCheck as notesview

      Set viewCheck = uiws.currentview.view
      Set docTmp = viewCheck.GetFirstDocument

      if docTmp is nothing then
            Print "er hat Recht"
      else
            Print "er ist doch zu doof, dass zu verstehen"
      endif

End Sub

Vielen Dank & viele Grüße
Markus






Für Interessierte - ich versuche mal meinen Gedankengang ein wenig ausführlich zu beschreiben, wie es überhaupt zu dieser Situation gekommen ist:


Um weitere Umbauarbeiten in der Datenbank zu vermeiden, habe ich die Funktion erweitert, um zwei Anwendungsfälle abzubilden, die eigentlich gar nichts mit einander zu tun haben.


Ich hatte bereits eine Funktion, die die Neuberechnung durchführt, nämlich die Version "Alle Dokumente in einer bestimmten View".

Nun kam ein Berechnungssimulator dazu und verschiedene Stati, die in diversen Views dargestellt wurden. Da ich die Funktionsaufrufe eh anpassen mußte, habe ich den Funktionsaufruf gleich um zwei Parameter erweitert, nämlich ....

- Fall 1: eine View berechnen. Dafür übergebe nur den Namen, des Rest konnte die Funktion ja schon.
- Fall 2: übergebe ein bestimmtes Dokument und berechne. Konnte die Funktion bisher nicht.

Nach der Erweiterung hatte ich jetzt zwei NotesDocument deklarationen.

a) einmal die aus Fall1: da ich ja an die Dokumente in der View wollte. Besagtes Set docCheck = view.GetFirstDocument

b) neu aus Fall 2: das übergebene neuzuberechende Dokument Sub Ber... (docCheck as NotesDokument, ...)

damit hatte ich zweimal docCheck as Notesdocument deklariert.

Ok, dachte ich mir in meinem jugendlichen Leichtsinn. Lösche das Dim docCheck as Notesdocument aus Fall 1, da ja docCheck jetzt über die Funktionsparameter deklariert wird.

Und dieser Fall führte ohne weitere Codeänderung dazu, dass jetzt "plötzlich" das Set docCheck = view.GetFirstDocument vor der While Schleife IMMER nothing zurücklieferte. Wirklich Immer. Und erst, wenn ich das NotesDocument innerhalb der Funktion mittels DIM deklariere, liefert mir GetFirstDocument das erste Dokument zurück.

Und meine tiefste innere Überzeugung ist, dass GetFirstDocument nach wie vor richtig arbeitet, aber das Rückgabeergebnis meinem Objekt nicht zuweisen kann - weil es als Funktionsparameter definiert wurde?

MadMetzger:
Ha! Jetzt fällt es mir wie Schuppen von den Augen... Dann scheinen Parameter in LS gemäß Java-Sprache final zu sein, also kann der Wert nicht mehr überschrieben werden. Daher weht hier wohl der Wind. Was lernen wir nun daraus? Missbrauche niemals einen Funktionsparameter als lokale Variable.

Navigation

[0] Themen-Index

[#] Nächste Seite

[*] Vorherige Sete

Zur normalen Ansicht wechseln