-
2017-10-14 23:52:35
看了一篇电影评析,想谈一下”抽象”
马克思指出:抽象与具体的辩证法应是”具体-抽象-具体”的方法,是从具体上升到抽象与从抽象上升到具体的内在统一。
在高中数学课上,我也在数列章节中熟练的运用了假设,验证的方法,在导数中用抽象来求瞬时速度。
然而,当在生活实践中时,抽象却感觉是如此的难。
突然觉得,抽象和具体是一种极高的个人能力,它影响你的幸福感,你的人生高度,工作前景,生活品质等。当我们始终着眼于当前的琐碎事情时,其实已经故步自封,坐井观天了。因为你只是完成了这件琐事,没有去升华它。
- 比如我要开发一个小系统,如果仅仅是为了完成领导布置的所谓功能,其实不是什么难事,难就难在你从领导的角度思考这个系统为什么要有这个功能;用户使用会有什么反馈;与这个系统对接的是哪些系统;对接遇到哪些问题;这个系统在行业内有什么口碑;目前各大公司开发进度如何。
一旦你用这种思想去考虑了,那么才算真正的了解你做的东西。我想这也是为什么好的销售员的待遇那么高的原因吧,因为他们会站在高处去俯视产品,这种俯视,即为抽象。
c++中有一种抽象数据类型(ADT, Abstract data type),它就是通过类来表示更通用的类型。
举个例子:
写一个具体类:typedef unsigned long Item; class Stack { private: enum {MAX=10;}; Item item[MAX]; int top; public: Stack(); bool isEmpty() const; bool isFull() cosnt; bool push(const Item& item); bool pop(Item& item); };
- 这是一个栈的实现,c++用栈管理自动变量的,从业务上讲,栈实现的功能如下:
(1)创建空栈
(2)添加数据到栈,即压入栈
(3)栈顶删除数据,即弹出栈
(4)查看是否填满/为空
分析这种业务需求比单纯的关注技术实现要有意义的多。
当然,实际上栈同时又是一种容器,继续抽象分析上层业务,其实list,vector等都属于一种容器,只是功能稍有差别而已。
所以关系就是:容器->栈/列表/map->各自类实现
这种既有的概念仅仅是举个示例而已。
总结:
- 1.一个人应该抽象出上层业务逻辑,而不应该仅仅抱着技术细节不放,不然会让思维受到禁锢,无法上升一个层面,容易坐井观天。
- 2.其实知识最初是没有边界的,由于社会的具体分工才会有专业出现,如果你不能做到将学到的东西融会贯通,那么就属于片面的,断层的,缺少骨骼的。
- 3.一个人的格局决定了你的抽象能力,科比能带湖人队多次问鼎,退役后在商界当然也能如此。
更多相关内容 - 比如我要开发一个小系统,如果仅仅是为了完成领导布置的所谓功能,其实不是什么难事,难就难在你从领导的角度思考这个系统为什么要有这个功能;用户使用会有什么反馈;与这个系统对接的是哪些系统;对接遇到哪些问题;这个系统在行业内有什么口碑;目前各大公司开发进度如何。
-
抽象思维和形象思维 (1986年)
2021-05-15 02:02:36抽象思维和形象思维,都是通过人脑的分析、综合和抽象、概括过程而实现的:抽象思维的进行,要有形象思维的支持,抽象思维的结果是概念,以概念反映客观现实,形象思维的产生,要受抽象思维的制约,形象思维的结果是形象,以... -
抽象语法树概念认知
2020-07-06 16:46:36抽象语法树 概念: 抽象语法树(abstract syntax code,AST)是源代码抽象语法结构的树状表示,树上的每个节点都表示源代码中的一种结构,之所以说语法是’抽象’的,是因为这里的语法不会表示出真实语法中出现的每...抽象语法树
概念:
抽象语法树(abstract syntax code,AST)是源代码抽象语法结构的树状表示,树上的每个节点都表示源代码中的一种结构,之所以说语法是’抽象’的,是因为这里的语法不会表示出真实语法中出现的每个细节。
在这里先补充一个概念:具象语法树(Concret Syntax Tree, 简称CST)。
什么是具象语法树呢?
我们知道一颗解析树是包含代码所有语法信息的树形结构,它是代码的直接翻译,所以解析树也被称为具象语法树。抽象语法树实际只是解析树的一个精简版。避免混淆,我们来简化一下概念:
解析树 = CST = 具象语法树
抽象语法树 = AST那么抽象语法树到底是什么样的呢?我们可以来看一个简单的例子:
我们来写一段最简单js代码 20 + (15 - 3)*2,没错,这是一个简单的四则运算表达式,那么它的抽象语法树应该表现为什么样呢,在看AST(抽象语法树)之前,我们先来看一下它的解析树:
但是我们看到这样的一颗解析树显然是有些冗余的,那么我们可不可以对这颗解析树去繁取简呢,当然是可以的:这里我们得到了一棵最简洁的树,去除了冗余的描述和符号,很直观的就可以看出树上每一个阶段节点之间的关系,从而也更能容易的推断出原表达式的样子,此时我们所得到的这颗树就是我们最终要得到的 20 + (15 - 3)*2 表达式的抽象语法树。
这里只是简单的对抽象语法树概念的简单理解,当然还有从分析树到抽象语法树的具体的转化过程以及具体的表现形式,如果有需要请自行查阅相关资料。
上述文章或许有理解错误,请不吝赐教! -
设计模式总结四(外观模式、建造者模式、观察者模式和抽象工厂模式)
2022-01-17 15:39:40在今天我刚阅读了《kafka权威指南》的第一章,关于介绍kafka这个消息发布与订阅系统的概念。在之前的一份实习中,我曾经接触到了kafka,但是我一知半解,也没有深入的了解为什么会有kafka的存在。恰巧前几天我在市...序
这么多天里,我已经读完了《大话设计模式》。放寒假了,没有了通过学业考试的重担,阅读技术书籍的时间页多出来了不少。
在今天我刚阅读了《kafka权威指南》的第一章,关于介绍kafka这个消息发布与订阅系统的概念。在之前的一份实习中,我曾经接触到了kafka,但是我一知半解,也没有深入的了解为什么会有kafka的存在。恰巧前几天我在市图书馆看到一本名为《kafka权威指南》的书,于是就看了一小会。回来的时候意犹未竟,但也没有借回来,于是从网上找了本电子书继续学习。
好了,现在切入正题,先总结外观模式。
外观模式
书中在P108页给出的定义是这样的:外观模式为子系统的一组接口提供了一个一致的界面,此模式定义了一个高层接口,这个接口使得这一个子系统更加容易使用。结构图如下:
外观类包含了所有的子系统的方法或者属性,进行组合,方便其他人进行调用。外观模式是之前的迪米特法则和依赖倒转原则的很好体现。
依赖倒转原则是指:高层模块不应该依赖低层模块,高层模块和低层模块都应该依赖于抽象。抽象不应该依赖于细节,而细节应该依赖于抽象。
迪米特法则也叫最少知识原则,迪米特法则(LoD)的和心思想是如果两个类不用通信,那么这两个类就不应当发生直接的相互作用。但如果其中一个类必须要调用另一个类的某个方法的时候,需用第三者转发这个调用,及尽量可能的将成员函数和成员设置成private类型。
外观模式可以用来解耦合,对于一个不是太大的项目,他的代码已经有坏掉的味道时(尤其是我以前写的那些项目,啊哈哈哈,有空我想根据设计模式的思想改一下),可以用外观模型进行重构和解耦合。即使用面向对象的方法,将许多功能函数归到一类里去,尤其是变量都是差不多的那些功能函数,建立起包含了成员和成员函数的类。之后,再考虑用工厂模式等方式进行进一步改进。
或者,遇到一个较复杂的项目,也可以用外观模式进行设计,用来给原来的一楼代码提供比较清晰简单的接口。这样不用改动原来的代码,也能提供新的功能,且能降低耦合度。
建造者模式
建造者模式是在创建复杂对象算法应该独立于该对象的组成部分时,且创建复杂对象的步骤独立于装配该对象时。书中举了装配小人玩具的例子,装配小人玩具的步骤都是装脑袋、身体、胳膊和大腿这些步骤,不同的地方是脑袋、身体、胳膊和大腿是不一样长不一样外观这样,但步骤都是一样的,装配方式也是一样的,于是就可以使用建造者模式。换到代码中,我们实际上只要重写人物建造的抽象类的抽象方法即可。
书中P115页给出的定义如下所示:建造者模式将一个复杂对象的构建与他的表示分离,使得同样的构建过程可以创建不同的表示。
建造者模式的好处在于使得建造小人的代码与表示小人结构的代码分离,由于建造者隐藏了该产品是如何组装的,所以若需要改变一个产品的内部表示,只需要定义一个具体的建造者就可以了。
观察者模式
观察者模式又叫发布-订阅模式,观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使得他们能够自己更新自己。(书P131)
观察者模式结构图如下所示:
为什么GoF会想到观察者模式呢?当许多类组成一个相互协同作用的系统时,程序员必然需要维护各个不同,但相关的类之间的一致性。于是这就形成了一种紧耦合的类间关系,维护这样的代码会很累,这是我们所不期望出现的,于是就有了观察者模式。
通过设定一个抽象观察者类,进而具体化出各种形形色色的观察者类,用于生成一个个不同的观察者。每一个观察者拥有一个update成员函数(方法),用于更新被观察对象的状态。Subject类则是提供了添加观察者的方法Attach和绑定观察者与被观察者的方法Detach,以及一个Notify方法用于通知所有相关的被观察者。所谓”相关的被观察者是用引用的方法将其写入subject的具体类中里来实现的。所以,当情况有变化时,就可以通过Notify方法通知所有相关的“被观察者”。
抽象工厂模式
先给出书上P149页的定义:抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类。抽象工厂结构图如下所示:
抽象工厂模式是对工厂方法模式的进一步改进。当有两种不同的、且类似的子类时使用。就像让一条流水线生产两种或者多种类似的商品一样,如果可以对流水线进行模块化设计,当要生产另一种商品时,能通过切换模块进行迅速转换生产对象。
如果你不理解这句话,你就想想这个具体的例子,当一个Django项目本来用默认的SQLite写的,然后某个不写代码的又能管事的,要求你改用MySQL或者Oracle、SQL server、Access。诸如此类的事情一旦发生,对于一个没有事先使用抽象工厂模式的项目(或者那时候编码者还不知道这个模式的存在),那一定会被气的抓狂。尤其是从MySQL改成SQL server时,这意味着好多不支持的SQL语句都得修改,还得一句句的找,绝对气死人又累死人(哈哈哈好吧不吐槽了,切入正题)。
如果项目一开始摸不准会不会中途换数据库,那就用抽象工厂模式就对了!它的思路与从简单工厂模式到工厂方法模式的想法是类似的!就是进一步细分,如图所示,设置一个工厂抽象类,用于具体化出不同的工厂,对于上一自然段的例子来讲,例如MySQL工厂、SQLserver工厂等等。该工厂类可以进而生成创建MySQL对象的“创建用户方法”。于是使用MySQL就创建MySQL对象,使用SQLserver就创建SQLserver对象。
然后,Client也是抽象类,用于抽象出具体的用户类,例如MySQL用户类。可以用写各个具体的增删改查操作的方法了。由于各个数据库的SQL语句有差异,因此在这里分开来写就可以解决问题了。
以上就是这么多。最近几天一是有点累,但主要的是忙。是教资复习繁忙,主要是背诵很难搞,又要练物理题,实在是累死了,所以没有太多时间继续写博客。好在这篇博客分了好几天,终于是写完了。
END
-
抽象和具体化案例讲解 如无必要,勿增实体,延迟具体化.v
2017-05-10 22:12:17父类和子类, 组合都能实现 抽象,层级. 2.要达到最好的泛化.最好是无参数,无返回值.所有都是变成 field. 如无必要,勿增实体,延迟具体化.卡姆剃刀法则 ftp 下载基本配置: host ,userName ftp 下载器: 1.下载地址...两个例子:
例子1: 一个 ftp 下载器
例子2: 支付参数
总结:
1. 接口和实现. 父类和子类, 组合都能实现 抽象,层级.
2.要达到最好的泛化.最好是无参数,无返回值.所有都是变成 field.
3.组合的赋值是立体的.(一个嵌套一个的赋值,不可能是 abstract class), 继承的new 实例的赋值是拉平的.( 每一层都赋值,不过容易搞不清楚每一层需要赋值哪些参数.)
方法论:
1.思考每个层级需要哪些字段
1.1 这些字段是否可枚举化. (可枚举化的放 field,不可枚举化的放到接口里)
这样的好处是最下层的bean 都可以通过 spring 容器来管理. 父类的 bean 该 autowired 的也可以 autowired.
父类不能autowired
1.2 最终的 spring bean.
如无必要,勿增实体,延迟具体化.卡姆剃刀法则
成功的设计
配合 spring 的动态配置获取. 因为要根据可变参数具体化(实例),所以无法利用 spring 的配置了.
无法固定的东西通过参数传递. 但是一旦有了形参,通用性就降低了.
如果要更好的使用 spring 的容器,那么设计的时候就要明确可固化和不可固化参数.
例如:ftp 下载.前缀可固化. 文件名依赖 Date 可变.
概念线(继承) 实例线(继承概念先,实例线垂直上是依赖) ftp 下载基本配置: host ,userName
ftp 下载器: 1.下载地址,2.本地文件保存地址. 3.ftp 下载基本配置
渠道下载器 1.remotePrePath 2.localPrePath
phoenix 渠道下载器 继承 <渠道下载器>: 无自有属性. 把 userName 和远程remotePrePath初始化. 业务下载器: 1.midPath (远程和本地保持一致) 2. 文件名(远程和本地保持一致)
phoenixPay 渠道下载器 ?
设计的时候可以用字段, 如果该层级的具体化类能赋值的用 field.
如果具体化类不能赋值的最好用abstract getField()方法. 这样能避免继承者忘记掉赋值相关属性.
不过如果想用组合的方式,那么就无法用 abstract 了.
好的犯案. 通过初始化方法来初始化. 通不好的方案,过类来初始化 不算成功的设计1:
ftp 下载基本配置: host ,userName
ftp 下载器: 1.下载地址,2.本地文件保存地址. 3.ftp 下载基本配置
渠道下载器 1.remotePrePath 2.localPrePath
业务下载器: 1.midPath (远程和本地保持一致) 2. 文件名(远程和本地保持一致)
具体化:
phoenix 渠道下载器 继承 <渠道下载器>: 无自有属性. 把 userName 和远程remotePrePath初始化.
phoenixPay 渠道下载器 ?
问题来了:
phoenixPay 渠道下载器 到底是继承 <phoenix 渠道下载器> 还是 <业务下载器>?
答: 如果具体化没有新增的字段,那么暂时先别具体化.把渠道和业务具体化放到一起.少一个类.
解决方案(解决双继承问题):
phoenix 渠道下载器 继承 业务下载器:
phoenixPay 渠道下载器 继承 phoenix 渠道下载器
支付参数的具体化却不同.
支付宝参数和微信参数不同.
都是渠道的具体化,各自支付宝和微信的biz 子类,都要各自演化. 无法有一个通用的 biz子 类.
-
Java中的抽象类和接口
2022-04-08 15:17:42各位铁汁们大家好呀!今天让我们继续学习java,看看java中的抽象类和接口到底是什么? 里面也会讲到多态呀,一起来看看吧 -
Java——抽象类(abstract)(概念理解+应用举例)
2020-06-23 15:44:46抽象类虽然不能实例化对象,但是类的其它功能依然存在,成员变量、成员方法和构造方法的访问方式和普通类一样。 由于抽象类不能实例化对象,所以抽象类必须被继承才能被使用。正是因此,通常在设计阶段决定要不要... -
java中抽象类的作用是什么?抽象类作用的例子
2021-03-01 08:02:24一、java抽象类的作用java抽象类的作用具体的可以分成以下的三点:1、抽象类通常都是用来表征对问题领域进行分析、设计中得出的抽象概念,是对大多数看上去不同,可是本质上却是相同的具体概念的抽象2、在面向对象... -
抽象代数简明教程 [李慧陵,周胜林,刘伟俊 编著] 2014年版
2019-05-15 21:31:16《抽象代数简明教程》第1章在复数域内讨论数域扩张理论,在数域的特殊情况下引出了Galois群的概念。第2、3章建立了群、环、域的概念,介绍了群论和环论的基本理论。第4章讨论一般的域扩张理论,以及Galois理论的... -
Java中抽象类和接口的区别
2019-02-07 14:10:07对于面向对象编程来说,抽象是它的一大特征之一。在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类。...抽象方法是一种特殊的方法:它只有声明,而没有具体的实现。抽象方法的声明格式为... -
抽象类和接口的区别以及抽象类和接口的使用场景
2019-05-30 18:15:44在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就可以称之为抽象类。 1.抽象方法:使用... -
Java抽象类Animal和Cat
2018-11-09 13:58:31在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。 抽象类除了不能实例化对象之外,... -
Java抽象类和抽象方法归纳总结
2020-06-11 12:26:24文中引用的具体例子在这里:抽象类的一个例子 Triangle类是继承自抽象类GeometriObject的具体子类 GeometriObject中包含两个抽象方法:getPerimeter,getArea/ Triangle中实现了这两个方法 好了,进入正题。 目录... -
数据库系统概念总结:第七章 数据库设计和E-R模型
2019-09-14 09:17:07第七章 数据库设计和E-R模型 7.1 设计过程概览 7.1.1 设计阶段 需要完整地刻画未来数据库用户的数据需求 选择数据模型,并采用所选数据模型的概念将这些需求转化为数据库的概念模式 完善的概念模式还指明企业的功能... -
幼儿抽象逻辑思维举例_语言训练幼儿逻辑思维——抽象篇
2020-11-20 16:08:54抽象能力指的是我们从具象生活走向抽象概念的能力。早期启蒙最重要的是让孩子头脑得到足够的锻炼。让他的思维能力真正跟得上人生更长期的挑战。 撰稿/石宋欣 编辑 排版 / 石宋欣 校对/杨静 审定/盘华 钟正 扫码关注... -
概念模型及表示
2021-10-25 12:34:50概念模型及表示 前言 这里是 数据库系统原理 系列文章,主要介绍数据库系统理论以及数据库实用技术。 数据库技术是计算机学科中的一个重要分支,它的应用非常广泛,几乎涉及所有的应用领域。 关于作者: 小白... -
计算机中的数学【抽象代数】群的概念
2018-05-01 02:06:00抽象代数作为数学的一门学科,主要研究对象是代数结构,比如群、环、域、模、向量空间、格与域代数。“抽象代数”一词出现于20世纪初,作为与其他代数领域相区别之学科。 代数结构与其相关之同态,构成数学范畴。... -
抽象类和接口的区别及使用场景
2020-01-02 15:49:00在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就可以称之为抽象类。 1.抽象方法:使用... -
抽象代数——群的基本定义和一些例子
2015-08-28 14:26:33群论的基本概念点较多,且各概念点之间关系纵横交错,学习起来颇有本科时初学线性代数时的感觉,觉得有必要整理一下,先梳理一下群的基本定义和例子。 首先作几点说明: 1、群(group)、环(ring)、域(field)是抽象... -
幼儿抽象逻辑思维举例_孩子这五大表现,证明抽象思维萌发,家长一定要抓住这个关键时机...
2020-11-20 16:08:54人比其它动物高明的地方在于人有抽象思维,对于刚出生的孩子来说,却并具备抽象思维,根据科学实验证明,3-7岁是幼儿具体形象思维迅速发展时期,同时是抽象逻辑思维萌芽的时候,7-15岁的时候,是抽象逻辑思维发展的... -
从童年趣事到一个高等数学概念
2020-01-17 19:56:37从童年趣事到一个高等数学概念,张小向,,本文介绍如何从两则童年趣事出发向学生讲解曲率的概念及其应用。尝试将高等数学中抽象的概念与生动的例子结合起来,运用于课堂教 -
C#相关概念(ArrayList,List,LinkedList,Dictionary、委托和事件、接口和抽象类)
2017-03-28 19:48:55抽象类是一个不完全的类,着重族的概念。 4. 接口可以用于支持回调;抽象类不能实现回调,因为继承不支持。 5. 接口只包含方法、属性、索引器、事件的签名,但不能定义字段和包含实现的方法;抽象类可以定义... -
面试 | 接口和抽象类的区别
2019-03-06 21:00:09虽然面试的时候可能没有那么的时间全部说完,但我觉得概念和设计目的应该要说清楚;因为从这两点就能看出你对两者的理解深度。 1.概念的不同 接口:是对行为的抽象,是抽象方法的集合。实现接口的类必须遵循契约模式... -
程序员必备的思维能力:抽象思维
2021-02-12 18:03:28若想捉大鱼,就得潜入深渊。深渊里的鱼更有力,也更纯净。硕大而抽象,且非常美丽。——大卫·林奇抽象思维是我们工程师最重要的思维能力。因为软件技术 本质上就是一门抽象的艺术。我们的工作是存思维... -
面向对象概念及对象、抽象、类的解释
2017-05-11 09:20:33具有相同或相似性质的一组对象的抽象就是类,类是对一类事物的描述,是抽象的、概念上的意义; 对象是实际存在的该类事物的每个个体,因此也称为实例; 对象的抽象是类,类的具体化就是对象,也可以说类的... -
基本概念和术语
2019-12-17 18:00:02文章目录概要数据(data)数据元素(data element)数据项(data item)数据对象(data object)数据结构(data structure)逻辑结构的种类存储结构的种类数据类型和抽象数据类型抽象数据类型的形式定义抽象数据类型如何实现 ... -
抽象类和接口的详解(实例)
2017-12-20 17:15:17抽象类和接口在我们的代码中,生活中息息相关,与上图所示,操纵复杂,密切相关,那么问题来了,何谓抽象类,何谓接口?带着这层薄纱,慢慢揭开这层薄纱;也许在古代,新婚之夜,透过这层薄纱,你看到的或者是惊喜,... -
说一下Java中抽象类和接口存在的意义与价值
2018-10-15 16:29:41定义是很简单的,我们这里不写官方的语言,我自己看着都烦,我们就用白话介绍,抽象类本质是一个类,没问题,那么类里面一般都是有方法的,方法包括方法名和方法体,这是常识对不对,那么什么是抽象类呢?... -
C++继承详解(三):抽象类和纯虚函数、多重继承与虚基类的底层实现原理详解
2019-04-23 03:27:29纯虚函数 、抽象类 、多重继承 、二义性问题 、菱形继承 、虚基类 、从内存布局看虚继承的底层实现原理 -
Java中接口和抽象类的区别
2019-04-29 19:51:53java中接口和抽象类的区别 ...