Autor Thema: doc.Responses kann nothing retunieren?  (Gelesen 5434 mal)

Marinero Atlántico

  • Gast
doc.Responses kann nothing retunieren?
« am: 16.02.05 - 20:51:24 »
Hi,

laut Doku und meiner Erfahrung gibt
doc.Responses eine leere NotesDocumentCollection zurück, wenn das Dokument keine Antwortdokumente hat.
Nun hat es aber offenbar einen Fall gegeben, wo es nothing zurückgegeben hat, so dass:
Code
colMy = docResponses
if colMy.count > 0 then 
' und_so_weiter
in eine ObjectVariableNotSet terminierte (in colMy.count).
Man kann da einen Nothing-check machen, was ich in Zukunft auch zu tun gedenke:
Code
colMy = docResponses
if not colMy is Nothing then 
if colMy.count > 0 then 
' und_so_weiter

Habt ihr sowas schon mal erlebt ??? Ist das normal ?
Ist theoretisch nicht auszuschliessen, dass jemand ein bischen am code gedreht hat, was ich aber nicht glaube.


Wo wir gerade dabei sind. Kann man das eigentlich zusammenziehen?
In Java ist das so das so:
Code
if ((false) && (x.val ==4)) 
Wenn die erste Bedingung falsch ist, wird die 2. gar nicht mehr ausgeführt.
Bei dem nächsten Beispiel werden beide ausgeführt auch wenn die erste false ergibt (nur 1 & und oben &&:
Code
if ((false) & (x.val ==4)) 
Ist das "AND" in Lotus Script wie "&&" oder wie "&" in Java? 
also
Code
colMy = docResponses
if (not colMy is Nothing) AND (colMy.count > 0) then 
wäre nothing-safe, weil der 2. Term gar nicht mehr berechnet wird, wenn der 1. false zurückgibt?

[zunehmend_out_of_topic/]
langsam verstehe ich, dass die Vehemenz, mit der manche Leute letztes Jahr in Java auf das NullObjectPattern hingewiesen haben, einen ernsten Hintergrund hat.

Axel
« Letzte Änderung: 16.02.05 - 20:53:06 von Marinero Atlántico »

Glombi

  • Gast
Re: doc.Responses kann nothing retunieren?
« Antwort #1 am: 16.02.05 - 20:56:52 »
Ohne jetzt spezifisch auf Dein erstes Problem einzugehen, habe ich Unterschiede zwischen R5 und R6 festgestellt. Ich hoffe es zu finden und würde es dann posten.

Deinen Fall kann ich morgen mal mit R5 und R6 testen (sofern mir keiner hier zuvorkommt) und dann das Ergebnis posten.

Bzgl. der Auswertungsreihenfolge von if muss ich mal schauen, so aus dem Stehgreif weiss ich es erlich gesagt nicht.

Andreas

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: doc.Responses kann nothing retunieren?
« Antwort #2 am: 16.02.05 - 20:57:47 »
Kurze Antwort - hoffentlich trotzdem vollständig:

Code
colMy = docResponses

docResponses müsste ja schon eine NotesDocumentCollection sein. Wenn sie erst gebildet wird, muss es doc PUNKT Responses heissen.

Und ja: Sowas sollte man immer abfangen. Lieber hundertmal mehr als einmal zuwenig.

Und weiterhin ja: Du kannst mit AND wie in Java zusammenfassen. Sowie eine Bedingung in der Abarbeitungsreihenfolge nicht stimmt, wird abgebrochen.

Bernhard

Glombi

  • Gast
Re: doc.Responses kann nothing retunieren?
« Antwort #3 am: 16.02.05 - 21:00:17 »
Das heisst, der Interpretor geht von links nach rechts und wertet erstmal jede Condition aus? Bei False wird dann abgebrochen? Das wäre aber nur bei AND sinnvoll.

Andreas

Marinero Atlántico

  • Gast
Re: doc.Responses kann nothing retunieren?
« Antwort #4 am: 16.02.05 - 21:08:09 »
docResponses müsste ja schon eine NotesDocumentCollection sein. Wenn sie erst gebildet wird, muss es doc PUNKT Responses heissen.
Sorry. Typoe.
Ich kenne die Bedeutung von .  ;D

Also es ist wie && in Java (nicht &). Heisst "short circuit binary operator" oder so ähnlich.
Ich meinte auch sowas gehört zu haben, dass es wie "&&" ist.
Das macht nur bei AND Sinn. Bei checks auf nothing oder null ist das aber tendentiell praktisch.

Ich bin auch dafür so was generell abzuchecken. Ich denke, dass ich das normalerweise abchecke.
Der Nutzen von sichereren code ist hier auf jeden Fall höher als die Kosten von "macht es ein bischen unübersichtlicher".

Axel
« Letzte Änderung: 16.02.05 - 21:15:17 von Marinero Atlántico »

Offline TMC

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 3.660
  • Geschlecht: Männlich
  • meden agan
Re: doc.Responses kann nothing retunieren?
« Antwort #5 am: 16.02.05 - 21:09:41 »
if ((false) && (x.val ==4))

Kann sein dass ich mich jetzt komplett irre.

Aber in LS müssze doch sowohl FALSE erfüllt sein UND ZUGLEICH müsste val=4 sein, damit die If-Bedingung ausgeführt wird.
Wenn False schon reicht, muss man doch verschachteln, oder?

If (false) Then
   If (x.val = 4) Then

Zumindest hab ich das so immer gemacht, weil ich es auch nicht 100% wusste.
Gute Frage.
Matthias
Matthias

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


Offline Semeaphoros

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 8.152
  • Geschlecht: Männlich
  • ho semeaphoros - agr.: der Notesträger
    • LIGONET GmbH
Re: doc.Responses kann nothing retunieren?
« Antwort #6 am: 16.02.05 - 21:10:06 »
Also, Andreas, das tut er sicher nicht, es gibt noch eine "Precedence of operators", und die findet man in der Hilfe. Was ich dort aber nicht gefunden habe, ist die Angabe Bernhards, dass LS eine unvollständige Evaluation durchführt (was ungewöhnlich wäre und Seiteneffekte produziert, wenn einer der Operanden nicht ein einfacher Wert, sondern zum Bleistift ein Funktionsaufruf darstellt) oder eine vollständige. Und ja, Andreas hat Recht, eine unvollständige Evaluation ist nur bei AND möglich und bedingt damit einen "highly optimising precompiler", den es bei interpretiertem Basic oder p-Code Basic normalerweise nicht gibt (weil zu komplex).
« Letzte Änderung: 16.02.05 - 21:12:44 von Semeaphoros »
Jens-B. Augustiny

Beratung und Unterstützung für Notes und Domino Infrastruktur und Anwendungen

Homepage: http://www.ligonet.ch

IBM Certified Advanced Application Developer - Lotus Notes and Domino 7 und 6
IBM Certified Advanced System Administrator - Lotus Notes and Domino 7 und 6

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: doc.Responses kann nothing retunieren?
« Antwort #7 am: 16.02.05 - 21:15:33 »
Das heisst, der Interpretor geht von links nach rechts und wertet erstmal jede Condition aus? Bei False wird dann abgebrochen? Das wäre aber nur bei AND sinnvoll.

Andreas

Jo, das funktioniert - wie geschrieben - natürlich nur mit AND. Trotzdem prüfe ich in der Regel verschachtelt, da man ja nicht immer die Wahrscheinlichkeit der erwarteten Abbruchbedingung voraussehen kann. Abgesehen davon ist das sauberer und lesbarer (wenn auch mit dem Handicap der Verschachtelungen ...).

Bernhard

Bernhard

Marinero Atlántico

  • Gast
Re: doc.Responses kann nothing retunieren?
« Antwort #8 am: 16.02.05 - 21:20:34 »
wenn einer der Operanden nicht ein einfacher Wert, sondern zum Bleistift ein Funktionsaufruf darstellt
Wenn der erste Operand false ist, dann müsste der Funktionsaufruf nicht mehr aufgerufen werden.
Es sei denn, er verändert Variablen, Objekte, die von der aufrufenden Funktion und der aufgerufenen Funktion gemeinsam benutzt werden. Das wären dann globale Variablen.
Ich würde das als schlechten Programmierstil ansehen. Eine Funktion sollte einen Rückgabewert liefern.

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: doc.Responses kann nothing retunieren?
« Antwort #9 am: 16.02.05 - 21:33:48 »
Ich würde das als schlechten Programmierstil ansehen. Eine Funktion sollte einen Rückgabewert liefern.

Das wäre auch aus meiner Sicht katastrophaler Programmierstil. Und tut nicht noooot.

Bernhard

Marinero Atlántico

  • Gast
Re: doc.Responses kann nothing retunieren?
« Antwort #10 am: 16.02.05 - 21:59:32 »
Das wäre auch aus meiner Sicht katastrophaler Programmierstil. Und tut nicht noooot.
Wenn untergeordnete Funktionen die Werte vieler globale Variablen (inklusive Felder in Notes Dokumenten) ändern, führt dies unweigerlich zu starken Seiteneffekten.
Ein Reaktion auf sich sowieso immer verändernde requirements wird dadurch erschwert.
In jedem Fall würde ich eine solche Methode nicht aus dem Begingungskopf eines if then aufrufen.

Eher so:
Code
ret = callLongFunctionIwouldNotUseInJava (someArguments)
if (xxx = true) AND ret then

Im übrigen sollte sich jedes code-Element durch high cohesion, low coupling auszeichnen.

Das tut meiner Ansicht nach schwer nooooot.

Axel

Offline Semeaphoros

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 8.152
  • Geschlecht: Männlich
  • ho semeaphoros - agr.: der Notesträger
    • LIGONET GmbH
Re: doc.Responses kann nothing retunieren?
« Antwort #11 am: 16.02.05 - 22:01:29 »
Wenn man das selber ohne Grund macht, ist das so, es gibt aber auch andere Nebeneffekte, die ihren Grund teilweise in OO finden: instanziierte  Object-Members, zum Bleistift UIDocDotDocument, vielleicht ist Euch im Debugger schon aufgefallen, dass gewisse dieser Members erst ihre Objekte instanziieren, wenn sie angesprochen werden. Leider gibt es Situationen, wo das nicht korrekt funktioniert, und das führt zu Code, der stürzt, wenn die Instanz erst erstellt werden muss und nicht stürzt, wenn die Instanz schon existiert (hatte so einen SPR mal bei IBM angemeldet, ist also nicht aus der Luft gegriffen). Da stellt sich dann schon die Frage,  ob sowas dann durchgeführt wird oder nicht.

Deshalb, Bernhard, auch meine Frage: "Are you sure" und wenn ja, wo ist das bestätigt? Das kann sehr wesentlich sein ......

Damit ist natürlich auch gesagt, dass ich es tunlichst vermeide, selber Verursacher solcher Seiteneffekte zu sein .......
Jens-B. Augustiny

Beratung und Unterstützung für Notes und Domino Infrastruktur und Anwendungen

Homepage: http://www.ligonet.ch

IBM Certified Advanced Application Developer - Lotus Notes and Domino 7 und 6
IBM Certified Advanced System Administrator - Lotus Notes and Domino 7 und 6

Offline Semeaphoros

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 8.152
  • Geschlecht: Männlich
  • ho semeaphoros - agr.: der Notesträger
    • LIGONET GmbH
Re: doc.Responses kann nothing retunieren?
« Antwort #12 am: 16.02.05 - 22:03:38 »
Axel, das ist die richtige Reaktion, wenn man selber alles im Griff hat und um den Seiteneffekt weiss, nur, das ist nicht immer gegeben ..... ich glaube, ich könnte Beispiele nennen von Leuten, die von solchen Effekten keine Ahnung haben ........
Jens-B. Augustiny

Beratung und Unterstützung für Notes und Domino Infrastruktur und Anwendungen

Homepage: http://www.ligonet.ch

IBM Certified Advanced Application Developer - Lotus Notes and Domino 7 und 6
IBM Certified Advanced System Administrator - Lotus Notes and Domino 7 und 6

Marinero Atlántico

  • Gast
Re: doc.Responses kann nothing retunieren?
« Antwort #13 am: 16.02.05 - 22:14:11 »
Jens. Ich arbeite mit Legacy Code in einem Projekt, dass seit ca. 1997 läuft (zeitweise auf Sparflamme). Es ist kein Gemurkse, aber es ist völlig natürlich, dass ich da schon eine Menge mit Seiteneffekten zu tun habe.

Heute z.B.: computeWithForm() auf Dokumente eines Maskentyps mit vielen Feldern funktionierte nicht und dann wollte erst einmal die Umsetzungsformel gefunden werden, in der die schöne Formel:
Code
feldX + "noch was " + feldY
stand. feldX ist zwischenzeitlich in ein RichText-Feld geändert worden.
Sowas passiert schnell. Wobei das ein Seiteneffekt im Kontext von Datenstrukturen/Datentypen ist (anders als Funktionen).

Im übrigen haben wir schnell unterschiedliche Assoziationen im Kopf.
Ich würd aber tendentiell globale Variablen (inklusive Felder im Dokument) normalerweise immer durch eine Funktion (meist initialize) setzen und die anderen mehr als Hilfsmethoden ansehen. Es gibt aber sicher Ausnahmen.

Gruß Axel

 

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: doc.Responses kann nothing retunieren?
« Antwort #14 am: 16.02.05 - 22:24:25 »
Deshalb, Bernhard, auch meine Frage: "Are you sure" und wenn ja, wo ist das bestätigt? Das kann sehr wesentlich sein ......

Sorry, Jens, aber mein Tag war lang und hart (und erfolgreich  ;)), vielleicht verstehe ich deshalb Deine Frage nicht. Kannst Du mir da nochmal auf die Sprünge helfen ?

Bernhard

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: doc.Responses kann nothing retunieren?
« Antwort #15 am: 16.02.05 - 22:25:31 »
Und weiterhin ja: Du kannst mit AND wie in Java zusammenfassen. Sowie eine Bedingung in der Abarbeitungsreihenfolge nicht stimmt, wird abgebrochen.

bist du dir da echt sicher? ich kanns leider mangels Notes-Client nicht nachprüfen. Ich habe aber noch im Kopf dass dies hier

Dim doc As NotesDocument
...
If Not doc Is Nothing And doc.GetItemValue("Wert")(0) = "0" Then
...
End If

einen Object Variable Not Set - Fehler erzeugt, wenn doc eben Nothing ist (statt dem GetItemValue kann eine beliebige Methode/beliebiges Attribut eingesetzt werden). Das würde bedeuten, dass alle Bedingungen ausgewertet werden.
Ich weiß es aber echt nicht mehr genau, obs in LS so ist. In VB ist es 100% so.
Thomas

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

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: doc.Responses kann nothing retunieren?
« Antwort #16 am: 16.02.05 - 22:41:16 »
Ich rudere gerade heftigst in die Gegenrichtung - das mit dem Abbruch der Auswertung bei AND-Verknüpfungen nach der ersten Nichterfüllung einer Bedingung stimmt NICHT !

Mea culpa.

Bernhard

PS: Man sollte nicht "nebenbei" schreiben. Nochmals "Sorry @All !"

Glombi

  • Gast
Re: doc.Responses kann nothing retunieren?
« Antwort #17 am: 16.02.05 - 22:44:00 »
Ich habe folgenden Code:

Dim doc As NotesDocument
If False Or doc.Form(0) = "Egal" Then
   Msgbox "Or geht"
End If

Ergebnis: Object variable not set


Erge: Notes wertet - auch bei OR - mal zunächst alle Conditions aus und prüft dann erst auf True oder False.

Andreas   

Marinero Atlántico

  • Gast
Re: doc.Responses kann nothing retunieren?
« Antwort #18 am: 16.02.05 - 22:52:23 »
Andreas:
Bei OR muss das auch so sein. Bei EXKLUSIV ODER (genau eine der beiden Bedingungen muss true, die andere false sein) auch.
Nur bei AND ist diese short circuit evaluation logisch möglich.
(a==4) && (b==3)
Wenn a den Wert 5 enthält braucht der andere Operand nicht mehr geprüft werden. Der gesamte Boolsche Ausdruck ergibt immer FALSE (weil eben AND).
Bei Oder ist das schon wie gesagt von der grundlegenden Logik anders.
Wenn a den Wert 5 hat kann b trotzdem den Wert 3 haben und der gesamte boolsche Ausdruck ist insgesamt TRUE.   

In Java, C## und sicher einer Menge anderer Programmiersprachen gibt es deshalb oft 2 solcher Operatoren. Einer mit short circuit evaluation. Der andere ohne. Wobei && gebräuchlicher, weil auch minimal performanter ist.

Liegt irgendwie auf der Hand.
« Letzte Änderung: 16.02.05 - 22:56:23 von Marinero Atlántico »

Glombi

  • Gast
Re: doc.Responses kann nothing retunieren?
« Antwort #19 am: 16.02.05 - 22:55:46 »
Sorry, es ist auch:

Dim doc As NotesDocument
If False and doc.Form(0) = "Egal" Then
   Msgbox "And geht"
End If

Ergebnis: Object variable not set

Andreas

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz