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:
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:
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:
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 &&:
if ((false) & (x.val ==4))
Ist das "AND" in Lotus Script wie "&&" oder wie "&" in Java?
also
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
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:
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
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:
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
Jo, bei OR sowieso. Aber auch bei AND wird fleissig weiter ausgewertet:
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
out of topic:
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:
short circuit
not short circuit
KindOfTest.giveTrue() called.