原创作者: 自由天堂
阅读:5353次
评论:0条
更新时间:2011-06-01
我们之前写的server已经比较通用了,但是erlang有更进一步的方案。
erlang不象java那样到处都是接口和实现类,它关注的是函数,也就是逻辑,当然,只要编程就要有规约,erlang的规约是通过"模板类"实现的,这个"模板类"的正式名称叫做behaviour。
一个典型的模板类大概就像这样——
我们使用这个模板类——
显然,由于my_behaviour中通过behaviour_info申明了somefunc/1函数,所以my_server6就必须要实现这个函数了,修改一下看看——
说起来并不神秘,behaviour仅仅是一个让编译器看的标记后,编译器会据此检查本模块是否已经具备要求实现的接口,否则会提示错误,这种方式非常简单的确保了系统的可靠性。
借助这个机制,我们只要保证使用了my_behaviour,模块就可以调用somefunc/1函数,它就像java中接口一样,是一种编程契约
接下来,我们使用behaviour机制改造之前的my_server5,把回调函数抽取出来由behaviour描述——
相应的,handle2代码会变成这样:
执行方式类似
erlang不象java那样到处都是接口和实现类,它关注的是函数,也就是逻辑,当然,只要编程就要有规约,erlang的规约是通过"模板类"实现的,这个"模板类"的正式名称叫做behaviour。
一个典型的模板类大概就像这样——
% my_behaviour.erl % -module(my_behaviour). -export([bingo/1]). -export([behaviour_info/1]). behaviour_info(callbacks) -> [{somefunc,1}]; behaviour_info(_Other) -> undefined. bingo(Mod) -> Mod:somefunc(ok).
我们使用这个模板类——
% my_server6.erl % -module(my_server6). -behaviour(my_behaviour).
Eshell V5.7.2 (abort with ^G) 1> c(my_behaviour), c(my_server6). ./my_server6.erl:3: Warning: undefined callback function somefunc/1 (behaviour 'my_behaviour') {ok,my_server6}
显然,由于my_behaviour中通过behaviour_info申明了somefunc/1函数,所以my_server6就必须要实现这个函数了,修改一下看看——
Eshell V5.7.4 (abort with ^G) 1> c(my_behaviour), c(my_server6). {ok,my_server6} 2> my_behaviour:bingo(my_server6). ok
说起来并不神秘,behaviour仅仅是一个让编译器看的标记后,编译器会据此检查本模块是否已经具备要求实现的接口,否则会提示错误,这种方式非常简单的确保了系统的可靠性。
借助这个机制,我们只要保证使用了my_behaviour,模块就可以调用somefunc/1函数,它就像java中接口一样,是一种编程契约
接下来,我们使用behaviour机制改造之前的my_server5,把回调函数抽取出来由behaviour描述——
% my_server7.erl % -module(my_server7). -export([start/2,stop/1]). -export([init/2]). -export([request/2]). -export([behaviour_info/1]). behaviour_info(callbacks) -> [{init,1},{handle_request,2}]; behaviour_info(_Other) -> undefined. ......
相应的,handle2代码会变成这样:
% my_handle2.erl % -module(my_handle2). -behaviour(my_server7). -export([init/1,handle_request/2]). init(State) -> State. handle_request(Request,State) -> io:format("request to callback1: ~p~n",[Request]), {"ok",State}.
执行方式类似
Eshell V5.7.2 (abort with ^G) 1> c(my_server7), c(my_handle2). {ok,my_handle2} 2> C = my_client:start(),my_server7:start(my_handle2,"init"). <0.45.0> 3> my_server7:request(my_handle2, "hello by behaviour"). request to callback1: "hellby behaviour" ok 4> my_server7:stop(my_handle2). process stopped.last state is "init" stop
评论 共 0 条 请登录后发表评论