Schrift
[thread]11150[/thread]

Schnittstellen, und globale Variablen

Leser: 1


<< >> 8 Einträge, 1 Seite
pktm
 2008-01-17 00:23
#104811 #104811
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Hallo!

Warum sollte man saubere Schnittstellen verwenden und wenn möglich auf globale Variablen, auf die man dann in Funktionen zugreift, verzichten?

Grüße, pktm
http://www.intergastro-service.de (mein erstes CMS :) )
renee
 2008-01-17 00:46
#104813 #104813
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Weil man sonst häufiger unbedachterweise irgendwelche Variablen verändert und sich dann später wundert warum nix mehr funktioniert. Globale Variablen bleiben bis zum Programmende im Speicher (und bei mod_perl sogar darüber hinaus), was zu Memory Leaks führen kann. Und selbst wenn es keine Memory Leaks verursacht - es ist Speicherverschwendung!

Es gibt noch einige weitere Punkte wie "Wartbarkeit",...

Auch verliert man bei größeren Programmen schnell den Überblick, welche Variablen schonmal deklariert wurden und welche nicht, was dann häufig zu einer Namensgebung wie "$variable1, $variable2,..." führt.

Bei Rekursion kann man sich leicht selbst ins Knie schießen.
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
pq
 2008-01-17 01:21
#104814 #104814
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
pktm+2008-01-16 23:23:36--
Warum sollte man saubere Schnittstellen verwenden

einen teil hast du ja mit dem wort "sauber" schon selbst beantwortet =)
indem ich der funktion das übergebe, was sie braucht, mache ich auch implizit
klar, auf was die funktion zugriff hat. natürlich kann das auch ein objekt mit vielen
unterobjekten sein, doch wenn man die kette der funktionsaufrufe sieht, bekommt
man einen besseren überblick.
ausserdem läuft man immer gefahr, duch veränderung so einer variable anderen
code kaputt zu machen, also sollte man sie auch immer sauber lokalisieren.
da kann man auch gleich argumente übergeben.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
Strat
 2008-01-18 11:38
#104883 #104883
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
Genau. Globale Variablen verwende ich höchstens für Konfiguration, die dann Readonly ist, und die vom Namen her klar erkennbar sind, z.B.
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
package MyApp::Config;
use warnings;
use strict;
use Readonly;

use vars qw( %Fonts );

Readonly::Hash %Fonts => (
    default => 'Arial 12 normal',
    bold     => 'Arial 12 bold',
);

und dann als Verwendung:
Code (perl): (dl )
1
2
3
4
5
6
7
sub CreateLabel {
    my( $parent, $text, ... ) = @_;

    $parent->Label( -font => $MyApp::Config::Fonts{default},
                            -text  => $text,
                            ...
                           );


Aber bei klassischer oder OOP-Programmierung ist es meist "schoener", wenn man auch die Config als Objekt verpackt und dann mit in die Subroutinen reingibt. Nur - wie im Beispiel - bei der ereignisgesteuerten Programmierung (z.B: GUIs) ist das manchmal schwierig.
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
Tr0Nix
 2008-01-18 13:17
#104885 #104885
User since
2006-11-21
44 Artikel
BenutzerIn
[default_avatar]
Eure Aussagen beziehen sich in erster Linie auf OOP/PM Programmierung? Weil bei prozeduraler Vorgehensweise kommt man ja kaum drum herum, globale Variablen zu verwenden. Oder sehe ich da was falsch?
renee
 2008-01-18 13:23
#104886 #104886
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Doch, da kann man globale Variablen genauso vermeiden...

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#!/usr/bin/perl

use strict;
use warnings;

start();

sub start{
    my $date = today();
    say( $date );
}

sub today{
    my ($day,$month,$year) = (localtime time)[3..5];
    return sprintf "%02d.%02d.%04d", $day, $month+1, $year+1900;
}

sub say{
    print @_, "\n";
}


Edit: Klar, man hat meistens ein paar "globale" Variablen wenn man nur ein einziges Skript hat (ohne Module etc), aber man sollte in den Subs nicht darauf zugreifen...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Strat
 2008-01-18 13:42
#104887 #104887
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
Gerade bei prozeduraler Programmierung kann man globale Variablen meist sehr einfach vermeiden, indem man sie einfach uebergibt. Fuer Konfigurationen bietet sich haeufig eine Hashreferenz (oder sogar Objekt?) an, das überall als erster Parameter reingegeben wird.

Der grosse Vorteil, keine globalen Variablen zu verwenden ist, dass die Subroutine nur ueber klare Schnittstellen (naemlich Parameter) mit dem Aufrufer kommuniziert. Man braucht sich um ausserhalb existierende Variablennamen nicht kuemmern, sondern hat eine Art Black Box, in der man schalten und walten kann, wie es einem beliebt, ohne die Angst, anderen Funktionen irgendwas wegzuschiessen. Besonders beim Debuggen spart sowas enorm viel Zeit.

Nebenbei wird es dadurch auch meist einfacher, eine Funktion in einer anderen Applikation 1:1 zu verwenden.
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
Tr0Nix
 2008-01-18 13:45
#104889 #104889
User since
2006-11-21
44 Artikel
BenutzerIn
[default_avatar]
Okay, wenn man natürlich die Variablen immer in den Parametern als Referenzen übergibt und mit Returnwerten arbeitet, kann man dies umgehen.

Dies denke ich fördert die Portierbarkeit der Funktionen und statt globalen Variablen hat man dieselben einfach in einer "Steuerfunktion" - in deinem Fall wäre dies start() mit der Variable $today.

Mh, müsste mal schauen ob ich meine zukünftigen Scripts nicht auch eher auf diese Art schreiben sollte.. danke für die illuminierung.

//Edit: danke für die zusätzliche Erläuterung strat. Ich denke die Freiheit von Perl lässt einen solche Schnellschüsse produzieren. Seit ich mich an ein paar Regeln halte aus "Perl Best Practices" wirds jedoch immer etwas besser :).
<< >> 8 Einträge, 1 Seite



View all threads created 2008-01-17 00:23.