opt:application相关练习(一)

制作一个名为 prime_tester_server 的gen_server,让它测试给定的数字是否是质数。把它添加到sellaprime_supervisor.erl的监控树里
修改监控树和app配置
在这里插入图片描述
在这里插入图片描述
尝试使用判断质数出错

7> prime_tester_server:prime(101).
** exception exit: {noproc,{gen_server,call,
                                       [prime_tester_server,{is_prime,101},20000]}}
     in function  gen_server:call/3 (gen_server.erl, line 1126)

原因分析:sellaprime_supervisor修改没有重新编译
重新编译后启动应用程序
在这里插入图片描述
在这里插入图片描述
制作由10个质数测试服务器组成的进程池。制作一个队列服务器来把请求加入队列,直到其中一个质数测试服务器处于空闲状态为止。当质数测试服务器空闲时,向它发送一个请求来测试某个数字是否是质数

-module(prime_tester_supervisor).
-behaviour(supervisor).
-export([start_link/0]).
-export([init/1]).

start_link() ->
    supervisor:start_link({local, ?MODULE}, ?MODULE, []).

init(_) ->
	  Re = {prime_tester_server, {prime_tester_server, start_link, []}, temporary, infinity, worker, [prime_tester_server]},
    Pools = [Re || _ <- lists:seq(1, 10)],
    {ok, {{one_for_one, 3, 10}, Pools}}.

在应用监控器下添加此监控器

init([]) ->
	%% 安装错误处理器
	gen_event:swap_handler(alarm_handler,
												 {alarm_handler, swap},
												 {my_alarm_handler, xyz}),
	{ok, {{one_for_one, 3, 10},
				[
					{prime_tester_supervisor, {prime_tester_supervisor, start_link, []},permanent, infinity, supervisor, [prime_tester_supervisor]},
					{tag1, {area_server, start_link, []}, permanent, 10000, worker, [area_server]},
				 {tag2, {prime_server, start_link, []}, permanent, 10000, worker, [prime_server]},
					{tag3, {prime_tester_server, start_link, []}, permanent, 10000, worker, [prime_tester_server]}
				]
	}}.
这个代码示例展示了一个简单的接口定义和一个类`Router`,它接受一个`opts`接口类型的对象作为构造参数。为了优化这段代码,我们可以考虑以下几个方面: 1. **接口和类的可维护性**: - 检查`opts`接口是否只包含`path`属性,如果是这样,可以考虑是否需要定义为接口,或者直接使用类型别名(Type Alias)。 - 如果`path`属性可以有默认值或更复杂的结构,可以考虑是否需要扩展这个接口。 2. **代码复用性**: - 如果`Router`类中的`opt`属性经常需要访问,可以提供方法来获取或修改这个属性,以提供更好的封装性。 - 如果`opts`接口中的属性在未来可能增加,可以考虑是否需要添加方法来处理这些额外的属性。 3. **类型安全性**: - 确保`path`属性是不可变的,这样可以防止在`Router`类的实例化后修改`path`。 - 如果`path`是一个字符串字面量类型,可以定义为`readonly`,以防止外部修改。 4. **构造函数优化**: - 检查是否需要在构造函数中进行额外的逻辑处理,比如验证`path`的合法性等。 优化后的代码可能如下所示: ```typescript interface RouterOptions { path: string; } type RouterOptionsType = { readonly path: string; } class Router { private options: RouterOptionsType; constructor(options: RouterOptions) { // 可以在这里添加验证逻辑,例如确保path不是空字符串等 if (!options.path) { throw new Error("Router path must be provided"); } this.options = options; } // 可以添加公共方法来获取Router的配置 getOptions(): RouterOptionsType { return this.options; } // 其他需要的方法... } ``` 通过这些优化,我们提高了代码的可维护性、复用性和类型安全性,并且为将来可能的扩展留出了空间。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值