面对对象的C语言:面对对象简述

in 小得 with 0 comment

书本上的面对对象

一说到面对对象语言程序设计(Object-oriented programming),科班的同学可能立刻就兴趣缺缺:面对对象谁不懂,三大特征:封装(Encapsulation)、继承(Inheritance)、多态(Polymorphism)。

能再深入点?Simula,最早的面对对象语言;Smalltalk,影响最深远的面对对象语言;C++,首个大规模使用的面对对象语言;Java,目前使用最广泛的面对对象语言……

计算机概论学得不错,再深入点?呃,OOP通过类和对象实现对事物的抽象和代码的复用,解决了可维护性,可扩展性,可重用性。

再深入点呢?呃……就这些了啊

什么是面对对象

老师教导我们,认识事物,要从理论到实际再到理论,也就是常说的书从薄读到厚再读到薄。面对对象的概念是现代计算机理论中最基础也是最重要的概念,没有之一。

面对对象,是一种思考问题的方法,它并不局限于哪种具体的编程语言。各种编程语言虽然在语法、特性、专长上各有不同,但思想是相通的。使用面对对象的编程语言,写出着面对过程的代码,在实际生产工作中比比皆是。无他,没有掌握面对对象的编程思想。

面对对象的编程思想,首先是由于人的思维局限性。有理论说,一般人的思维没办法了解与记忆超过5个分支。面对过程的编程,是基于计算机的思想,把客观世界的所有细节全部映射到计算机世界。这样一样,过于大量的信息与细节超过了人脑的能力,使得程序达到一定复杂度后,无法进行维护和扩展。

面对对象的编程思想,就是为了解决人脑的局限性。从分析、设计、编码的全过程适应人脑的特性。从某种意义上来说,就是自上而下,由粗到细的思考问题的方法。这种思考方法符合人们常见的思考问题的方式。每轮的思考所以,可理解、可复用、可维护是面对对象编程思想对面对过程编程思想最大的优势。

具体到面向对象的三大特征:

封装:只暴露明确的、不变的接口,把实现的细节并且把它隐藏起来。这样就可以在不影响其它部分的情况下修改或扩展被封装的变化部分。封装变化是所有设计模式的基础,这解决了程序的可扩展性。

继承:子类继承父类,可以继承父类的方法及属性,实现了多态以及代码的重用,因此也解决了系统的重用性和扩展性。但是,继承破坏了封装,因为他是对子类开放的,修改父类会导致所有子类的改变,因此继承一定程度上又破坏了系统的可扩展性。所以继承需要慎用。优先使用组合,而不是继承,是面向对象开发中一个重要的经验。

多态:接口的多种不同的实现方式即为多态。接口是对行为的抽象,刚才在封装提到,找到变化部分并封装起来,但是封装起来后,怎么适应接下来的变化?这正是接口的作用,接口的主要目的是为不相关的类提供通用的处理服务,我们可以想象一下。比如鸟会飞,但是超人也会飞,通过飞这个接口,我们可以让鸟和超人,都实现这个接口,这就实现了系统的可维护性,可扩展性。

POS业务里的对象

既然是从粗到细,那么,首先就要从业务上识别出来要满足当前的业务逻辑,需要哪些对象。对象和对象间的关系是什么。如果一个对象过于复杂,就要将一个对象拆成几个对象进行维护。如果几个对象有着共同的特性,就要考虑是否将共同点提练、抽象出来进行维护。从业务着手,不停将对象细化、抽象、合并、拆分,这就是面对对象的编程思想。

如何拆分对象,如何理解业务,没有对错之分,只有好坏之别。所以,同样一个业务,由于架构师的思考方法、工作经验、理解深度的不同,会有各种各样的拆分方法,这时候就显示出架构师的功力。为什么说架构师是程序员的巅峰,也就在于此。

对于POS业务而言,核心的功能可以用一句话来描述:客户操作设备获取凭证并发送到服务端进行验证的过程。那么,从核心的POS业务模型就可拆分为:输入、输出、存储、识读、组解包、通讯这六个对象。

输入输出对象,在某些语言是把键盘、外设、存储、网络、屏幕等都直接抽象出共同父类:IO。这个虚类只定义了接口,不提供功能。但对于POS而言,这种高度的抽象显然是没有必要的,而且会对C语言引入没有必要且过于复杂技术实现。本文后面论述C语言的面对对象时改造时,将详细阐述。

输入

在这里,我将输入对象定义为“广义键盘”,无论是矩阵键盘、串口键盘、通过串口实现的虚拟键盘、通过网络实现的虚拟键盘,我都将它们归到输入类的子类。

输出

输出对象特指“屏幕”,即人机交互的部分(UI)。响应键盘输入,控制业务流程,展示提示信息。是本文的核心论述部分。

存储

该对象类比“硬盘”,对于嵌入式系统而言,一般细分为FLASH、内部NV RAM、外部NV RAM三大类。FLASH是独立的芯片,用于存储程序运行中的日志、配置、证书等,和主控芯片通过总线连接,目前一般使用SPI总线。内部NV RAM直接由主控芯片提供,可以认为是第二硬盘,应用可以访问,但外部程序无法访问。外部NV RAM也由主控芯片提供,外部程序和内部程序都能访问,一般起机具和外部程序的桥梁作用。

识读

主要就是扫描头和刷卡器。

组解包

组解包类是纯软件的部分,提供各种通讯报文所需操作,如json、xml、8583

通讯

通讯类同样是POS的重要部分。由于一台POS的通讯设备一般都有GPRS、WIFI两大类通讯模块,有的还有网口、串口等。通讯类是POS和服务端通讯的桥梁。是所有报文的载体。如何有效的组织、封装、抽象通讯类,关系到POS程序二次开发的工作量。

述上所述,本文将着重从UI、通讯两大块来论述C语言的面对对象改造。

Responses