Why is it a bad idea to write configuration data in code?

前端 未结 10 2144
陌清茗
陌清茗 2020-12-05 23:46

Real-life case (from caff) to exemplify the short question subject:

$CONFIG{\'owner\'} = q{Peter Palfrader};
$CONFIG{\'email\'} = q{peter@palfrader.org};
$CO         


        
10条回答
  •  春和景丽
    2020-12-06 00:24

    Excuse the long code listing. Below is a handy Conf.pm module that I have used in many systems which allows you to specify different variables for different production, staging and dev environments. Then I build my programs to either accept the environment parameters on the command line, or I store this file outside of the source control tree so that never gets over written.

    The AUTOLOAD provides automatic methods for variable retrieval.

    # Instructions:
    # use Conf;
    # my $c = Conf->new("production");
    # print $c->root_dir;
    # print $c->log_dir;
    
    package Conf;
    use strict;
    our $AUTOLOAD;
    
    my $default_environment = "production";
    
    my @valid_environments  = qw(
        development
        production
    );
    
    #######################################################################################
    # You might need to change this.
    sub set_vars {
        my ($self) = @_;
    
        $self->{"access_token"} = 'asdafsifhefh';
    
        if ( $self->env eq "development" ) {
           $self->{"root_dir"}       = "/Users/patrickcollins/Documents/workspace/SysG_perl";
           $self->{"server_base"}    = "http://localhost:3000";
        }
    
        elsif ($self->env eq "production" ) {
           $self->{"root_dir"}       = "/mnt/SysG-production/current/lib";
           $self->{"server_base"}    = "http://api.SysG.com";
           $self->{"log_dir"}        = "/mnt/SysG-production/current/log"
        }  else {
                die "No environment defined\n";
        }
    
        #######################################################################################
        # You shouldn't need to configure this.
    
        # More dirs. Move these into the dev/prod sections if they're different per env.
        my $r = $self->{'root_dir'};
        my $b = $self->{'server_base'};
    
        $self->{"working_dir"} ||= "$r/working";
        $self->{"bin_dir"}     ||= "$r/bin";
        $self->{"log_dir"}     ||= "$r/log";
    
        # Other URLs. Move these into the dev/prod sections if they're different per env.
    
        $self->{"new_contract_url"}   = "$b/SysG-training-center/v1/contract/new";
        $self->{"new_documents_url"}  = "$b/SysG-training-center/v1/documents/new";
    
    }
    
    #######################################################################################
    # Code, don't change below here.
    
    sub new {
        my ($class,$env) = @_;
        my $self = {};
        bless ($self,$class);
    
        if ($env) {
                $self->env($env);
        } else {
                $self->env($default_environment);
        }
    
        $self->set_vars;
        return $self;
    }
    
    sub AUTOLOAD {
        my ($self,$val) = @_;
        my $type = ref ($self) || die "$self is not an object";
        my $field = $AUTOLOAD;
    
        $field =~ s/.*://;
    
        #print "field: $field\n";
    
        unless (exists $self->{$field} || $field =~ /DESTROY/ )
        {
           die "ERROR: {$field} does not exist in object/class $type\n";
        }
    
        $self->{$field} = $val if ($val);
        return $self->{$field};
    
    }
    
    sub env {
        my ($self,$in) = @_;
        if ($in) {
                die ("Invalid environment $in") unless (grep($in,@valid_environments));
                $self->{"_env"} = $in;
        }
        return $self->{"_env"};
    }
    
    1;
    

提交回复
热议问题