什么才是面向对象的思维,我一直搞不清楚。今天下午尝试对一个门禁系统进行设计,这是我的思路:
一、本系统复杂之处在于有很多种不同身份的人要通过,所以自然而然,我就首先对人员进行设计,先设计一个人员的基类,再继承出很多种类的人员。但进一步往下,发现对不同的人员,并不需要太多不同的处理。知道人员种类并不能决定进行什么操作,还要进行很多其他的判断(规则、设备状态),才能进行处理。
于是,想到面向对象并不是简单的复制现实中的对象关系,尽管有些对象非常标准地符合教科书中讲的对象关系,让人忍不住想对它们进行一番抽象。但仔细想,在本系统中,这种抽象意义实在不大,与增加一个属性达到的效果一样。
不能为抽象而抽象,而应该为了适应变化而抽象。
二、所以,进一步思考,本系统的变化在哪里?就目前所知,变化最大的,就是整个进门的流程。比如,刷卡后,有些要输密码,有些要等待下一个卡,有些要开门…
那么,针对这些变化,怎么来设计呢?
没头绪,还是回到比较具体的东西上。每个用户交互硬件设备当然对应到一个对象了,它们公共的地方就是能够向系统提供一条信息。可以抽象出来,但还是意义不大,因为还要和外界的很多信息共同作用才能决定后续处理。
而且,还有个问题,不能单靠这些硬件设备来驱动整个系统。完整的进门过程应该有多次刷卡等操作,但如果仅靠设备的事件来驱动的话,假如因为某种原因只刷了一半,那么系统也无从得知。
三、由此,想到系统必须要掌握整个“进门过程”。不同种类的人员进门流程不同,仅仅是“进门过程”的具体表现不同而已,这个正好可以采用抽象的方式来设计,在继承的类中,提供了具体的不同的流程要求。同时,根据不同的进门流程,和上面的硬件对象进行交互。而进门过程作为一个对象,也可以让系统对其开始、进行、结果有全面的掌握。
而将来流程发生变化,就可以只对流程的定义进行更改。
四、现学现练,自查一下面向对象的几个原则:
单一职责原则。
引起硬件类改变的原因:硬件改变。
引起进门过程类改变的原因:规则变化。
开放、封闭原则
对扩展开放:可以更改流程,可以增加设备。
对修改封闭???
依赖倒置原则
硬件类保留接口,外界只调用接口。