C 面向对象简述

文章目录

    • 前言
    • 基础核心思想:抽象对象,以及整理对象所提供的服务。
    • 进阶核心思想:设计更加灵活的对象。
      • 封装 : 对结构体的成员提供便捷getter,setter方法
      • 继承: 引用更加抽象的数据结构
      • 多态: void * 式的参数, 变长参数

前言

面向对象从来都是一种思想,而不是一种语言。C语言虽然没有对面向对象编程有原生支持,但是没有原生支持并不能说明不适合用C语言写面向对象程序。这里我不准备引用教材里面的连篇累牍,仅仅讲讲对linux和zebos的理解和通过自己对模块化项目编码过程中,对面向对象的一些浅陋的理解。
不管是面向对象、面向组件以至于到现在的面向服务,其实做的只有一件事情:通过对事物进行分解,降低系统的复杂度;将复杂度封装在子系统中,子系统间高内聚和低耦合;通过子系统之间的交互到达系统目标。从而将设计者和开发者从系统中纷繁复杂的细节中解放出来。

Linus Torvalds在一次演讲中有一段涉及什么才是优秀程序员的话:

“烂程序员关心的是代码,好程序员关心的是数据结构和他们之间的关系”。

在我理解,这句话道出了C语言面向对象的核心:C语言面向对象中的对象,就是数据结构以及对数据结构的操作。

基础核心思想:抽象对象,以及整理对象所提供的服务。

这里的对象最终将通过数据结构来体现。
这里对象所提供的服务通过外部接口来体现。

Step1:在开发之前,先问自己下面这些问题:
为了实现需要的功能,应该设计什么样的、多少种类型的数据结构?
这些数据结构应该包含什么内容,各个成员变量的含义是什么,是否应该包含一些调试信息,用于窥视数据结构当前的状态?
对数据结构的操作有哪些?
怎样安排操作和数据结构的关系以实现封装:是将他们包含在数据结构中,还是和数据结构放在同一个文件里?
数据结构之间如何交互?

Step2:然后再以数据结构和对他们的操作来组织文件,再以文件来组织程序。在这个过程中需要注意一件事情:数据结构和文件的功能要单一,即一个文件或一个数据结构只完成一件事情,避免出现巨无霸的数据结构或巨无霸的文件,否则封装性和子系统的内聚性就可能不是很好。让这些巨无霸留在麦当劳好了,详细设计和编码的时候不需要这些。

进阶核心思想:设计更加灵活的对象。

Step1:在开发之前,先问自己下面这些问题:
数据结构成员是否真的需要直接提供出来操作?
数据结构是否需要扩展?
数据结构是否需要复用?

Step2:为了解决上面问题,需要通过面向对象的精髓“封装”、“继承”以及 “多态”的思路来设计对象。还可以考虑使用一些设计模式来使结构更加灵活。

封装 : 对结构体的成员提供便捷getter,setter方法

这样,客户程序员无需了解数据结构内部即可使用我们的代码。

继承: 引用更加抽象的数据结构

使用一个指针,指向【父类】结构体

多态: void * 式的参数, 变长参数

对于void * 式的参数,我们在函数体内进行强转,变成我们想要处理的参数。

对于边长参数, 参考: var_start,var_arg,var_end用法

你可能感兴趣的:(c)