10 December 2005
This post may be outdated due to it was written on 2005. The links may be broken. The code may be not working anymore. Leave comments if needed.
我们一般写代码都应当避免一种称为 hardcode 硬代码。
所谓的 hard code 是指将代码拷贝到另外的地方你必须更改其中的某些代码。
比如你写了一个 Controller, 里面使用了类如 '/home/fayland/eplanet' 这样的字符串。当你将这个代码迁移到其他目录或其他机子的时候,人们必须要改变这个字符串才能正常运行该程序。我们管这些字符串为 hard code.
一种避免 hard code 的方法就是将所有的这些字符串用一个配置文件包括,这样人们就只需要修改下配置文件就能运行程序而不是修改程序的源代码。
这种避免 hard code 的方法尤其在源码协作/ Subversion 时最为有用。每人拥有相同的源码不同的配置文件,这样不会对源码造成冲突。

最近的 CatalystAdvent 就介绍了怎么在 Catalyst 中使用 Day 9 - YAML, YAML, YAML!.
原来在 MyApp.pm 中这么写的代码:

 __PACKAGE__->config( name => 'MyApp', 'View::TT' => { EVAL_PERL => 1 } );
将修改为:
use YAML ();    
__PACKAGE__->config( YAML::LoadFile( __PACKAGE__->path_to('myapp.yml') ) );
而 myapp.yml 文件的结构为:
---
name: MyApp
View::TT:
EVAL_PERL: 1
不过该 Advent 里没有介绍怎么写 yml 文件。对于复杂的希哈里套数组再套希哈什么的结构很容易让人写错。
我一般的习惯都是写一个 pl 文件来创立该 yml 文件。比如在 Person 项目中我在 tools 里是这么写的:
#!/usr/bin/perl
use strict;
use warnings;
use FindBin;
use YAML();

# CHANGE THIS LINE, THEN RUN IT!
my $DIR = $FindBin::Bin;
$DIR =~ s!/tools/?!!; # /usr/local/apache/www/Person
print $DIR;

my %a = (
   name => 'Person',
   root => "$DIR/root",
   templates => "$DIR/templates",
   member_images => "$DIR/root/member",
   email => {
       enable => 1, # local machine can be 0
       charset => 'utf8',
       smtp_host => '61.152.95.132',
       prefix => '[PerlChina]',
   },
   dsn => 'dbi:mysql:person',
dsn_user => 'root',
dsn_password => '',
images_folder => "$DIR/captcha/images",
   data_folder => "$DIR/captcha/data",
   output_folder => "$DIR/root/captcha",
   # if u run this in your local machine, CHANGE IT
   base_site => 'http://localhost:3000/',
);

YAML::DumpFile("$DIR/Person.yaml", \%a);
print ', DONE!';

1;

这样我们用 YAML::DumpFile 出一个 yml 文件,然后用 LoadFile 导进一个。非常的绝配。 :-)
详细的查看 http://dev.perlchina.org/cgi-bin/trac.cgi/browser/trunk/Person/tools/YAML_Create.plhttp://dev.perlchina.org/cgi-bin/trac.cgi/browser/trunk/Person/lib/Person.pm


blog comments powered by Disqus