28 |
28 |
des scopes zur?ckgesetzt</p></dd></dl></div></div><div class="sect2" title="4.1.2. Warum sind globale Variablen ein Problem?"><div class="titlepage"><div><div><h3 class="title"><a name="d0e4350"></a>4.1.2. Warum sind globale Variablen ein Problem?</h3></div></div></div><p>Das erste Problem ist <span class="productname">FCGI</span>™.</p><p>
|
29 |
29 |
<span class="productname">SQL-Ledger</span>™ hat fast alles im globalen
|
30 |
30 |
namespace abgelegt, und erwartet, dass es da auch wiederzufinden ist.
|
31 |
|
Unter <span class="productname">FCGI</span>™ m?ssen diese Sachen auch wieder
|
|
31 |
Unter <span class="productname">FCGI</span>™ m?ssen diese Sachen aber wieder
|
32 |
32 |
aufger?umt werden, damit sie nicht in den n?chsten Request kommen.
|
33 |
33 |
Einige Sachen wiederum sollen nicht gel?scht werden, wie zum Beispiel
|
34 |
|
Datenbankverbindungen, weil die ne Ewigkeit zum initialisieren
|
|
34 |
Datenbankverbindungen, weil die sehr lange zum Initialisieren
|
35 |
35 |
brauchen.</p><p>Das zweite Problem ist <code class="function">strict</code>. Unter
|
36 |
36 |
<code class="function">strict</code> werden alle Variablen die nicht explizit
|
37 |
37 |
mit <code class="function">Package</code>, <code class="function">my</code> oder
|
38 |
38 |
<code class="function">our</code> angegeben werden als Tippfehler angemarkert,
|
39 |
|
was einen vor so mancher Stunde suchen nach einem Bug erspart. Da
|
40 |
|
globale Variablen aber implizit mit Package angegeben werden, werden
|
41 |
|
die nicht gepr?ft, und ein Tippfehler da f?llt niemandem auf.</p></div><div class="sect2" title="4.1.3. Kanonische globale Variablen"><div class="titlepage"><div><div><h3 class="title"><a name="d0e4383"></a>4.1.3. Kanonische globale Variablen</h3></div></div></div><p>Um dieses Problem im Griff zu halten gibt es einige wenige
|
42 |
|
globale Variablen, die kanonisch sind, und alles andere sollte
|
43 |
|
anderweitig umhergereicht werden.</p><p>Diese Variablen sind im Moment die folgenden neun:</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>
|
|
39 |
dies hat, seit der Einf?hrung, u.a. schon so manche langwierige Bug-Suche verk?rzt.
|
|
40 |
Da globale Variablen aber implizit mit Package angegeben werden, werden
|
|
41 |
die nicht gepr?ft, und somit kann sich schnell ein Tippfehler einschleichen.</p></div><div class="sect2" title="4.1.3. Kanonische globale Variablen"><div class="titlepage"><div><div><h3 class="title"><a name="d0e4383"></a>4.1.3. Kanonische globale Variablen</h3></div></div></div><p>Um dieses Problem im Griff zu halten gibt es einige wenige
|
|
42 |
globale Variablen, die kanonisch sind, d.h. sie haben bestimmte vorgegebenen Eigenschaften,
|
|
43 |
und alles andere sollte anderweitig umhergereicht werden.</p><p>Diese Variablen sind im Moment die folgenden neun:</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>
|
44 |
44 |
<code class="varname">$::form</code>
|
45 |
45 |
</p></li><li class="listitem"><p>
|
46 |
46 |
<code class="varname">%::myconfig</code>
|
... | ... | |
58 |
58 |
<code class="varname">$::dispatcher</code>
|
59 |
59 |
</p></li><li class="listitem"><p>
|
60 |
60 |
<code class="varname">$::request</code>
|
61 |
|
</p></li></ul></div><p>Damit diese nicht als M?llhalde misbrauch werden, im Folgenden
|
62 |
|
eine kurze Erl?uterung was man von denn erwarten kann.</p><div class="sect3" title="4.1.3.1. $::form"><div class="titlepage"><div><div><h4 class="title"><a name="d0e4447"></a>4.1.3.1. $::form</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Ist ein Objekt der Klasse
|
|
61 |
</p></li></ul></div><p>Damit diese nicht erneut als M?llhalde missbraucht werden, im Folgenden
|
|
62 |
eine kurze Erl?uterung der bestimmten vorgegebenen Eigenschaften (Konventionen):</p><div class="sect3" title="4.1.3.1. $::form"><div class="titlepage"><div><div><h4 class="title"><a name="d0e4447"></a>4.1.3.1. $::form</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Ist ein Objekt der Klasse
|
63 |
63 |
"<code class="classname">Form</code>"</p></li><li class="listitem"><p>Wird nach jedem Request gel?scht</p></li><li class="listitem"><p>Muss auch in Tests und Konsolenscripts vorhanden
|
64 |
64 |
sein.</p></li><li class="listitem"><p>Enth?lt am Anfang eines Requests die Requestparameter vom
|
65 |
65 |
User</p></li><li class="listitem"><p>Kann zwar intern ?ber Requestgrenzen ein Datenbankhandle
|
... | ... | |
67 |
67 |
<code class="varname">$::form</code> wurde unter <span class="productname">SQL
|
68 |
68 |
Ledger</span>™ als Gottobjekt f?r alles misbraucht. S?mtliche
|
69 |
69 |
alten Funktionen unter SL/ mutieren <code class="varname">$::form</code>, das
|
70 |
|
hei?t, alles was einem lieb ist, sollte man vor einem Aufruf von zum
|
|
70 |
hei?t, alles was einem lieb ist (alle Variablen die einem ans Herz
|
|
71 |
gewachsen sind), sollte man vor einem Aufruf (!) von zum
|
71 |
72 |
Beispiel <code class="function">IS->retrieve_customer()</code> in
|
72 |
|
Sicherheit bringen.</p><p>Das Objekt der Klasse Form hat leider im Moment noch viele
|
73 |
|
zentrale Funktionen Gdie vom internen Zustand abh?ngen, deshalb
|
74 |
|
bitte nie einfach zerst?ren oder ?berschreiben. Es geht ziemlich
|
75 |
|
sicher etwas kaputt.</p><p>
|
|
73 |
Sicherheit bringen. </p>
|
|
74 |
Z.B. das vom Benutzer eingestellte Zahlenformat, bevor man Berechnung in einem
|
|
75 |
bestimmten Format durchf?hrt (SL/Form.pm Zeile 3552, Stand version 2.7beta), um
|
|
76 |
dies hinterher wieder auf den richtigen Wert zu setzen:
|
|
77 |
<pre class="programlisting">
|
|
78 |
my $saved_numberformat = $::myconfig{numberformat};
|
|
79 |
$::myconfig{numberformat} = $numberformat;
|
|
80 |
# (...) div Berechnungen
|
|
81 |
$::myconfig{numberformat} = $saved_numberformat;
|
|
82 |
</pre><p>Das Objekt der Klasse Form hat leider im Moment noch viele
|
|
83 |
zentrale Funktionen die vom internen Zustand abh?ngen, deshalb
|
|
84 |
bitte nie einfach zerst?ren oder ?berschreiben (zumindestens nicht kurz
|
|
85 |
vor einem Release oder in Absprache ?ber bspw. die devel-Liste ;-).
|
|
86 |
Es geht ziemlich sicher etwas kaputt.</p><p>
|
76 |
87 |
<code class="varname">$::form</code> ist gleichzeitig der Standard Scope
|
77 |
88 |
in den <span class="productname">Template::Toolkit</span>™ Templates
|
78 |
89 |
au?erhalb der Controller: der Ausdruck <code class="function">[% var
|
... | ... | |
81 |
92 |
Zugriff <code class="function">[% FORM.var %]</code>. In Druckvorlagen sind
|
82 |
93 |
normale Variablen ebenfall im <code class="varname">$::form</code> Scope, d.h.
|
83 |
94 |
<code class="function"><%var%></code> zeigt auf
|
84 |
|
<code class="varname">$::form->{var}</code>. Innerhalb von Schleifen wird
|
|
95 |
<code class="varname">$::form->{var}</code>.
|
|
96 |
Nochmal von der anderen Seite erl?utert, innerhalb von (Web-)Templates sieht
|
|
97 |
man h?ufiger solche Konstrukte:
|
|
98 |
</p><pre class="programlisting">
|
|
99 |
[%- IF business %]
|
|
100 |
# (... Zeig die Auswahlliste Kunden-/Lieferantentyp an
|
|
101 |
[%- END %]
|
|
102 |
</pre><p>
|
|
103 |
Entweder wird hier dann $::form->{business} ausgewertet oder aber der Funktion
|
|
104 |
<code class="function">$form->parse_html_template</code> wird explizit noch ein zus?tzlicher Hash
|
|
105 |
?bergeben, der dann auch in den (Web-)Templates zu Verf?gung steht, bspw. so:
|
|
106 |
<code class="function">$form->parse_html_template("is/form_header", \%TMPL_VAR);</code>
|
|
107 |
|
|
108 |
Innerhalb von Schleifen wird
|
85 |
109 |
<code class="varname">$::form->{TEMPLATE_ARRAYS}{var}[$index]</code>
|
86 |
|
bevorzugt, wenn vorhanden.</p></div><div class="sect3" title="4.1.3.2. %::myconfig"><div class="titlepage"><div><div><h4 class="title"><a name="d0e4514"></a>4.1.3.2. %::myconfig</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Das einzige Hash unter den globalen Variablen</p></li><li class="listitem"><p>Wird sp?testens ben?tigt wenn auf die Datenbank
|
|
110 |
bevorzugt, wenn vorhanden.</p>
|
|
111 |
Zum Beispiel in SL/DO.pm welche ?ber alle Positionen eines Lieferscheins
|
|
112 |
in Schleife l?uft:
|
|
113 |
<pre class="programlisting">
|
|
114 |
for $i (1 .. $form->{rowcount}) {
|
|
115 |
(...)
|
|
116 |
push @{ $form->{TEMPLATE_ARRAYS}{runningnumber} }, $position;
|
|
117 |
push @{ $form->{TEMPLATE_ARRAYS}{number} }, $form->{"partnumber_$i"};
|
|
118 |
push @{ $form->{TEMPLATE_ARRAYS}{description} }, $form->{"description_$i"};
|
|
119 |
</pre></div><div class="sect3" title="4.1.3.2. %::myconfig"><div class="titlepage"><div><div><h4 class="title"><a name="d0e4529"></a>4.1.3.2. %::myconfig</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Das einzige Hash unter den globalen Variablen</p></li><li class="listitem"><p>Wird sp?testens ben?tigt wenn auf die Datenbank
|
87 |
120 |
zugegriffen wird</p></li><li class="listitem"><p>Wird bei jedem Request neu erstellt.</p></li><li class="listitem"><p>Enth?lt die Userdaten des aktuellen Logins</p></li><li class="listitem"><p>Sollte nicht ohne Filterung irgendwo gedumpt werden oder
|
88 |
121 |
extern serialisiert werden, weil da auch der Datenbankzugriff
|
89 |
|
f?r diesenuser drinsteht.</p></li><li class="listitem"><p>Enth?lt unter anderem Listenbegrenzung vclimit,
|
|
122 |
f?r diesen user drinsteht.</p></li><li class="listitem"><p>Enth?lt unter anderem Listenbegrenzung vclimit,
|
90 |
123 |
Datumsformat dateformat und Nummernformat numberformat</p></li><li class="listitem"><p>Enth?lt Datenbankzugriffinformationen</p></li></ul></div><p>
|
91 |
124 |
<code class="varname">%::myconfig</code> ist im Moment der Ersatz f?r
|
92 |
125 |
ein Userobjekt. Die meisten Funktionen, die etwas anhand des
|
93 |
126 |
aktuellen Users entscheiden m?ssen, befragen
|
94 |
|
<code class="varname">%::myconfig</code>.</p></div><div class="sect3" title="4.1.3.3. $::locale"><div class="titlepage"><div><div><h4 class="title"><a name="d0e4547"></a>4.1.3.3. $::locale</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Objekt der Klasse "Locale"</p></li><li class="listitem"><p>Wird pro Request erstellt</p></li><li class="listitem"><p>Muss auch f?r Tests und Scripte immer verf?gbar
|
|
127 |
<code class="varname">%::myconfig</code>.
|
|
128 |
Innerhalb der Anwendungen sind dies ?berwiegend die Daten, die sich
|
|
129 |
unter Programm->Einstellungen befinden, bzw. die Informationen ?ber den
|
|
130 |
Benutzer die ?ber die Administrator-Schnittstelle (admin.pl) eingegeben wurden.
|
|
131 |
</p></div><div class="sect3" title="4.1.3.3. $::locale"><div class="titlepage"><div><div><h4 class="title"><a name="d0e4562"></a>4.1.3.3. $::locale</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Objekt der Klasse "Locale"</p></li><li class="listitem"><p>Wird pro Request erstellt</p></li><li class="listitem"><p>Muss auch f?r Tests und Scripte immer verf?gbar
|
95 |
132 |
sein.</p></li><li class="listitem"><p>Cached intern ?ber Requestgrenzen hinweg benutzte
|
96 |
133 |
Locales</p></li></ul></div><p>Lokalisierung f?r den aktuellen User. Alle ?bersetzungen,
|
97 |
|
Zahlen- und Datumsformatierungen laufen ?ber dieses Objekt.</p></div><div class="sect3" title="4.1.3.4. $::lxdebug"><div class="titlepage"><div><div><h4 class="title"><a name="d0e4565"></a>4.1.3.4. $::lxdebug</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Objekt der Klasse "LXDebug"</p></li><li class="listitem"><p>Wird global gecached</p></li><li class="listitem"><p>Muss immer verf?gbar sein, in nahezu allen
|
|
134 |
Zahlen- und Datumsformatierungen laufen ?ber dieses Objekt.</p></div><div class="sect3" title="4.1.3.4. $::lxdebug"><div class="titlepage"><div><div><h4 class="title"><a name="d0e4580"></a>4.1.3.4. $::lxdebug</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Objekt der Klasse "LXDebug"</p></li><li class="listitem"><p>Wird global gecached</p></li><li class="listitem"><p>Muss immer verf?gbar sein, in nahezu allen
|
98 |
135 |
Funktionen</p></li></ul></div><p>
|
99 |
136 |
<code class="varname">$::lxdebug</code> stellt Debuggingfunktionen
|
100 |
137 |
bereit, wie "<code class="function">enter_sub</code>" und
|
... | ... | |
102 |
139 |
brauchbares Tracing gebaut ist, "<code class="function">log_time</code>", mit
|
103 |
140 |
der man die Wallclockzeit seit Requeststart loggen kann, sowie
|
104 |
141 |
"<code class="function">message</code>" und "<code class="function">dump</code>" mit
|
105 |
|
denen man flott Informationen ins Log packen kann.</p></div><div class="sect3" title="4.1.3.5. $::auth"><div class="titlepage"><div><div><h4 class="title"><a name="d0e4598"></a>4.1.3.5. $::auth</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Objekt der Klasse "SL::Auth"</p></li><li class="listitem"><p>Wird global gecached</p></li><li class="listitem"><p>Hat eine permanente DB Verbindung zur Authdatenbank</p></li><li class="listitem"><p>Wird nach jedem Request resettet.</p></li></ul></div><p>
|
|
142 |
denen man flott Informationen ins Log (tmp/lx-office-debug.log) packen kann.</p>
|
|
143 |
Beispielsweise so:
|
|
144 |
<pre class="programlisting">
|
|
145 |
$main::lxdebug->message(0, 'Meine Konfig:' . Dumper (%::myconfig));
|
|
146 |
$main::lxdebug->message(0, 'Wer bin ich? Kunde oder Lieferant:' . $form->{vc});
|
|
147 |
|
|
148 |
</pre></div><div class="sect3" title="4.1.3.5. $::auth"><div class="titlepage"><div><div><h4 class="title"><a name="d0e4616"></a>4.1.3.5. $::auth</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Objekt der Klasse "SL::Auth"</p></li><li class="listitem"><p>Wird global gecached</p></li><li class="listitem"><p>Hat eine permanente DB Verbindung zur Authdatenbank</p></li><li class="listitem"><p>Wird nach jedem Request resettet.</p></li></ul></div><p>
|
106 |
149 |
<code class="varname">$::auth</code> stellt Funktionen bereit um die
|
107 |
150 |
Rechte des aktuellen Users abzufragen. Obwohl diese Informationen
|
108 |
151 |
vom aktuellen User abh?ngen wird das Objekt aus
|
109 |
152 |
Geschwindigkeitsgr?nden nur einmal angelegt und dann nach jedem
|
110 |
|
Request kurz resettet.</p></div><div class="sect3" title="4.1.3.6. $::lx_office_conf"><div class="titlepage"><div><div><h4 class="title"><a name="d0e4619"></a>4.1.3.6. $::lx_office_conf</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Objekt der Klasse
|
|
153 |
Request kurz resettet.</p></div><div class="sect3" title="4.1.3.6. $::lx_office_conf"><div class="titlepage"><div><div><h4 class="title"><a name="d0e4637"></a>4.1.3.6. $::lx_office_conf</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Objekt der Klasse
|
111 |
154 |
"<code class="classname">SL::LxOfficeConf</code>"</p></li><li class="listitem"><p>Global gecached</p></li><li class="listitem"><p>Repr?sentation der
|
112 |
|
<code class="filename">config/lx_office.conf[.default]</code>-Dateien</p></li></ul></div><p>Globale Konfiguration. Configdateien werden zum Start gelesen,
|
113 |
|
und nicht mehr angefasst. Es ist derzeit nicht geplant, dass das
|
114 |
|
Programm die Konfiguration ?ndern kann oder sollte.</p><p>F?r die folgende Konfigurationsdatei:</p><pre class="programlisting">[debug]
|
115 |
|
file = /tmp/lxoffice_debug_log.txt</pre><p>ist der Key <code class="varname">file</code> im Programm als
|
|
155 |
<code class="filename">config/lx_office.conf[.default]</code>-Dateien</p></li></ul></div><p>Globale Konfiguration. Configdateien werden zum Start gelesen
|
|
156 |
und danach nicht mehr angefasst. Es ist derzeit nicht geplant, dass das
|
|
157 |
Programm die Konfiguration ?ndern kann oder sollte.</p><p>Beispielsweise ist ?ber den Konfigurationseintrag [debug]
|
|
158 |
die Debug- und Trace-Log-Datei wie folgt konfiguriert und verf?gbar:</p><pre class="programlisting">[debug]
|
|
159 |
file = /tmp/lx-office-debug.log</pre><p>ist der Key <code class="varname">file</code> im Programm als
|
116 |
160 |
<code class="varname">$::lx_office_conf->{debug}{file}</code>
|
117 |
161 |
erreichbar.</p><div class="warning" title="Warnung" style="margin-left: 0.5in; margin-right: 0.5in;"><table border="0" summary="Warning"><tr><td rowspan="2" align="center" valign="top" width="25"><img alt="[Warnung]" src="../../../../system/docbook-xsl/images/warning.png"></td><th align="left">Warnung</th></tr><tr><td align="left" valign="top"><p>Zugriff auf die Konfiguration erfolgt im Moment ?ber
|
118 |
|
Hashkeys, sind also nicht gegen Tippfehler abgesichert.</p></td></tr></table></div></div><div class="sect3" title="4.1.3.7. $::instance_conf"><div class="titlepage"><div><div><h4 class="title"><a name="d0e4655"></a>4.1.3.7. $::instance_conf</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Objekt der Klasse
|
|
162 |
Hashkeys, sind also nicht gegen Tippfehler abgesichert.</p></td></tr></table></div></div><div class="sect3" title="4.1.3.7. $::instance_conf"><div class="titlepage"><div><div><h4 class="title"><a name="d0e4673"></a>4.1.3.7. $::instance_conf</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Objekt der Klasse
|
119 |
163 |
"<code class="classname">SL::InstanceConfiguration</code>"</p></li><li class="listitem"><p>wird pro Request neu erstellt</p></li></ul></div><p>Funktioniert wie <code class="varname">$::lx_office_conf</code>,
|
120 |
164 |
speichert aber Daten die von der Instanz abh?ngig sind. Eine Instanz
|
121 |
|
ist hier eine Mandantendatenbank. Prominentestes Datum ist "eur",
|
122 |
|
die Information ob Bilanz oder Einnahmen?berschussrechnung gemacht
|
123 |
|
wird.</p></div><div class="sect3" title="4.1.3.8. $::dispatcher"><div class="titlepage"><div><div><h4 class="title"><a name="d0e4673"></a>4.1.3.8. $::dispatcher</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Objekt der Klasse
|
|
165 |
ist hier eine Mandantendatenbank.
|
|
166 |
Beispielsweise ?berpr?ft
|
|
167 |
</p><pre class="programlisting">$::instance_conf->get_inventory_system eq 'perpetual'</pre><p>
|
|
168 |
ob die ber?chtigte Bestandsmethode zur Anwendung kommt.</p></div><div class="sect3" title="4.1.3.8. $::dispatcher"><div class="titlepage"><div><div><h4 class="title"><a name="d0e4694"></a>4.1.3.8. $::dispatcher</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Objekt der Klasse
|
124 |
169 |
"<code class="varname">SL::Dispatcher</code>"</p></li><li class="listitem"><p>wird pro Serverprozess erstellt.</p></li><li class="listitem"><p>enth?lt Informationen ?ber die technische Verbindung zum
|
125 |
170 |
Server</p></li></ul></div><p>Der dritte Punkt ist auch der einzige Grund warum das Objekt
|
126 |
171 |
global gespeichert wird. Wird vermutlich irgendwann in einem anderen
|
127 |
|
Objekt untergebracht.</p></div><div class="sect3" title="4.1.3.9. $::request"><div class="titlepage"><div><div><h4 class="title"><a name="d0e4691"></a>4.1.3.9. $::request</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Hashref (evtl sp?ter Objekt)</p></li><li class="listitem"><p>Wird pro Request neu initialisiert.</p></li><li class="listitem"><p>Keine Unterstruktur garantiert.</p></li></ul></div><p>
|
|
172 |
Objekt untergebracht.</p></div><div class="sect3" title="4.1.3.9. $::request"><div class="titlepage"><div><div><h4 class="title"><a name="d0e4712"></a>4.1.3.9. $::request</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Hashref (evtl sp?ter Objekt)</p></li><li class="listitem"><p>Wird pro Request neu initialisiert.</p></li><li class="listitem"><p>Keine Unterstruktur garantiert.</p></li></ul></div><p>
|
128 |
173 |
<code class="varname">$::request</code> ist ein generischer Platz um
|
129 |
174 |
Daten "f?r den aktuellen Request" abzulegen. Sollte nicht f?r action
|
130 |
175 |
at a distance benutzt werden, sondern um lokales memoizing zu
|
... | ... | |
134 |
179 |
Differentialkriterien sind:</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Kommt es vom User, und soll unver?ndert wieder an den User? Dann <code class="varname">$::form</code>, steht da eh schon</p></li><li class="listitem"><p>Sind es Daten aus der Datenbank, die nur bis zum Ende des Requests gebraucht werden? Dann
|
135 |
180 |
<code class="varname">$::request</code>
|
136 |
181 |
</p></li><li class="listitem"><p>Muss ich von anderen Teilen des Programms lesend drauf zugreifen? Dann <code class="varname">$::request</code>, aber Zugriff ?ber
|
137 |
|
Wrappermethode</p></li></ul></div></div></div><div class="sect2" title="4.1.4. Ehemalige globale Variablen"><div class="titlepage"><div><div><h3 class="title"><a name="d0e4733"></a>4.1.4. Ehemalige globale Variablen</h3></div></div></div><p>Die folgenden Variablen waren einmal im Programm, und wurden
|
138 |
|
entfernt.</p><div class="sect3" title="4.1.4.1. $::cgi"><div class="titlepage"><div><div><h4 class="title"><a name="d0e4738"></a>4.1.4.1. $::cgi</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>war n?tig, weil cookie Methoden nicht als
|
|
182 |
Wrappermethode</p></li></ul></div></div></div><div class="sect2" title="4.1.4. Ehemalige globale Variablen"><div class="titlepage"><div><div><h3 class="title"><a name="d0e4754"></a>4.1.4. Ehemalige globale Variablen</h3></div></div></div><p>Die folgenden Variablen waren einmal im Programm, und wurden
|
|
183 |
entfernt.</p><div class="sect3" title="4.1.4.1. $::cgi"><div class="titlepage"><div><div><h4 class="title"><a name="d0e4759"></a>4.1.4.1. $::cgi</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>war n?tig, weil cookie Methoden nicht als
|
139 |
184 |
Klassenfunktionen funktionieren</p></li><li class="listitem"><p>Aufruf als Klasse erzeugt Dummyobjekt was im
|
140 |
185 |
Klassennamespace gehalten wird und ?ber Requestgrenzen
|
141 |
186 |
leaked</p></li><li class="listitem"><p>liegt jetzt unter
|
142 |
187 |
<code class="varname">$::request->{cgi}</code>
|
143 |
|
</p></li></ul></div></div><div class="sect3" title="4.1.4.2. $::all_units"><div class="titlepage"><div><div><h4 class="title"><a name="d0e4754"></a>4.1.4.2. $::all_units</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>war n?tig, weil einige Funktionen in Schleifen zum Teil
|
|
188 |
</p></li></ul></div></div><div class="sect3" title="4.1.4.2. $::all_units"><div class="titlepage"><div><div><h4 class="title"><a name="d0e4775"></a>4.1.4.2. $::all_units</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>war n?tig, weil einige Funktionen in Schleifen zum Teil
|
144 |
189 |
ein paar hundert mal pro Request eine Liste der Einheiten
|
145 |
190 |
brauchen, und de als Parameter durch einen Riesenstack von
|
146 |
191 |
Funktionen geschleift werden m?ssten.</p></li><li class="listitem"><p>Liegt jetzt unter
|
147 |
192 |
<code class="varname">$::request->{cache}{all_units}</code>
|
148 |
193 |
</p></li><li class="listitem"><p>Wird nur in
|
149 |
194 |
<code class="function">AM->retrieve_all_units()</code> gesetzt oder
|
150 |
|
gelesen.</p></li></ul></div></div><div class="sect3" title="4.1.4.3. %::called_subs"><div class="titlepage"><div><div><h4 class="title"><a name="d0e4773"></a>4.1.4.3. %::called_subs</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>wurde benutzt um callsub deep recursions
|
|
195 |
gelesen.</p></li></ul></div></div><div class="sect3" title="4.1.4.3. %::called_subs"><div class="titlepage"><div><div><h4 class="title"><a name="d0e4794"></a>4.1.4.3. %::called_subs</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>wurde benutzt um callsub deep recursions
|
151 |
196 |
abzufangen.</p></li><li class="listitem"><p>Wurde entfernt, weil callsub nur einen Bruchteil der
|
152 |
197 |
m?glichen Rekursioenen darstellt, und da nie welche
|
153 |
198 |
auftreten.</p></li><li class="listitem"><p>komplette recursion protection wurde entfernt.</p></li></ul></div></div></div></div></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch03s03.html">Zur?ck</a> </td><td width="20%" align="center"> </td><td width="40%" align="right"> <a accesskey="n" href="ch04s02.html">Weiter</a></td></tr><tr><td width="40%" align="left" valign="top">3.3. Excel-Vorlagen </td><td width="20%" align="center"><a accesskey="h" href="index.html">Zum Anfang</a></td><td width="40%" align="right" valign="top"> 4.2. Entwicklung unter FastCGI</td></tr></table></div></body></html>
|
Neue Version der Dokumentation WICHTIG images Fehlen!
Ich musste die Zeile:
cp -R ../../images ${input}/copy_to_output/
aus scripts/build_doc.sh auskommentieren, um es auszuführen.
Bitte nochmal ausführen und die fehlenden Bilder
(irgendwelche SKR04-3804.pngs) einchecken.