要学习面向对象的编程语言,首先就要理解什么叫做”类“!类的概念和本质,你真的理解了么?
一篇文章引起的讨论
前几天看了一篇讨论Java面向对象的文章,其中举了一个例子:如何将水生动物、陆生动物、食草动物、食肉动物进行分类,如果把他们都做成动物类的继承,你会发现有的食草水生动物不知道往哪儿放。最后决定动物是类,把食草、食肉,水生、陆生都做成接口,然后问题就成功得以解决。
上面的例子有道理么?读完你就恍然大悟了。
除了编程中使用了类的概念,在生活中也有分类的概念。例如,有的超市将商品分区域摆放,就有了商品分类。以蜂蜜为例,超市中的某种蜂蜜产品可能放在调味品区,也可能放在营养品区,但无论放在哪个区,如何分类,这种蜂蜜产品本身是不变的。即使这个商场倒闭了,分类也随之消失,但这种蜂蜜产品本身没有发生变化。
编程中的类和生活中的类是一个意思么?
类和名词是什么关系?
SQL语言中有类别么?
分类是客观的么?
为什么类别体系对人类和编程都如此重要?
…….
软件架构师必读:面向对象编程思想(OOP)的由来与本质
类到底在说什么?
事物的分类、概念、定义、范畴,含义和集合,这些词汇在编程和生活中都是一回事,也被称为本体。
由于本体这个概念涉及到的内涵过于基础,在各个学科中都要用到,在人类的生产生活中也起到了重要的沟通交流作用,所以在各个领域内众说纷纭,我们举一个实际的生活的例子,很容易就能理解。
我要去买一个杯子。这里我们出现了一个概念“杯子”。那你有没有想过什么是杯子?这就是概念的神奇之处,我们都知道他是什么?或者都感觉自己知道它是什么,但是却没有办法给出一个让大家认识都一致的定义。深究下去问题很大!
例如这个杯子,在辞海中给出的定义是“盛饮料或者其他液体的器具,多为圆柱状,下部略细,一般容积不大”。在这个定义中,我们大概知道了辞海中所说的杯子是什么?但是这个定义又引申出很多的容易产生纠纷的细节,反倒使这个概念更加困惑了:上细下粗的不能称作杯子吗?杯子和碗有什么区别?容积大不大?有什么界限?什么叫略细?什么叫器具?
在人类概念的海洋里头,每一个词汇如此深究下去,都显得非常脆弱,非常模糊,想在不同的人群中达成共识非常困难。这就是我们为什么要研究本体的重要原因之一。
我们推广垃圾分类,为什么这么难?什么叫垃圾?你真的能把所有想放进垃圾桶中的实例弄进这四个类中么?
存在则合理性,我想这也是“语言”在人类进化的过程中所形成的最合理的交流方式。在原始部落,表现“危险”可能就是一个简短的声音。我们非要把危险描述得如此清楚,是天灾水火还是猛兽?是多大程度的危险?这么思考的原始人种族估计早就被大自然淘汰掉了,当然也不会有后代留下来。
世界事物的类别体系
分类对人类很重要么?是的,可以说没有分类的概念人类就无法交流。
类别是用于指代事物集合的,我们语言中如果没有指代能力,就会变得异常啰嗦。例如我们公司说六个月以上发票不给 销,一句话就说清楚了。但是引入了一个词叫“发票”,火车票算发票么?住宿票、出租车票、停车发票、饭费发票、旅游发票……你看,要是没有发票的这个指代作用,我们要费好多话。
我们写程序也一样,程序是一种语言,和人类语言一样是为了描述世界。没有类别的世界全是废话,没有对象(继承)的语言写着费劲。
说到这里,你可能想到有一种我们天天用的程序语言没有类别体系。是的,SQL没有类别体系。所以我说统计一下你名下的发票,除非你建宽表,但发票要管理细致的话,打车票必须填写出发地点到达地点,属性又冲突,你就得累个半死。
我们天天用分类:生物需要分类,就是门、纲、目、科、属、种;法律需要分类,轻度伤害、重度伤害量刑不同; 会管理要分类例如不同企业上不同的税;产品需要分类,不同的产品有不同的参数…….我们思想和语言交流的基础就是分类。
如果不用到分类,世界的事物,无法有效地组织起来,我们也不能有效地表达我们的思想。事实上我们说的每一个名词都是一个分类,当加上编 或者定冠词就变成实例了。
但某种具体实物产品在特定企业的编码体系中,其分类的归属应该予以明确,以方便企业的管理和使用。换言之,分类一定要考虑为管理服务。例如,超市的各种物品都会有唯一的条码标识,但是不同超市的物品摆放会有所不同,有的超市按照分类来摆放,有的超市则考虑了消费者的消费需求,打破按传统分类摆放商品的格局,将纸尿裤与啤酒放在一起,以达到提高销量的目的。
在数学中,研究分类理论的范畴学是数学的一个分支,它试图根据类别概括所有数学,而不管它们的对象和箭头代表什么。几乎现代数学的每一个分支都可以用类别来描述,这样做往往揭示了不同的数学领域之间的深刻见解和相似之处。类别论为数学设置理论和其他提出的公理基础提供了另一种基础。
除了形式化数学之外,类别论还用于形式化计算机科学中的许多其他系统,例如编程语言的语义。
分类是客观的么?
分类太重要了,那么分类的客观性如何保证呢?非常不幸,分类并不客观,分类是主观的。
分类是一个从主观的角度看世界的过程,所以各种领域中的分类争论都很大,因为从哪个角度看待分类都有自己的道理。
我们也很高兴地看到,即使分类存在主观性,我们还是建立了大量的分类标准,正因为如此,人类 会才走到了今天,才会共同进步。
再回到最初的例子,如何对水生动物、陆生动物、食草动物、食肉动物进行分类,其实你仔细想一下,我们学过的动物学中有水生动物这个类别么?并没有!有什么动物类别么?你想起来初中生物学中哺乳动物的主要特征么:胎生、哺乳。没有这两个特征就进入不了哺乳的类别。
那我们怎么表示水生动物这个集合啊?别着急,集合是一定要通过类别表示么?类别也可以通过属性表示。设置一个生活环境属性:
水生动物={动物| 生活环境=水}
这么一表示,你就发现了除了水、陆之外有个例啊,有冰么?寄生虫怎么办,真空……
面向对象除了类别以外,还有方法,我们下次有机会再说!
建立类别体系需要具有领域知识!
一个类别体系要有坚挺的界限!
类别体系中不能可此可彼,实例必须归属唯一类别!
……
感兴趣,加关注!
「博士聊IT」一文看懂编程的本质,程序员有前途么?
软件架构师必读:面向对象编程思想(OOP)的由来与本质
中国为什么没有自己的编程语言?哲学、数学和语言学基础是关键
低代码无代码平台的未来在哪里?编程语言的进化史告诉你答案
程序员比 平工资高70%?编程的本质是什么?能力强还是分配不公
钱学森诞辰110周年:重读经典,钱学森《论系统工程》笔记摘要
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!