什么是类(class)
我们中文叫做类(其实是种类这个词),英文叫做class。但是英文中的type与种类这个词的意义更接近。为什么要用class呢?
class的有道词典释义:
n. 阶级;班级;种类;班;等级
vt. 分类;把…分等级;把…归入某等级,把…看作(或分类、归类);把…编入某一班级
adj. 极好的;很好的,优秀的,出色的
vi. 属于…类(或等级),被列为某类(或某级)
n. (英、德)克拉斯(人名)
通过释义我们似乎可以在中文中找到另一个词 分类。
类 隐含的意义是分类(一个行为),表象的意义是种类。
分类与类
关于分类:
第一步:找出不同点(特征)。
我们家中一般都有桌子和床,我们有极大的把握能知道哪个是桌子哪个是床。为什么呢?
- 因为大的是床,小的是桌。
- 因为矮的是床,高的是桌。
- 因为软的是床,硬的是桌。
第二步:找出相同点(特征)
凭借着第一步找出的特征,现在给你大小、高矮、样式都不太一样同的10个桌子和10个床,你大概率能够将它们区分开来。
这个过程叫做分类。
总结一下:
我们区分不同事物时使用不同点(特征)。
我们区分相同事物时使用相同点(属性)。
关于类:
在一个寝室中大家的桌子都一样,该怎么区别哪个是我的桌子呢?
写上名字?好主意!大家都给自己的桌子写上名字,就能够防止在不知情的情况下自己的桌子被换成别人的床啦。
涂上不同颜色?也是好主意。
偷偷刻上记号!这样我就知道哪个是我的桌子了。很好,这样也可以。
写名字、涂颜色、刻上记号都不会把桌子变得不是桌子,而是区别开这张桌子和那张桌子。
像这种改变了也不会影响分类但是可以区分具体事物的在程序设计上叫做属性。
分好类的事物也会具有相同的行为,在程序设计上叫做方法。
面向对象设计中的类在创建时类名不可重复,就已经标识了这个类与其它类的不同。所以我们只需要关注相同点。
所以我们在面向对象程序设计中会在设计阶段去分类,而在编码阶段根据分类去创造类,类的内容是属性和方法。
如何分类
通常情况下我们对事物的分类是源自于常识或者叫做通识,也就是大家约定好的分类方式。
但程序设计是非常复杂的工作,程序设计人员大多数缺乏需求方领域的知识。例如:财务知识、库存管理知识、企业管理知识、制造相关的知识等。需求方的人员大多数也只了解自己领域内的知识,并不了解程序设计。
那么,面对未知我们如何去分类呢?面对已知我们如何取舍呢?
关注点分离(Separation of concerns,SOC)
分类的方式常常取决于观察者的关注点。
关注点分离的标准概念,各种百科都有,太晦涩,这里就不放了。
关注点与结构化
庄子: 吾生也有涯,而知也无涯。以有涯随无涯,殆已!
世间万物太过繁杂,不可能全觉全知。生命有限,知识无限。以有限的生命去追求无限的知识,这不是给自己找不痛快嘛。
是的,我们不能给自己找不痛快。人类通常使用结构化的方式来处理复杂的事物,方便思考。结构化就是以一个顶点向下不断分类形成类似金字塔一样的结构。
例如:
- 宇宙-银河系-太阳系-地月系-地球
- 人类-亚洲人-中国人-辽宁人-大连人
- 公司-销售部-销售一组
- 电脑-主机-CPU
- 学校-二年级-三班-三组
宇宙这个词虽然包含了万物的感觉,但是在天体物理学家的眼中,星球是关注的最小单位。
人类虽然包含了所有的人,但是在人口统计的专家眼中,城市是关注的最小单位。
公司虽然各行各业都有,但在组织结构中,组是最小单位(举例中)。
电脑虽然拥有一个极度复杂结构,但我们只关心到CPU/主板/内存这个层面。
学校虽然包含了管理相关的组织,但我们只关心学生这个层面的组织。
一个结构化的事物由一个最顶层分类和一个或多个最底层分类组成。结构化的最重要的概念就是分层时需要将上层的事物完全分开。(例如:将地球分为七大洲八大洋,是将陆地和海洋全部分开了没有落下任何地球上的地区)
结构化的每层之间都有非常鲜明的边界。要么是范围上从大到小包含的关系,要么是随着不会倒退的时间线按段区分,要么是按照完全不同的功能区分,要么是按照管理上不同的职责区分。
造成这种鲜明的边界感的就是观察者的关注点。
一个检票员对待将要通过检票的旅客的视角可能是这样的:有票的和没票的。有票的可以分检票车的和别车的。因为我觉得检票员首先关注的是有没有票,和票对不对(关注点)。
关注点分离总结
- 需要有一个关注点,这与需求方的目的、目标有关,我们只关注事物与关注点相关的一面而忽略掉其它方面。
- 需要对关注点相关的事物进行结构化处理。
- 结构约等于我们将要创建的包或者类。
工资系统关注:工资计算/工资报表
工资计算关注:职员信息/工资项/工资期间/工资计算公式
工资报表关注:报表项/报表计算公式/报表打印