抽象的好处

1. 继承上的逻辑一致性
2. 约束能力的扩展

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

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

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



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

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

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

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

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

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

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

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

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

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

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

时间: 2024-11-03 01:37:50

抽象的好处的相关文章

关于工厂模式(简单以及抽象)

简单工厂模式: 简单工厂模式可以认为是一个创建实例的过程,可以代替new的方式,创建一个新的实例.创建实例new的时候要多考虑一下,看是否可以使用工厂模式,虽然可能多做一些工作,但是系统可能会有更少程度的修改. 直白的说就是把对象创建的过程封装到一个新的类中去,比如这个类创建的初始化过程比较麻烦,按老方法就是把这些全放在这个类的构造函数中,但是这样显然不利于维护,所以就把这部分内容提取出来放到一个新的类中,这个类的某个create方法可以返回一个所需要的对象的实例. 最明显的就是容器中的使用It

2015.7.4 过程抽象

过程抽象就是简称为过程.过程组合了参数抽象和规格抽象的方法. 3.1   抽象的好处 抽象具有本地性以及可修改性,本地性就是不需要知道其他任何抽象的实现而只关注一个抽象的实现,可修改行就是指能够实现一个抽象,不需要更改任何使用该抽象的其他抽象. 3.2   规格 我们可以通过证实或者非正式的规格语言来描述抽象. 规格与抽象的任何实现都不相同,这些实现基本上类似,因为都是相同的抽象,不同的就是实现方法的不同,规格是提取了其共性,可以说规格是具体实现的共性的提取,是抽象的语言描述. 3.3   过程

对抽象的理解

CPP高级编程学习(2) 抽象与重用 CPP设计有两个基本的设计原则:抽象以及重用.这两个原则贯穿与高效CPP程序设计的所有领域. 抽象: 抽象是一个在计算机领域中运用很广的概念,无数的书籍中已经列举了很多的例子.我真正对抽象这个概念开始有感觉是从我当时阅读<现代操作系统>关于文件系统的论述.众所周知,计算机的数据是长期储存在外存(硬盘)上的,所有计算机但是这样的.但是对于硬盘这种十分精密的器件来说,如果人工管理,会面临很多问题:(这里以机械硬盘为例子) 1.硬盘是柱面旋转,磁头寻找相关扇区这

有赞分层自动化测试实践

1. 背景 先理一下自动化测试的概念,从广义上来说,一切通过工具(程序)的方式来代替或者辅助手工测试的行为都可以成为自动化.从狭义上来说,通过编写脚本的方式,模拟手工测试的过程,从而替代人工对系统的功能进行验证. 有赞是一家互联网行业的创业公司,测试起步较晚,发布非常频繁,就算每次只回归核心功能,对人数极少的几个测试人员来说工作量巨大,且基本是重复劳动,极其枯燥,持续时间长了也容易出错. 所以初期我们测试自动化切入的思路非常简单:从实际用户的角度出发,模拟真实的操作,替代现有的手工测试用例的执行

设计模式——(一)工厂模式2

2.2 工厂方法模式 2.2.1 定义 定义一个用于创建对象的接口,让子类决定实例化哪一个类.  遵循了开放-封闭原则.具体而言,核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂的角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品. 2.2.2 四个角色: 1. 抽象工厂:核心,与应用程序无关,任何在模式中创建的对象的工厂类都必须要实现这个接口 2. 具体工厂:这是实现抽象工厂接口的具体工厂类,包含与应用程序密

码农小手册1

把系统中复杂和经常变化的模块单独封装. 抽象的好处在于 你设计的时候 能忽略无关的细节. 封装帮助你管理 系统的复杂度的方法在于不让你看到那些复杂度. 在设计类的时候,要养成一个习惯. 问自己 “我该隐藏些什么字段和函数” 你会惊奇的发现,有很多棘手的设计难题都会在你面前化解. 好的程序设计所面临的最重要挑战之一就是适应变化.目标应该是把不稳定的区域隔离出来.从而把所带来的影响限制在一个子程序.类或者包的内部. 方法是: 1.找出看起来容易变化的模块. 2.把容易变化的模块分离出来.把容易变化的

深入理解HDFS:Hadoop分布式文件系统

文本详细介绍了HDFS中的许多概念,对于理解Hadoop分布式文件系统很有帮助. 1. 介绍 在现代的企业环境中,单机容量往往无法存储大量数据,需要跨机器存储.统一管理分布在集群上的文件系统称为分布式文件系统.而一旦在系统中,引入网络,就不可避免地引入了所有网络编程的复杂性,例如挑战之一是如果保证在节点不可用的时候数据不丢失. 传统的网络文件系统(NFS)虽然也称为分布式文件系统,但是其存在一些限制.由于NFS中,文件是存储在单机上,因此无法提供可靠性保证,当很多客户端同时访问NFS Serve

为什么计算机能读懂 1 和 0 ?

问题:为什么计算机能读懂 1 和 0 ? 从小到大,我们被告知的都是,计算机只能读懂1和0,但我好奇的是为什么计算机它就能够读懂1和0呢,它是怎么读懂的?读懂后,又是怎样进行工作的呢?嗯...我想问的就是,最最基本原始的那个工作原理 回答: 萧井陌,私信问题不回,请提问邀请 玉来了 既然是问最最原始的那个工作原理... 从小到大,我们被告知的都是,计算机只能读懂1和0,但我好奇的是为什么计算机它就能够读懂1和0呢,它是怎么读懂的?读懂后,又是怎样进行工作的呢?嗯...我想问的就是,最最基本原始的

什么是架构

什么是软件架构 前言:软体设计师中有一些技术水平较高.经验较为丰富的人,他们需要承担软件系统的架构设计,也就是需要设计系统的元件如何划分.元件之间如何发生相互作用,以及系统中逻辑的.物理的.系统的重要决定的作出.在很多公司中,架构师不是一个专门的和正式的职务.通常在一个开发小组中,最有经验的程序员会负责一些架构方面的工作.在一个部门中,最有经验的项目经理会负责一些架构方面的工作.但是,越来越多的公司体认到架构工作的重要性. 什么是软件系统的架构(Architecture)?一般而言,架构有两个要