Frage

Ich habe ein Paket (wirklich nur ein Unterprogramm) ich häufig zu Parse-Konfigurationsdatei verwenden usw. Im Grunde sieht es wie folgt aus:

sub get_settings {
        my %config;
        my $config = 'path...';

        unless(-r $config) {
                die("Couldn't read config");
        }
        open CONFIG, '<', $config or die $!;
        while(<CONFIG>) {
                next if (($_ eq "\n") or /^\;/);
                chomp;
                my($setting, $value) = split(/=/, $_);
                $config{$setting} = $value;
        }
        return %config;
}

Ziemlich einfach, aber ich habe mich gefragt, wie (und ob) dies könnte / sollte neu geschrieben OOP werden? Wirklich nur für das Lernen, nie ganz gesehen, wann und warum verwenden segnet . =)

Danke!

War es hilfreich?

Lösung

Die Antwort auf die Frage hat mehr mit den Programmen zu tun Sie das Paket verwenden in als mit dem Paket selbst.

Wenn dies eine ziemlich große OOP-basierte Anwendungen / scripts dann Sinn auf jeden Fall macht es zu OOP, weil das ist, was der Kunde erwartet (die Apps und die Leute, die diese apps / Schreiben von Skripts). Auch zwingend notwendig Stilbibliotheken wie ein wunder Daumen hervorstehen und mit erstellen Komplexität.

Im Gegensatz dazu, wenn das Paket in kürzerem zwingend notwendig, Skripte verwendet wird, dann wird eine OOP-Schnittstelle mit der Kundenerwartung in Konflikt geraten wird (das heißt die Skripte + Menschen, die sie entwickeln).

Vielleicht migrieren Sie zwischen den Ansätzen (zB das Skript werden groß und unhandlich und müssen besser organisiert werden, vielleicht mit OOP) in diesem Fall ein Einstellungen / config Art der Klasse ist ein guter Anfang, da sie dazu neigen, gut zu sein klare Linien von responsability getrennt und haben.

Kurz gesagt:. Tun, was am meisten Sinn macht, wo das Paket verwendet wird

Andere Tipps

Hier ist (hoffentlich) ein einfaches Beispiel für eine OO basierte Konfigurations Abstraktion mit:

NB. Sie können andere Module verwenden oder sogar Ihre eigene Rolle. Im Folgenden dient nur als allgemeines Beispiel.

RoomConfig.pm

package RoomConfig;
use Moose;
with 'MooseX::SimpleConfig';

has doors   => (is => 'rw', isa => 'Int', required => 1);
has windows => (is => 'rw', isa => 'Int', default  => sub {0});

1;

So oben ist unsere OO Config-Klasse. Alles ist ordentlich erklärt, so dass Sie genau wissen, dass Konfigurations-Optionen sind verfügbar und gültig, dh. seine selbstdokumentiere.

So eine room aus einer Konfigurationsdatei zu erstellen wäre:

use RoomConfig;

my $box_room = RoomConfig->new_with_config( configfile => 'box_room.yaml' );

Weil seine eine Klasse i kann auch ein room ohne Konfigurationsdatei instanziiert:

my $cupboard       = RoomConfig->new( doors => 1 );
my $utility_room   = RoomConfig->new( doors => 2 );
my $master_bedroom = RoomConfig->new( 
    doors      => 1,
    windows    => 2,   # dual aspect
);

Und auch mit diesen speziellen Modulen erhalten wir zusätzliche Funktionen wie folgt:

# below throws exception because room must have a door!
my $room_with_no_door_or_window = RoomConfig->new; 

So meine Konfiguration kann aus einer Konfigurationsdatei einfach kommen oder durch Attribute zu setzen.


Und wir können durch die Erweiterung unserer Konfiguration für verschiedene Arten von rooms noch weiter gehen:

BathRoomConfig.pm

package BathRoomConfig;
use Moose;
extends 'RoomConfig';

has loos  => (is => 'rw', isa => 'Int', default  => sub {0});
has sinks => (is => 'rw', isa => 'Int', default  => sub {0});
has baths => (is => 'rw', isa => 'Int', default  => sub {1});

1;

Und wenn wir diese config (bathroom.yaml):

doors:  1
windows:    1
bath:   1
loos:   1
sinks:  2

Dann könnten Sie dies tun:

use BathRoomConfig;

my $upstairs_bathroom = BathRoomConfig->new_with_config( 
    configfile => 'bathroom.yaml' 
);

my $closet_room = BathRoomConfig->new_with_config( 
    configfile => 'bathroom.yaml',
    baths      => 0,
    sinks      => 1,
    windows    => 0,
);

Beachten Sie, dass $closet_room Fabrikate verwenden beide von der Konfigurationsdatei und Einstellung Attribute.

Beachten Sie auch, dass, wenn meine Config-Datei nicht doors hat (dh. Erforderliche Eigenschaft), dann wäre es einen Fehler auf new_with_config geworfen hat.


Und schließlich können wir unsere definierten Konfigurationsklasse praktisch finden introspecting:

use RoomConfig;

say "RoomConfig provides the following options:";

for my $attr (RoomConfig->meta->get_attribute_list) {
    next if $attr eq 'configfile';
    say '-> ', $attr;
}


Jetzt gibt es nichts hindert Sie das meiste davon in einem Standard-Config-Paket so dass am Ende des Tages nur seine Pferde für die Kurse der Umsetzung!

Doch die einfache Verwaltung all dies ist so viel einfacher, mit OO und den Merkmalen, dass diese bereits geschrieben Module bieten ist großer Vorteil vor allem bei größeren Projekten.

Sie können von Modulen auf CPAN einen Blick auf Quellcode nehmen. Zum Beispiel Config :: General sollten Ihre Fragen beantworten ...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top