hehuang139 2015-07-26 14:42 采纳率: 100%
浏览 1904

接口的作用 面向对象设计

不好意思,也许我这个问题很低级,但是困恼自己好久,今天鼓起勇气问下大家,希望各位oo大神能不吝赐教
如题,有一个和接口非常相似的存在:抽象类,它们都是对职责的抽象,区分2者还是比较简单的,抽象类表示是is-a,表示一个类型,是类型的抽象,而接口是行为的抽象。
一个抽象类的方法并不能用来用来定义一个类型,举个例子:猫会叫,但是会叫的不一定是猫,比如说闹钟也会叫。既然如此,那一个行为到底是该定义在抽象类中,还是应该定义在接口中。比如说刚才的例子,叫这个行为到底应该定义在猫中,还是应该定义在ISayable接口中?问题在推广下,何时该把类中的行为抽出来定义成一个接口,也就是何时该使用接口?个人意见这里面一定有业务层面的考虑,没有一个决定的标准,比如说如果只有一个猫这种抽象,没有闹钟这个抽象就没有必要用专门定义一个ISayable接口
经常有接口的滥用,个人认为接口的滥用更多的是凡是都用接口,比如现在的service+impl设计模式,明明只有一个实现类,一定要都定义一个接口
目前自己的开发经验是这样的:从重构的观点去看接口的定义,一开始是没有任何接口的,只有无所的类,在需求不断变更中,发现共性的行为及行为的不同实现,在抽取成接口。也就是说在承认自己水平不够的情况下(无法一下子考虑行为的抽象),不建议一开始就定义接口,而是随着需求的变化中去添加接口

  • 写回答

3条回答

  • threenewbee 2015-07-26 14:55
    关注

    你说的没有错。分层的目的最终是为了层的替换,但是培训班往往为了分层而教你分层。所以机械地把代码抽象成接口,再创建唯一的实例。

    这离真正的软件设计相去甚远甚至背道而驰。

    你自己总结的很好,定义接口并不是只有优点没有缺点的。一旦你定义了接口,那么这个接口中的方法必须被实现,无论它有没有意义。所以根本不懂软件设计的人草率地定义一个接口,会给项目带来很大的问题。后续的开发者无法轻易修改接口,因为你要修改接口意味着你必须保证它的全部实现的代码都必须追回来修改。

    评论

报告相同问题?

悬赏问题

  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题