Aquariophile: SEHR Un-Uebersichtliches OOP Script :((

Hallo!

Also, ich habe ein Perlscript geschrieben.
Und ein Modul dazu.

Das ganze soll insgesamt ausgeben:

Ein Feld für Usernamen
Ein Feld fürs passwort

Frei generiert werden koennen grösse der Felder,
was vor den jeweiligen Feldern steht,
und alle möglichen Fehlermeldungen.

Das soll alles vom Script aus gehen.

Im modul stehen nur die ganzen IF/else

Meine Frage:
Der Aufruf für dieses Modul also zur Darstellung
von diesem Zeugs für den Login,
das hat EXTREM viele variablen die übergeben werden.

Im endeffekt weiss ich nach 2 Stunden schon nichtmehr,
an welcher stelle welche variable gehoert

Beispiel:
$oologin->login("login","user","pass","Du bist eingeloggt","Passwort falsch","Login Falsch","Dein Username","Dein persoenliches Passwort");

Das ist ja uuuur lange!

Meine Frage:
Wie muss ich das ganze gestalten,
dass ich ALLES vom Script aus steuern kann,
aber eben alle IF/ELSE und das ganze Programmtechnische im Modul ist.

Also wie gesagt,
so wie es jetzt ist, nur halt übersichtlicher damit die
variablen nicht alle in einer wurscht sind.

============================================================
Das Script:

#!/usr/bin/perl

use CGI;
use strict;
use oologin;

my $oologin = oologin->new();

print "Content-type: text/html\n\n";

print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">', "\n";
print "<html><head><title>Login-Seite</title></head><body>\n";

$oologin->login("login","user","pass","Du bist eingeloggt","Passwort falsch","Login Falsch","Dein Username","Dein persoenliches Passwort");

print "</body></html>";

============================================================
Das Modul:

package oologin;

use CGI;
use strict;
use warnings;
my $cgi = CGI->new();
sub new {
 my $class = shift;
 $class = ref($class) || $class;
 my $object = {};
 bless($object,$class);
 return($class);
}

sub login {
my $Objekt = shift;
my $button = shift;
my $user = shift;
my $pass = shift;
my $login_message = shift;
my $wrong_pass = shift;
my $wrong_login = shift;
my $usertext = shift;
my $passtext = shift;

if($cgi->param("button") eq $button)
{

if ($cgi->param("user") eq $user)
{
if($cgi->param("pass") eq $pass)
{
print "$login_message";
}

else
{
print "$wrong_pass";
}
}

else
{
print "$wrong_login";
}
}

else
{
print "<form action="oologin.pl" method="post">";
print "$usertext: <input type="text" size="40" name="user" value=""><br>";
print "$passtext: <input type="text" size="40" name="pass" value=""><br>";
print "<input type="submit" name="button" value="login"><br>";
}

}

1;

============================================================

DANKESCHÖN für alle Tipps
und vor allem Lösungsansaetze in richtung "Sinnvolleres" OOP.

Danke!
Aquariophile

  1. Halihallo Aqua

    Meine Frage:
    Der Aufruf für dieses Modul also zur Darstellung
    von diesem Zeugs für den Login,
    das hat EXTREM viele variablen die übergeben werden.

    Darstellung hat _absolut nichts_ mit Authentifizierung zu tun => wird in OOP getrennt.

    Im endeffekt weiss ich nach 2 Stunden schon nichtmehr,
    an welcher stelle welche variable gehoert

    Dann splitte das Zeug auf verschiedene Methoden auf; Methodennamen bzw. Hashes eignen
    sich wesentlich besser, da die Werte gleich mit dem Namen assoziiert werden können,
    das menschliche Gehirn kann sich Zuordnungen wesentlich besser merken, als nummerische
    Positionen => also: entweder Hashes als Konfiguration oder jeder Wert über Methode
    festlegen.

    Beispiel:
    $oologin->login("login","user","pass","Du bist eingeloggt","Passwort falsch","Login Falsch","Dein Username","Dein persoenliches Passwort");
    Das ist ja uuuur lange!

    Kürzer wirds bestimmt nicht werden, jedoch einfacher zu merken.

    -----

    OOP: Für jede "Funktion" ein Modul => Design-Modul, Code/Verarbeitungs-Modul, das mal
    grundsätzlich zu OOP. In deinem Beispiel: oologincontrol und oologindesign.

    oologincontrol: Verarbeitung und Behandlung der Authentifizierung eines Kunden.
    oologindesign:  Ausgabe und "Berechnung" des Designs.

    oologincontrol

    new()
       setLogin( $login_name )
       setPass( $password )
       setLoginPass( $usr, $login, $pass );   # gleich alles in einem
       true/false = authenticate( $login, $pass )
                                              # verglicht die Werte $login und $pass mit
                                              # denjenigen von setLogin/setPass
                                              # true : Kunde ist authentifiziert

    oologindesign

    new($oologin_control)                  # controler-Instanz mit Kundendaten übergeben.
       setData( %hash )                       # Formulardaten
       setMsgs( ERR_NOT_AUTH => $falsches_pwd,
                ERR_LOG_WRONG=> $login_wrong,
                ERR_PAS_WRONG=> $password_wrong,
                MSG_YOUR_PWD => $dein_passwort,
                MSG_YOUR_LOG => $dein_login)
       $html_code = parse()                   # was soll jetzt geschehen?

    parse überprüft %hash auf $hash{$button}, falls gesetzt, wird der Kunde mit Daten aus
    %hash gegen $oologin_control geprüft und ggf. Fehlermeldung ausgegeben. Falls nicht,
    wird das Formular ausgegeben.

    Möglichkeiten in oologindesign: "parse" (auf Cntl zugreifen)
    sub parse {
       my ($self) = @_;
       $oo_cntl = $self->getOOLoginCntl;
       if ($oo_cntl->isAuthenticated) {
          print $self->{MSG_CORRECT_LOGIN};
       }
    }

    Programm

    use CGI;

    my $cgi       = CGI->new;
    my $oo_cntl   = oologincontrol->new;
    my $oo_design = oologindesign->new( $oo_cntl );

    $oo_cntl->setUser( 'testuser' );
    $oo_cntl->setPass( 'testpassphrase' );

    $oo_design->setData( $cgi->Vars );
    $oo_design->parse;

    ----

    So, das wäre ein Beispiel. Ich hoffe, dass dir das etwas hilft.

    Viele Grüsse

    Philipp