Pregunta

Tengo un paquete (en realidad sólo una subrutina) que utilizo con frecuencia para el archivo de configuración de análisis, etc. Básicamente se parece a esto:

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;
}

bastante básico, pero me preguntaba cómo (y si) esto podría / debería ser reescrita a programación orientada a objetos ? En realidad sólo para aprender, nunca visto cuándo y por qué utilizar bendiga . =)

Gracias!

¿Fue útil?

Solución

La respuesta a la pregunta tiene más que ver con los programas que esté utilizando el paquete en el que con el propio paquete.

Si esta programación orientada a objetos bastante grandes aplicaciones basadas / scripts entonces definitivamente tiene sentido para la POO, porque eso es lo que los clientes (Espera las aplicaciones y la gente que escribe estas aplicaciones / scripts). También tener bibliotecas de estilos imperativas sobresalen como un pulgar dolorido y crean complejidad.

A la inversa, si el paquete se utiliza en secuencias de comandos imperativos más cortos, a continuación, una interfaz de programación orientada a objetos en conflicto con las expectativas del cliente (es decir, las secuencias de comandos + personas desarrollarlas).

Quizás esté migrando entre los enfoques (por ejemplo, la secuencia de comandos se hacen grandes y difíciles de manejar y deben estar mejor organizado, tal vez con la programación orientada a objetos) en ese caso una configuración / configuración de tipo de clase es un lugar bueno para comenzar, ya que tienden a estar bien separados y tienen líneas claras de responsabilidad.

En pocas palabras:. Hacer lo que tiene más sentido en que se utiliza el paquete

Otros consejos

Aquí es (¡ojalá!) Un ejemplo simple de un OO basado config abstracción usando:

NB. Puede utilizar otros módulos o incluso rodar su propia. A continuación sirve sólo como un ejemplo general.

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;

Así que es por encima de nuestra clase OO config. Todo se declara cuidadosamente para que sepa con claridad que las opciones de configuración están disponibles y válidos, es decir. su propia documentación.

Así que para crear un room de un archivo de configuración sería:

use RoomConfig;

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

Debido a su Clase I también puede crear instancias de un room sin un archivo de configuración:

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

Y con estos módulos particulares obtenemos características adicionales como esto:

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

Por lo tanto mi configuración puede llegar fácilmente a partir de un archivo de configuración o mediante el establecimiento de atributos.


Y podemos ir más allá mediante la ampliación de nuestra configuración para diferentes tipos de rooms:

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;

Y si utilizamos esta configuración (bathroom.yaml):

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

A continuación, usted puede hacer esto:

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,
);

Tenga en cuenta que las marcas $closet_room uso tanto del archivo de configuración y los atributos de configuración.

Tenga en cuenta también que si mi archivo de configuración no tenía doors (es decir. La propiedad requerida), entonces se habría arrojado un error en new_with_config.


Y por último podemos encontrar la introspección de nuestra clase de configuración definida útil:

use RoomConfig;

say "RoomConfig provides the following options:";

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


Ahora no hay nada que le para la implementación de la mayor parte de esto en un paquete de configuración estándar para que al final del día sólo sus caballos de carreras!

Sin embargo, la facilidad de manejo de todo esto es mucho más fácil con OO y las características que estos módulos ya escritos proporcionan es gran ventaja sobre todo en proyectos más grandes.

Se puede echar un vistazo a código fuente de los módulos en CPAN. Por ejemplo Config :: general debe responder a sus preguntas ...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top