文档章节

抽象的好处

崔钢
 崔钢
发布于 2015/03/06 10:55
字数 1121
阅读 179
收藏 4
1. 继承上的逻辑一致性
2. 约束能力的扩展

抽象类设计出来就是为了被继承的。因此其目的性十分的明确,同时它不能独立的存在,就如同一个通用的单元一样。由于它不能独立的被实例化,所以不会对封装性构成破坏性的影响,无论怎么使用,都是安全的。另外protected这种访问性其实和private也差不多了,很好的封装数据。

抽象类可以通过和子类公用的protected的属性或者字段来增加约束能力。当然这个可能是不好的方面,但是有效,也安全。毕竟程序总是在变化的,虽然我们尽可能的去控制这种变化,但是不一定完全控制的住。(这个我解释一下,抽象类的约束,当然是抽象方法,但是有可能出现一种情况,就是你的代码已经完成了80%,突然有一个新的需求,需要在抽象方法中增加两个参数,这意味着什么,大家都清楚,不仅仅是改动,还有很大的调试工作量,这个时候就可以通过增加protected字段的方式来解决这样的问题。不过,这样可能是不好的,但是我们总要向现实妥协对么?我从来不期待设计一个完美的系统。完美都是相对的,差不多就可以了。)

以上是对之前罗列的两条理由的解释


我不太建议把抽象类当做接口来使用。也就是说,抽象类应该是隐蔽的,不会被当做一个确定的可以使用的类型来使用。也就是说,不应该把抽象类中的任何内容直接暴露给用户。java不能多继承的缺点,在这里就暴露出来了,在设计上极其的不灵活,可能会导致臃肿的抽象类出现。

继承了抽象类的类最好设计成final的,不要再次的被继承。

继承的一个很大的问题是,在继承链上,会出现很多的类型,你需要保证这些类型的逻辑上的一致性,否则可能会让人产生混乱。这其实是很难的。这是因为人类的认识系统客观局限性导致的。人类无法完全完整的一次性的认识对象,总要经历几次飞跃才好。

软件其实就是人类的思想在计算机世界中的体现,当然,现在还是很初级的。

抽象是比较困难的,因为这个技艺目前仅仅只能有人类来掌握使用。同时不同的人眼里的系统可能是不同的。因此为了保证抽象的有效,最好能够坚持一个人的主导作用。

还有一个原因,就是抽象的目的。之前有一种论调,说到一些设计可能是炫技。我不认为在软件设计上有什么炫技的行为,技术总是为了目的而服务的,关键是你的目的是什么。抽象是设计的主要工作,大概在软件实现设计上会涵盖80%的工作。

目的只有一个: 减少代码量

所有软件开发的目标都只有一个,在完成功能的情况下,尽可能的减少代码量。

越少的代码以为着越好读懂,越好读懂意味着越好维护,这些都意味着成本的降低。

用这个指标去衡量设计中的抽象是非常合理的。不要被学术派的言论打扰去追求什么模式。而是要创造性的利用编程语言提供的种种便利来尽可能的压缩代码量,原则就是没有原则,少即是多,越少越好。不同语言的抽象能力是不同的,java在这方面当然是最差的。所以如果可能的话,不要选择java去开发你的系统,代价十分的巨大。

最少的代码,做最多的事情,这应该是每个编程语言的目标,如果它不是,那么,我觉得这样的语言是没有价值的。

© 著作权归作者所有

共有 人打赏支持
崔钢
粉丝 171
博文 99
码字总数 59953
作品 0
西安
高级程序员
私信 提问
看大话设计模式,研究状态模式-- 搞明白抽象类与接口的区别

抽象类,是面向继承关系的。 子类可直接使用父类方法。 接口是面向方法行为规范统一的。 接口的每个子类需要做方法的实现。 而且是每个抽象方法的实现。 单继承,多接口。 .Net提供了接口,这...

马知常
2013/09/11
0
1
[转载]java里抽象类和接口的区别

下面的这篇文章讲的十分透彻了,所以转载之 abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java强大的面向对象能力。abstrac...

曾赛
2009/08/17
130
0
Java入门之面向对象使用接口编程

假设: 三位互联网风云人物除了本身的职位外,给他们增加医生、警察、司机三个职务。现在他们要去学习一项Java开发的技术,对于老师来讲,三位都是学生,老师只关注学生这一个身份,其他的身...

AllenZhao_
2018/07/16
0
0
C#设计模式之建造者模式(Builder Mode)

建造者模式 当需要将一个复杂的对象与它的表示分离,使得同样的构建过程可以创建不同的表示时,可以使用建造者模式.如果使用建造者模式,用户只需指定需要构建的类型即可,具体建造的过程和细节就...

GoodWin
2014/01/15
0
0
设计模式之抽象工厂模式学习

抽象工厂模式:提供了一个创建一系列相关或相互依赖对象的接口,而无需指定它们的具体的类。它用于解决涉及多个产品系列的问题,包含所有产品的创建方法。 AbstractProductA和AbstractProdu...

长平狐
2012/10/08
32
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周四乱弹 —— 出现了一个小姐姐舔我?

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @ nnnm : 昨天收到一个分享的英文歌曲,很好听的。本来对于英文歌曲一直不多去琢磨,因为英语学得不好啊!但是这看到首歌的歌词后,才明白:...

小小编辑
11分钟前
11
2
编码规范

4.、编码时的一些建议 1、尽量指定类、方法的final修饰符——虚拟机会想办法内联所有的final方法来减少方法执行时创建栈帧的数量,从而降低栈溢出的风险 2、尽量重用对象——重复new对象会增...

呵呵哒灬
今天
2
0
第一个docker化的java应用

Docker 思想 集装箱 标准化:运输方式/存储方式/API 接口 隔离

BeanHo
今天
1
0
移植Modbus到STM32F103(1):coil、discrete、holding和input的取舍

之前自己给设备写的通信协议,一到工作环境就不停通信错误。思前想后,觉得原因是自己瞎写的协议不好,无法适应有噪音的环境,所以决定移植一个成熟的协议。查了资料,发现Modbus协议简单(容...

Konstantine
今天
0
0
Flutter | 状态管理特别篇——Provide

前言 今天偶然发现在谷歌爸爸的仓库下出现了一个叫做flutter-provide的状态管理框架,2月8日才第一次提交,非常新鲜。在简单上手之后感觉就是一个字——爽!所以今天就跟大家分享一下这个新的...

Vadaski
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部