如鹏网 大学生计算机学习社区

CowNew开源团队

http://www.cownew.com 邮件请联系 about521 at 163.com

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  363 随笔 :: 2 文章 :: 808 评论 :: 0 Trackbacks

这是刚才和一个朋友的聊天记录,希望对大家有帮助:
佘士东 08:41:47
我设计一个接口,其中有些方法很类似,比如取得某个工作对象,有可能需要获得多个,也有可能获得其中一个,参数为工作对象的名字、名字列表。
我是用窄接口还是宽接口好,是用一个最大功能的方法还是多个重载方法好?
比如:
IService
public Worker  getWorker(String name);
public Vector<Worker> getWorkers(final Vector<String> names);
我是在接口约束这两个方法还是只约束最大的那个,使所有的方法都适配为后面这个最大方法,而在接口中去掉第一个方法
杨中科 08:51:57
我认为还是多个重载方法好,主要是考虑方便别人使用
 
杨中科 08:52:31
顺便说一句:为什么参数和返回值要用Vector?用List接口不更好吗?
 
佘士东 08:53:55
如果适用者很有限,大概只有5个左右,实际上使用者也是提供适配功能,比如使用cs结构,web方式,wap方式,sms方式获得接口服务的适配模块
佘士东 08:55:04
我的想法是使用Vector它是异步安全的,服务可能是多线程实现的,所以使用Vector返回,不知道有没有这个必要,有没有这个作用
杨中科 08:55:12
你说的是什么意思,不太明白。你说getworker方法不是所有实现类都能实现?
 
佘士东 08:56:35
其实这个接口是夹在实现和使用这中间的,使用者实现不同类型服务的适配,实现根据项目不同所要求的业务实现不一样,实际上这个接口是约束实现要多
佘士东 08:58:08
如果接口方法太多,我怕如果变更会不会陷入变更里面,因为重载多了,其中很多有重复,比如参数列表,如果需要加上用户验证,那就都要加,这样所有实现都要改动一批
杨中科 08:59:41
“我的想法是使用Vector它是异步安全的,服务可能是多线程实现的,所以使用Vector返回,不知道有没有这个必要,有没有这个作用 ”,你可以将传进来的List参数用Collections类中的syn****List方法将List搞成异步安全的,返回的时候你也可以返回Vector类型的,但是返回值要生命成List类型
 
杨中科 09:00:14
要考虑二次开发人员的易用性,大部分人还是倾向于使用List、ArrayList这样的东西的
 
杨中科 09:01:50
“如果接口方法太多,我怕如果变更会不会陷入变更里面,因为重载多了,其中很多有重复,比如参数列表,如果需要加上用户验证,那就都要加,这样所有实现都要改动一批 ”,还是那句话,不要陷入实现的漩涡中,你的接口是声明服务用的,不要管实现,怎么实现是实现类的事情,站在二次开发人员的角度来看你必须同时提供getworker和getworkers两个方法
 
佘士东 09:01:49
原来如此,就是说实际上还是Vector,只不过返回值使用List接口,但是如果他直接转换成ArrayList使用会不会丢掉原来异步安全特性?因为返回值毕竟只是一个引用,可能其它地方也在用同一个引用
杨中科 09:02:30
不可能转换为ArrayList的,否则运行的时候会抛ClassCastException
 
佘士东 09:02:46
但是,二次开发实际上是开发实现类,而不是服务调用类
杨中科 09:03:24
哦,也就是二次开发实际上是写一个实现了你定义的接口的插件???
 
佘士东 09:03:47
对,就是这个意思
杨中科 09:04:57
那也最好提供这两个接口,这样你使用这些插件的时候也方便,你可以写一个抽象类来实现默认的getworker方法,在getworker中调用getworkers方法,这样二次开发人员一般只要实现getworkers方法就可以了
 
佘士东 09:04:57
但是这个插件是惟一的,使用一个Factory获得实现
佘士东 09:05:57
哈哈,豁然开朗,宽接口,加上适配抽象父类,就搞定了
杨中科 09:06:26
接口方法是越多用起来越方便
 
佘士东 09:07:10
我只是怕在产生变更的时候,对应的实现也要改动很多,毕竟框架才是初期
杨中科 09:08:29
“对应的实现也要改动很多”,那就看你抽象类的实现水平的,定义接口的时候不要去想实现,只要想接口定义那些方法才够用就可以,实现和接口不能混
 
杨中科 09:09:00
你可以用各种设计模式来保证不会发生“产生变更的时候,对应的实现也要改动很多”
 
杨中科 09:09:11
但是接口就是接口

posted on 2007-03-13 09:18 CowNew开源团队 阅读(1956) 评论(10)  编辑  收藏

评论

# re: 关于接口的设计 2007-03-13 10:32 DoubleHeart
public List<Worker> getWorkers(final List<String> names);


这样才对,这样不管你传进来的是ArrayList、Vector、LinkedList……
都可以正常执行,这才是接口的真谛——实现了共性的抽象!!!  回复  更多评论
  

# re: 关于接口的设计 2007-03-13 15:44 DoubleHeart
而你们俩讨论来讨论去的,只是把接口当门面来用了!!!
这是接口使用的误区。  回复  更多评论
  

# re: 关于接口的设计 2007-03-13 15:54 CowNew开源团队
to DoubleHeart:
thanks,请详细指教。  回复  更多评论
  

# re: 关于接口的设计 2007-03-14 13:21 mars
接口的返回值和多线程有什么关系么?你告诉别人方法是不是线程安全的不就行了,至于返回值list怎么处理,是由调用你的人来处理啊??不明白>>
  回复  更多评论
  

# re: 关于接口的设计 2007-03-14 13:34 CowNew开源团队
to mars:我那个朋友的意思应该是方法返回一个线程安全的List接口对象,这样调用者就不用考虑线程安全问题了。  回复  更多评论
  

# re: 关于接口的设计 2007-03-15 09:02 剃刀
楼主自己连什么叫重载都没搞清楚.  回复  更多评论
  

# re: 关于接口的设计 2007-03-15 09:10 CowNew开源团队
to 剃刀:谢谢,虽然心里知道重载和重写的差别,但是由于上学的时候老师就把重写说成重载,已经养成习惯了,所以经常说混,郁闷呀。  回复  更多评论
  

# re: 关于接口的设计 2007-03-15 11:08 mars
我个人认为返回Vector只会限制你对你接口将来的扩展,另外Vector类性能低下,你会限制客户端提升性能,  回复  更多评论
  

# re: 关于接口的设计 2007-03-19 14:06 StormSpire
接口不应该不需要考虑实现的方法,是否是同步还是异步,需要调用者考虑。
另外基本原则是接口尽量用interface, List 是interface,vector不是,所以vector做接口是不可取的  回复  更多评论
  

# re: 关于接口的设计[未登录] 2007-04-29 15:32 王千
杨中科 不是我教的你面向对象吧!不要在背后说老师的坏话啊 呵呵  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航: