refactor遇到死胡同。 (转)

本文探讨了一种通过引用计数来管理资源的模式,并详细介绍了如何为Pool接口实现这一模式,确保资源在不再需要时能够正确释放。进一步讨论了当引入带有额外功能的新接口时,如何避免代码重复。
refactor遇到死胡同。 (转)[@more@]

郁闷, refactor遇到死胡同。


我有一个接口Pool, 如下:
public interface Pool{
 Worker getWorker();
}
用来从池中取得一个Worker对象。Worker的接口是:
public interface Worker{
 public void start(Runnable r);
}
另外有一个接口PoolOwner, 作为一个Pool的拥有者,可以对Pool进行清理,关闭等操作
public interface PoolOwner extends Pool{
 public void close();
 ...
}
现在,一个异步任务处理模块需要使用Pool对象。同时,我不想让这个任务处理模块拥有Pool对象的所有权,因为,多个不同的模块可能要共享一个Pool.
可是,我又需要保证Pool对象在不用时被关掉。依赖finalize当然是不好的了。

所以,这里,我引入了引用计数的机制:
一个Referent接口,代表计数server, 它应当拥有一个Pool的所有权。
public interface Referent{
 public void enref();
 public void deref();
 public Pool get();
}
一个线程安全的实现代码是:
final class ReferentImpl implements Referent{
 public synchronized void enref(){++count;}
 public synchronized void deref(){
 if(--count<=0)pool.close();
 }
 public Pool get(){return pool;}
 private final PoolOwner pool;
 private int count=1;
 private ReferentImpl(final PoolOwner p){this.pool = p;}
 static Referent instance(final PoolOwner p){return ReferentImpl(p);}
}

此外,我们还需要一个代表引用计数客户的借口。
public interface Ref extends Pool{
 public Ref enref();
 public void release();
}
这里,对客户端的考虑是:
1。 绝对不允许一个Ref对象把Referent的计数递减两次。否则,一个客户的失误就又可能影响到其它客户的工作。
enref将生成一个新的客户,而旧的客户仍然只需调用release一次。
我的实现是这样:
首先,做一个null reference.

final class NilReferent implements Referent{
 public void enref(){
 throw new NilRefException();
 }
 public void deref(){}
 public Pool get(){throw new NilRefException();}
 ...//这里,做一个singleton.
}
然后:
final class RefImpl implements Ref{
 public Ref enref(){
 ref.enref();
 return instance(ref);
 }
 public void release(){
 ref.deref();
 ref = NilReferent.instance();
 }
 public Worker get(){
 return ref.get().getWorker();
 }
 protected final void finalize(){ref.deref();}
 private RefImpl (final Referent r){this.ref = r;}
 static Ref instance(Referend r){return new RefImpl(r);}
}

测试的代码如下:
PoolOwner pool = ......;
final Ref r1 = RefImpl.instance(ReferentImpl.instance(pool));
final Ref r2 = r1.enref();
r1.get();
r1.release();//释放r1
r2.get();//这里,r2可以工作
r1.release();//抛出异常,r1已经调用过一次release
r2.get();//r2仍然可以照常工作
r2.release();//这里,计数减到0, pool会被Referent关闭
r2.get();//抛出异常,r2已经release了。


好,到此,一切都很好。但接下来。。。

我还有一个接口Processor
public interface Processor extends Worker{
 public void interrupt();
}
这个Processor提供中断的功能,因此,会要求实现者更复杂的逻辑,而且会有一定的效率上的代价。
有了Processor, 就有ProcessorPool
public interface ProcessorPool{
 public Processor getProcessor();
}
ok, 我也实现了Processor和ProcessorPool. 以及,很自然的ProcessorPoolOwner:
public interface ProcessorPoolOwner extends ProcessorPool{
 public void close();
}

好啦,现在,如果我也要实现以上的引用计数逻辑,怎么办?
有什么好办法可以不用copy&paste呢?感觉象到了死胡同啊!

 


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10752043/viewspace-991547/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/10752043/viewspace-991547/

在数字化环境中,线上票务获取已成为参与各类活动的主要途径。随着公众对热门演出需求的增长,票源往往在开放销售后迅速告罄,导致普通消费者难以顺利购得所需票券。为应对这一挑战,部分技术开发者借助编程手段构建了自动化购票辅助程序,旨在提升用户成功获取门票的概率。本文将以一个针对特定票务平台设计的自动化工具为例,系统阐述其设计理念、技术组成及具体实施流程。 秀动网作为国内知名的演出及体育赛事票务销售平台,因活动热度较高,常出现访问拥堵、瞬时抢购压力大等现象,使得常规购票过程面临困难。因此,开发一款能够协助用户更有效完成票务申购的辅助工具具有实际意义。 该工具主要具备以下几项关键功能:持续监控目标平台的票务信息更新;在票务释放时自动执行选座、添加至购物车及提交订单等系列操作;集成一定的异常处理机制,以应对网络延迟或服务器响应异常等情况。 在技术实现层面,选用Python作为开发语言,主要基于其语法简洁、标准库与第三方资源丰富,适合快速构建功能原型。同时,Python在网络通信与浏览器自动化方面拥有如requests、selenium等成熟支持库,为程序实现网页交互与数据抓取提供了便利。 开发过程主要包括以下环节:首先解析目标网站的页面结构,明确可通过程序操控的网页元素路径;随后编写监控模块,实时检测新票务信息的上线并及时触发后续操作;接着模拟用户操作流程,包括自动填写个人信息、选择座位偏好、完成购物车添加等步骤,并通过行为模拟降低被平台反爬虫机制识别的可能;最终实现订单自动提交,并在成功购票后向用户发送通知。 此外,该工具提供了可配置的操作界面,允许用户根据个人需求设定抢票时间、目标活动类型及座位选择等参数,从而在提升使用体验的同时,减少对票务平台服务器资源的非必要占用。 需指出的是,尽管此类工具能提高购票效率,但其使用可能涉及违反平台服务协议或相关法规的风险。各票务销售方通常对自动化抢票行为设有明确约束,因此开发与使用者均应遵守相应规定,确保技术应用的合法性。 综上所述,该基于Python的票务辅助工具是针对特定场景设计的自动化解决方案,通过技术手段改善用户购票体验,但同时也强调必须在法律与平台规则框架内合理使用此类技术。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
<think> 我们被要求使用"refactor"作为commit类型来优化之前的提交。根据约定式提交规范,"refactor"用于代码重构,即在不改变外部行为的前提下改进代码结构。 之前的提交信息是“优化接口调用实现”,这属于代码重构,因此我们可以将其改为: refactor(database): 优化接口调用实现 注意:括号内的"database"是scope,表示修改的范围是数据库相关模块。如果项目有明确的模块划分,使用scope有助于分类。 因此,正确的提交命令应该是: git commit -m "refactor(database): 优化接口调用实现" 如果之前的提交已经被推送到远程仓库,可以使用amend然后强制推送(注意:强制推送在团队协作中需谨慎): git commit --amend -m "refactor(database): 优化接口调用实现" git push --force 但如果尚未推送,则直接使用amend即可。 另外,根据之前的错误提示,提交信息需要符合规范,使用"refactor"类型是符合要求的。 现在,我们按照要求回答问题,并在最后提出3-5个相关问题。 </think> ### 使用 `refactor` 类型的 Git Commit 建议 根据约定式提交规范,`refactor` 类型适用于**在不改变外部行为的前提下重构代码**的场景。以下是针对您需求的规范提交方案: #### 推荐提交格式: ```bash git commit -m "refactor(database): 优化接口调用实现" ``` #### 详细说明: 1. **类型选择**: - `refactor`:表示代码重构,不涉及功能修改和错误修复 - ⚠️ 避免使用 `chore`(适用于构建/配置变更)或 `perf`(适用于性能优化) 2. **范围指定**: - `(database)`:明确修改范围在数据库相关模块 - 其他可选范围:`(api)`, `(ui)`, `(core)` 等 3. **多模块重构示例**: ```bash git commit -m "refactor(database): 重构接口参数映射逻辑 refactor(api): 优化请求处理流程" ``` #### 典型重构场景: | 场景 | 示例提交信息 | |-------------------------------|---------------------------------------| | 函数/组件重构 | `refactor(utils): 抽象数据格式化函数` | | 代码结构优化 | `refactor(router): 重构路由分层结构` | | 接口调用逻辑优化 | `refactor(api): 简化服务调用链` | | 技术债务消除 | `refactor(core): 清理废弃代码片段` |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值