J2EE之巔

           

          DSL實現要點(3)--利用腳本語言實現DSL

           

          由于腳本語言通常提供了更為簡潔的語法及Java所不具有的一些新的語言特性(如:閉包,元編程等),所以在一些情況下可以創造出比Java程序更具有可讀性的代碼。另外,眾多基于JVM的腳本語言也為與Java程序整合帶來了便利。


          Client: 語義模型實例的調用者

          SemanticConcept: 語義模型定義,可以通過腳本語言或Java實現

          ModelBuilder: 語義模型實例創建者,使用語義模型定義創建特定語義模型實例

          相關基本概念可以參考:

          DSL的實現要點(1)

          以下還是以自動門狀態機來作為實例:

          語義概念定義:

          Process.java

          package org.ccsoft.statemachine;

          import java.util.List;

          publicclass Process {

                private String name;

                private List<State> states;

                public String getName() {

                      returnname;

                }

                publicvoid setName(String name) {

                      this.name = name;

                }

                public List<State> getStates() {

                      returnstates;

                }

                publicvoid setStates(List<State> states) {

                      this.states = states;

                }

                private State getStateByName(String name){

                      for (State state:states){

                            if (state.getName().equals(name)){

                                  return state;

                            }

                      }

                      returnnull;

                }

                public State transit(String curState,String event){

                      for (State state:states){

                            if (state.getName().equals(curState)){

                                  String nextS=state.getTransitions().get(event);

                                  return getStateByName(nextS);

                            }

                      }

                      returnnull;

                }

          }

          State.java

          package org.ccsoft.statemachine;

          import java.util.Map;

          publicclass State {

                private String name;

                /**Map<state,event>**/

                private Map<State,String> transitions;

                public String getName() {

                      returnname;

                }

                publicvoid setName(String name) {

                      this.name = name;

                }

                public Map<State, String> getTransitions() {

                      returntransitions;

                }

                publicvoid setTransitions(Map<State, String> transitions) {

                      this.transitions = transitions;

                }

                @Override

                publicboolean equals(Object obj) {

                      if (obj instanceof State){

                            State other=(State)obj;

                            if (other.getName().equals(this.name)){

                                  returntrue;

                            }

                      }

                      returnfalse;

                }

                @Override

                publicint hashCode() {

                      // TODO Auto-generated method stub

                      returnname.hashCode();

                }

                @Override

                public String toString() {

                      // TODO Auto-generated method stub

                      returnname;

                }

               

               

          }

          語義模型實例創建者

          IStateMachineBuilder.java

          package org.ccsoft.statemachine;

          publicinterface IStateMachineBuilder {

                public Process build(String processName);

          }

          package org.ccsoft.statemachine

          publicclass StateMachineBuilder implements IStateMachineBuilder{

                 public Process build(String processName){

                       

                       switch(processName){

                       case"service":

                            Process process =

                                        new Process(

                                                    states:[

                                                       new State(

                                                                name:"open",

                                                                transitions:

                                                                [                            

                                                                       "timeOut":"close",

                                                                       "peopleClose":"close"

                                                                ]

                                                               

                                                       ),

                                                       new State(

                                                                   name:"close",

                                                                   transitions:

                                                                      [                            

                                                                            "peopleOpen":"close"

                                                                      ]

                                                       )

                                                    ]

                                        );

                             return process;

                             default:

                                   returnnull;

                       }

                 }   

          }

          作者采用的是Groovy,可見語言特性(集合及對象創建)有效提高了代碼的可讀性。

          連接腳本語言與Java

          作者采用Spring來實現Java及腳本語言的連接,你可以采用其他方式(如:JDK6Script Engine)。

          Spring配置文件(stateMachine.xml

          <?xml version="1.0" encoding="UTF-8"?>

          <beans xmlns="http://www.springframework.org/schema/beans"

                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

                xmlns:lang="http://www.springframework.org/schema/lang"

                xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd

                      http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang.xsd">

                <lang:groovy id="stateMachineBuilder" script-source="file:src/org/ccsoft/statemachine/StateMachineBuilder.groovy">

                </lang:groovy>

               

          </beans>

          Java調用程序

          package org.ccsoft.statemachine;

          import org.springframework.context.ApplicationContext;

          import org.springframework.context.support.ClassPathXmlApplicationContext;

          publicclass Main {

                /**

                 *@paramargs

                 */

                publicstaticvoid main(String[] args) {

                      ApplicationContext ctx = new ClassPathXmlApplicationContext("stateMachine.xml");

                      IStateMachineBuilder builder=(IStateMachineBuilder) ctx.getBean("stateMachineBuilder");

                      Process process=builder.build("service");

                      State nextState = process.transit("open", "timeOut");

                      System.out.println(nextState);

                }

          }

          由于腳本語言是解釋執行的,所以可以用作配置文件一樣,在部署后進行修改。同時腳本語言本身所具有的強大語法可以使其很容易地完成普通配置很難完成的功能。所以在很多時候我們都應該考慮使用腳本語言來進行配置。

          posted on 2010-04-06 18:21 超越巔峰 閱讀(3685) 評論(0)  編輯  收藏 所屬分類: DSL


          只有注冊用戶登錄后才能發表評論。


          網站導航:
          博客園   IT新聞   Chat2DB   C++博客   博問  
           

          導航

          統計

          常用鏈接

          留言簿(12)

          隨筆分類(54)

          隨筆檔案(59)

          文章分類(2)

          文章檔案(1)

          相冊

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 安新县| 高阳县| 宁城县| 班戈县| 桂平市| 敦化市| 察哈| 石首市| 宁南县| 宽甸| 富蕴县| 江西省| 灌阳县| 三亚市| 丘北县| 旬邑县| 互助| 静宁县| 洛浦县| 那坡县| 盐亭县| 庆安县| 淮北市| 江城| 南涧| 临澧县| 东乡| 长岛县| 涿鹿县| 临湘市| 日土县| 洛阳市| 顺义区| 通河县| 荆门市| 乌兰县| 淮安市| 黄梅县| 咸丰县| 沅陵县| 夏河县|