Funktionsaufruf zu lang?

  • Hi allerseits,


    als Admin und engagierter Hobbyprogrammierer hab ich mir auf dem Entwicklercamp viele spannende Dinge zum Thema 'Performance' in der LS- und Formelprogrammierung angehört. Und als gefolgsamer Schüler dachte ich, ich könnte das Gehörte auch mal in der Praxis umsetzen. Allerdings scheine ich doch eher "Hobby" als "Programmierer" zu sein...


    Ich hab in der ScriptLib "CoreEmailClasses" in der Klasse "UIMemoDocument" und dort in der Sub "InsertSignature" rumgepfuscht und wollte etwas schreiben wie

    Code
    text=Me.m_session.CurrentDatabase.GetView("View").GetFirstdocument.GetFirstItem("Item").Text


    Da krieg ich nur ein "Object variable not set" zurück.
    Funktionieren hingegen tut

    Code
    Set doc = Me.m_session.CurrentDatabase.GetView("View").GetFirstdocument
    text = doc.GetFirstItem("Item").Text


    Den Aufruf so umzugestalten, dass er bis inklusive GetFirstItem geht um dann per item.Text dranzugehen, tut auch nicht: selbige Meldung.
    Ist der Aufruf schlicht und ergreifend zu lang, oder wo ist mein Denkfehler?


    Thx in advance
    RW

    Life is not a journey to the grave with the intention of arriving safely in a pretty and well-preserved body, but rather to skid in broadside, thoroughly used up, totally worn out, and loudly proclaiming "Wow, what a ride!!! :evil:
    Beschleunigung ist, wenn die Tränen der Ergriffenheit waagrecht zum Ohr hin abfliessen - Walter Röhrl

    • Offizieller Beitrag

    hast Du es mal andersrum versucht?

    Code
    Set view = Me.m_session.CurrentDatabase.GetView("View")
    text = view.GetFirstdocument.GetFirstItem("Item").Text

    funktioniert dies?


    Also ich bin da noch in keine Grenze reingelaufen, wobei ich solche Konstrukte nicht mag, dann wenn Du in 5 Jahren das Script wieder anfasst, brauchst Du oder ein anderer Entwickler wesentlich länger um der Objekt-Kette zu folgen.


    Außerdem ist es aus 'Performance'-Sicht immer besser, wenn ein Objekt mehrfach benötigt wird, dies als Objekt-Variable direkt zugreifbar zu machen.


    Gruß
    Dirk

    Rein logisches Denken verschafft uns keine Erkenntnis über die wirkliche Welt.
    Alle Erkenntnis der Wirklichkeit beginnt mit der Erfahrung und endet mit ihr.
    Alle Aussagen, zu denen man auf rein logischen Wegen kommt, sind, was die Realität angeht, vollkommen leer.
    Albert Einstein

  • Dein Vorschlag funktioniert, ist ja ein Aufruf weniger wie meiner, der das Maximum darzustellen scheint.
    Mehrfach benötigen tu ich das hier nicht, ich muss nur einmal den Text des Feldes auslesen, bischen verdrehen und dann als Sig ins Memo klatschen.

    Life is not a journey to the grave with the intention of arriving safely in a pretty and well-preserved body, but rather to skid in broadside, thoroughly used up, totally worn out, and loudly proclaiming "Wow, what a ride!!! :evil:
    Beschleunigung ist, wenn die Tränen der Ergriffenheit waagrecht zum Ohr hin abfliessen - Walter Röhrl

    • Offizieller Beitrag

    habs mal mit

    Code
    Dim ses As New NotesSession
    Dim text As String
    
    
    text = ses.CurrentDatabase.GetView("($Sent)").Parent.GetView("($Inbox)").GetFirstdocument.GetFirstItem("Subject").Text 
    Print text
    Stop

    in meiner Mail-DB probiert => funktioniert und ich habe ein Element mehr in der Objekt-Kette.


    Über den (Un)Sinn meines Beispiel-Codes möchte ich nicht diskutieren.


    Gruß
    Dirk

    Rein logisches Denken verschafft uns keine Erkenntnis über die wirkliche Welt.
    Alle Erkenntnis der Wirklichkeit beginnt mit der Erfahrung und endet mit ihr.
    Alle Aussagen, zu denen man auf rein logischen Wegen kommt, sind, was die Realität angeht, vollkommen leer.
    Albert Einstein

  • Hmm ... warum meins nicht tut, ich weiß es nicht. Egal, hätte ja sein können, dass es da Beschränkungen gäbe. Es tut und gut ist. Bin kein Profi, meins muss nicht schön sein ;)


    Danke!

    Life is not a journey to the grave with the intention of arriving safely in a pretty and well-preserved body, but rather to skid in broadside, thoroughly used up, totally worn out, and loudly proclaiming "Wow, what a ride!!! :evil:
    Beschleunigung ist, wenn die Tränen der Ergriffenheit waagrecht zum Ohr hin abfliessen - Walter Röhrl

  • Ich hab das auch scon öfters bemerkt, daß er ab und zu mal bei zu vielen Objekten und Methoden in einer Zeile rauskommt und dann irgendwo den Bezug verliert. Passiert mir aber wie Diali selten bis nie, da ich so unübersichtliche Zeilen nicht mag

  • Da muss ich bei den Profis aber kurz nachhaken: warum ist das unübersichtlicher? Weil, in der Zeile sehe ich ja auf einen Blick, was passiert und wie es passiert. Ansonsten müsste ich ja den Code aufblähen, wenn ich nacheinander die Variablen deklariere, die Objekte definiere und dann Methoden drauf anwende.


    ist doch wesentlich länger. Schön, das RTItem kann man sich -in diesem Falle- schenken, macht es aber auch nicht wesentlich kürzer. Die beiden mit 'New' instantiierten Objekte müssen eh direkt in den Code, den Rest kann ich zwar in den Declarations "verstecken". Aber dennoch sind es 2 Zeilen, die einer anderen meiner Theorien ins Gehege kommen können:
    Code, der länger als eine Bildschirmseite ist, taugt nichts. Dass der Designer nicht wie in anderen IDEs Klassen vernünftig erstellen und listen kann, so dass man alles Declarations schreiben muss, ist ein anderes Thema. Auch wenn es auf 2 Zeilen (eigentlich) nicht ankommen sollte, muss ich doch erst eine ganze Menge schreiben, bevor auch nur irgendwas passiert.


    Sorry, wenn ich für diese vermeintliche Grundsatzdiskussion den Thread noch mal als 'offen' markieren.


    Gruß
    RW

    Life is not a journey to the grave with the intention of arriving safely in a pretty and well-preserved body, but rather to skid in broadside, thoroughly used up, totally worn out, and loudly proclaiming "Wow, what a ride!!! :evil:
    Beschleunigung ist, wenn die Tränen der Ergriffenheit waagrecht zum Ohr hin abfliessen - Walter Röhrl

  • Um ehrlich zu sein mir gefaelt RockWilders Code der nur auf einer Zeile ist viel besser als wenn es auf 5-6 Zeilen steht.


    Wer sich mit LS auskennt wird wohl keine Probleme haben um den Code zu verstehen.


    Der Code wird damit uebersichtlicher.


    Gruesse

  • RockWilder


    Deswegen haben die meisten Programmierer mittlerweile auch Design Repositories aus denen sie diese Codeteile einfach herauskopieren, weil diese eh immer identisch sind.
    Oder aber ein eigenes Klassenkonstrukt daß diese Basisarbeiten schon drin hat: also einmal schreiben und immer wieder verwenden


    Code der länger als eine Bildschirmseite ist wirst du in jeder komplexen Anwendung haben, außer du lagerst alles in Funktionen aus, was das ganze auf Dauer aber noch unübersichtlicher macht


    @Brane


    Genau das ist eben nicht der Fall. Wenn du Code bekommst, den du nicht selber geschrieben hast und da soviel wie möglich in einer Zeile hast, dann wirst du zum Verstehen viel länger brauchen.


    Außerdem ist das Debugging in diesem Fall nahezu unmöglich, da du selbst im Script Debugger in dieser Zeile fast nichts angezeigt bekommst.


    Die Aufteilung auf einzelne Zeilen hat weiterhin den Vorteil, daß man den Code sehr gut und strukturiert mit Inline Dokumentation versehen kann.

  • Zitat

    Oder aber ein eigenes Klassenkonstrukt daß diese Basisarbeiten...


    Ich habe vor ein Paar Monaten gepostet das es gut waere wenn ihr die mehr erfahrung haben einen blog habne wuerdet. Genau das waere was worueber man blogen konnte.


    Es waere nett wenn du uns das neher beschreiben und erlautern koenntest taurec. Den das spart sicher eine menge code.


    Du hast da schon recht mit dem debugger. Aber der code spart enrom am code, bringt aber warscheinlich umsoviele probleme mit sich.


    Danke

  • Na was soll man da näher beschreiben.


    Du hast halt eine Klasse, die diese als öffentliche Variablen deklariert. Und das machst du in ne Script Bibliothek und musst somit nur noch entweder diese Library einbinden und per New eine Instanz deklarieren oder aber eine neue Klasse schreiben, die auf dieser basiert (As Parameter beim Deklarieren)

  • Zitat

    Du hast halt eine Klasse, die diese als öffentliche Variablen deklariert. Und das machst du in ne Script Bibliothek und musst somit nur noch entweder diese Library einbinden und per New eine Instanz deklarieren oder aber eine neue Klasse schreiben, die auf dieser basiert (As Parameter beim Deklarieren)


    Damit kenne ich mich schon aus, aber wo genau und wie man das verwendet um zeit und platz zu sparen.


    Das heisst beim zugreiffen auf die docs? Oder Wie?


    Wo benutzst du es am meistens?


    ;)


    Danke

  • Überall wo du es eben brauchst.


    Das hängt halt davon ab wo du es wirklich brauchst.


    Wenn du in ner Maske z.B. immer über Source zugreifen kannst wirst du das nicht brauchen, aber in Aktionen oder Agenten ist das schon sehr hilfreich.

  • Zitat


    taurec schrieb:


    Deswegen haben die meisten Programmierer mittlerweile auch Design Repositories aus denen sie diese Codeteile einfach herauskopieren, weil diese eh immer identisch sind.


    Bin auf die Code Library von OpenNTF gestoßen. Ein Repository hatte ich vorher schon, das Ding macht's aber viel einfach und auch übersichtlicher.
    Werde mir bei Gelegenheit die DB dahingehend erweitern, dass ich da komplette Designelemente ablegen kann. Sollten nur wenige Handgriffe sein...


    Zitat


    Außerdem ist das Debugging in diesem Fall nahezu unmöglich, da du selbst im Script Debugger in dieser Zeile fast nichts angezeigt bekommst.


    Das allerdings ist ein Argument, an dem man nur schwer vorbeikommt. Ok, ich debugge meinen Code nicht, der tut einfach :lol: Nee, ernsthaft: wo du Recht hast, hast du Recht...


    Ein schönes Wochenende allerseits!

    Life is not a journey to the grave with the intention of arriving safely in a pretty and well-preserved body, but rather to skid in broadside, thoroughly used up, totally worn out, and loudly proclaiming "Wow, what a ride!!! :evil:
    Beschleunigung ist, wenn die Tränen der Ergriffenheit waagrecht zum Ohr hin abfliessen - Walter Röhrl