• 2011-06-29

    当开发不同于发布

    版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
    http://www.blogbus.com/dreamhead-logs/142197421.html

    缘起
    面试,他是一个游戏的开发者,于是,他给我们介绍了他们项目中的一些技术。

    “我们项目里面用到一个框架,我们的代码就可以和Flash交互,这样,设计师使用Flash专注于设计,我们来做逻辑。在发布的时候,我们会用工具把Flash导成另外一种格式,从而得到更高的运行时效率。”
    “你们是怎么区分是用Flash,还是另外一种格式呢?”
    “在代码里有一个DEBUG宏,打开的时候就是Flash。”

    我下意识的想到了《代码之丑(十) 》里那一团浆糊的代码。在那篇blog里,我曾建议把这种情况放到构建脚本里处理。

    一个实例
    项目刚好有类似的情况,根据自己的建议,这是构建脚本处理的东西。

    在buildr里,通过ENV['BUILDR_ENV'],我们可以得到当前环境的名字:development还是production,抑或是其它。这便是我们的切入点,比如,测试环境采用一些假的实现,让整个系统运行的更快。

    下面是一个例子,有一个搜索组件,在生产环境下,我们要采用真实的搜索引擎实现,而在开发环境时,它只是一个简单内存实现。针对这两种不同的情况,我们会有不同的配置文件:

    <beans xmlns="http://www.springframework.org/schema/beans" 
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xsi:schemaLocation="http://www.springframework.org/schema/beans
                    http://www.springframework.org/schema/beans/spring-beans.xsd">
      <bean id="searcher" class="com.killer.SuperSearcher"/>
    </beans>
    (searcher.production.xml)

    <beans xmlns="http://www.springframework.org/schema/beans"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xsi:schemaLocation="http://www.springframework.org/schema/beans
                    http://www.springframework.org/schema/beans/spring-beans.xsd">
      <bean id="searcher" class="com.killer.InMemorySearcher"/>
    </beans>
    (searcher.development.xml)

    要使用这个组件只要引用search.xml,把searcher拿过来用就好了:

    <import resource="search-context.xml"/>
    ...
    <property name="searcher" ref="searcher"/>

    接下来,用一个task就可以处理这些差异:

    task :searcher do
      cp "searcher.#{ENV['BUILDR_ENV']}.xml", "searcher.xml"
    end

    其实,实现这一点真正困难的并不在于配置文件,而在于这些组件的设计。只有识别出这些组件,把它们独立出来,才会可能根据不同的环境进行配置。

    在为数不少的“直觉式”设计中,环境相关的信息是靠if..else(或是宏)区分的,更致命的是,这些信息散落在各处。没有恰当的抽象,构建脚本也无能为力。

    分享到:

    历史上的今天:

    引用地址: