Das Notes Forum

Domino 9 und frühere Versionen => Entwicklung => Thema gestartet von: Marinero Atlántico am 16.02.05 - 20:51:24

Titel: doc.Responses kann nothing retunieren?
Beitrag von: Marinero Atlántico 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
Titel: Re: doc.Responses kann nothing retunieren?
Beitrag von: Glombi 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
Titel: Re: doc.Responses kann nothing retunieren?
Beitrag von: koehlerbv 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
Titel: Re: doc.Responses kann nothing retunieren?
Beitrag von: Glombi 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
Titel: Re: doc.Responses kann nothing retunieren?
Beitrag von: Marinero Atlántico 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
Titel: Re: doc.Responses kann nothing retunieren?
Beitrag von: TMC 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
Titel: Re: doc.Responses kann nothing retunieren?
Beitrag von: Semeaphoros 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).
Titel: Re: doc.Responses kann nothing retunieren?
Beitrag von: koehlerbv 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
Titel: Re: doc.Responses kann nothing retunieren?
Beitrag von: Marinero Atlántico 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.
Titel: Re: doc.Responses kann nothing retunieren?
Beitrag von: koehlerbv 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
Titel: Re: doc.Responses kann nothing retunieren?
Beitrag von: Marinero Atlántico 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
Titel: Re: doc.Responses kann nothing retunieren?
Beitrag von: Semeaphoros 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 .......
Titel: Re: doc.Responses kann nothing retunieren?
Beitrag von: Semeaphoros 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 ........
Titel: Re: doc.Responses kann nothing retunieren?
Beitrag von: Marinero Atlántico 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

 
Titel: Re: doc.Responses kann nothing retunieren?
Beitrag von: koehlerbv 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
Titel: Re: doc.Responses kann nothing retunieren?
Beitrag von: animate 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.
Titel: Re: doc.Responses kann nothing retunieren?
Beitrag von: koehlerbv 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 !"
Titel: Re: doc.Responses kann nothing retunieren?
Beitrag von: Glombi 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   
Titel: Re: doc.Responses kann nothing retunieren?
Beitrag von: Marinero Atlántico 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.
Titel: Re: doc.Responses kann nothing retunieren?
Beitrag von: Glombi 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
Titel: Re: doc.Responses kann nothing retunieren?
Beitrag von: Semeaphoros am 16.02.05 - 22:56:11
Bernhard, genau das wollte ich wissen, was jetzt durch Thomas und Andreas beantwortet wurde und von Dir bestätigt. Da es ungewöhnlich gewesen wäre, hätte man das auch in der Hilfe entsprechend finden müssen, deshalb war ich so skeptisch. Es war wichtig, dass wir das geklärt haben, siehe Seiteneffekte (denen ich natürlich - wie schon gesagt - auch versuche aus dem Weg zu gehen ... man hat das - wie Axel gezeigt hat - aber nicht immer selber im Griff)
Titel: Re: doc.Responses kann nothing retunieren?
Beitrag von: koehlerbv am 16.02.05 - 22:57:19
Jo, bei OR sowieso. Aber auch bei AND wird fleissig weiter ausgewertet:

Code
Sub Click (Source As Button)
	
	Dim session As New NotesSession
	Dim dbCurrent As NotesDatabase
	Dim viewLookup As NotesView
	
	Set dbCurrent = Session.CurrentDatabase
	Set viewLookup = dbCurrent.GetView ("Gibt es nicht")
	
	If Not (viewLookup Is Nothing) And (viewLookup.Name = "ABC") Then
		Messagebox "Dumm gelaufen !"
	End If
	
End Sub

Da es die Ansicht "Gibt es nicht" wirklich nicht gibt, sollte eigentlich bei der ersten Bedingung abgebrochen werden. Tut es aber nicht.

Sorry nochmals für den Schwachfug, den ich vorher geschrieben habe.

Bernhard
Titel: Re: doc.Responses kann nothing retunieren?
Beitrag von: Marinero Atlántico am 16.02.05 - 23:08:03
out of topic:
Code
public class KindOfTest {
    
    /**
     * method which allways returns true. 
     * @return allways true
     */
    private static boolean giveTrue() {
        System.out.println("KindOfTest.giveTrue() called.");
        return true; 
    }
    
    public static void main(String[] args) {
        // starts here
        System.out.println("short circuit");
        if ((false) && (giveTrue())) {
            // do nothing
        }
        System.out.println("not short circuit");
        if ((false) & giveTrue()) {
            // do nothing
        }
        
    }
}
ergibt:
Code
short circuit
not short circuit
KindOfTest.giveTrue() called.