C语言的模块化设计和面向对象编程
C语言的模块化设计和面向对象编程
分类: C面向对象/C++/Java2011-03-02 21:04 108人阅读 评论(0) 收藏 举报
来自网易杭州研发技术总监“云风”BLOG的几篇面向对象设计的文章
C 语言对模块化支持的欠缺
继续昨天的话题。随便列些以后成书可能会写的东西。既然书的主题是:怎样构建一个(稍具规模的)软件。且我选择用 C 为实现工具来做这件事情。就不得不谈语言还没有提供给我们的东西。
模块化是最高原则之一(在 《Unix 编程艺术》一书中, Unix 哲学第一条即:模块原则),我们就当考虑如何简洁明快的使用 C 语言实现模块化。
除开 C/C++ ,在其它现在流行的开发语言中,缺少标准化的模块管理机制是很难想象的。但这也是 C 语言本身的设计哲学决定的:把尽可能多的可能性留给程序员。根据实际的系统,实际的需要去定制自己需要的东西。
对于巨型的系统(比如 Windows 这样的操作系统),一般会考虑使用一种二进制级的模块化方案。由模块自己提供元信息,或是使用统一的管理方案(比如注册表)。稍小一点的系统(我们通常开发接触到的),则会考虑轻量一些的源码级方案。
首先要考虑的往往是模块的依赖关系和初始化过程。
依赖关系可以放由链接器或加载器来解决。尤其在使用 C 语言时,简单的静态库或动态库,都不太会引起大的麻烦。
C++ 则不然,C++ 的某些特性(比如模板类静态成员的构造)必须对早期只供 C 语言使用的链接器做一些增强。即使是精心编写的 C++ 库,也有可能出现一些意外的 bug 。这些 bug 往往需要对编译,链接,加载过程很深刻的理解,才能查出来。注:我并不想以此来反对使用 C++ 做开发。
我们需要着重管理的,是模块的初始化过程。
对于打包在一起的一个库(例如 glibc ,或是 msvcrt ),会在加载时有初始化入口,以及卸载时有结束代码。我想说的不是这个,而是我们自己内部拆分的更小的模块的相互依赖关系。
谁先初始化,谁后初始化,这是一个问题。
在 C++ 的语言级解决方案中,使用的是单件模块。要么由链接器决定以怎样的次序来生成初始化代码,这,通常会因为依赖关系和实际构造次序不同而导致 bug (注:我在某几本 C++ 书中都见过,待核实。自己好久不写 C++ 也没有实际的错误例子);要么使用惰性初始化方案。这个惰性初始化也不是万能的,并且有些额外的开销。(多线程环境中尤其需要注意)
我使用 C 语言做初期设计的时候,采用的是一种足够简单的方法。就是,以编码规范来规定,每个模块必须存在一个初始化函数,有规范的名字。比如 foo 模块的初始化入口叫 int foo_init()
规定:凡使用特定模块,必须调用模块初始化函数。
为了避免模块重复初始化,初始化函数并不直接调用,而是间接的。类似这样: mod_using(foo_init);
mod_using 负责调用初始化函数,并保证不重复调用,也可以检查循环依赖。
在这里,我们还约定了初始化成功于否的返回值。(在我们的系统中,返回 0 表示正确,1 表示失败)然后定义了一个宏来做这个使用。
#define USING(m) if (mod_using(m##_init,#m)) { return 1; }
C 模拟面向对象思想的目的不在于模拟行为本身,而在于解决某些情况 下使用 C 语言编程时程序整体框架结构分散、数据和函数脱节的问题。我们 在后续章节会看到这样的...
C语言面向对象编程_计算机软件及应用_IT/计算机_专业资料。C 语言面向对象编程经常...C 别无选择,模块化设计,函数,宏...只能通过巧妙的设计才能达到代码可重用的目...
C 语言模块化程序设计模块划分 C 语言模块化程序设计 设计需理解如下概念: 设计...C 模拟面向对象思想的目的不在于模拟行为本身,而在于解决某些情况下使用 C 语言...
? 20世纪80年代中期后出现C++等多种面向对象语言 C语言的主要特点是: 1、C语言是一种结构化的程序设计语言,语言本 身简洁、使用灵活方便。既适用于设计和编写大...
C 语言面向对象编程原创作者: rubynroll 阅读:5643 次 评论:0 条 更新时 间:...C 别无选择,模块化设计,函数,宏...只能通过巧妙的设计才能达到代码可重 用的...
4、加强对模块化程序设计和面向对象程序设计的理解。 5、掌握 C 语言程序设计的基本思想,了解简单的系统分析和 6、了解数据库系统的理论 7、掌握数据库设计的基本...
4、加强对模块化程序设计和面向对象程序设计的理解。 5、掌握 C\C++语言程序设计的基本思想,了解简单的系统分析和 6 了解数据库系统的理论 7 掌握数据库设计的...
面向对象的程序设计介绍 第1章 1.1 1.2 1.3 C语言程序设计的概念程序与...6. 编写程序文档 经过了问题分析、设计、程序编码、测试后, 程序开发的工作基本...
面向过程的程序设计方法一般采用结构化和模块化设计思想 D. 面向对象的程序设计...ch>='A' && ch<='Z' D. ('A'<=ch)AND('Z'>=ch) 5.在 C 语言...
A.机器语言和汇编语言编程通常采用面向计算机的程序设计方式 B.面向过程的程序设计方法通常采用结构化和模块化设计方法 C.面向对象的程序设计方法采用客观世界的描述...
热门文档