Sep 20

     前段时间花了三天时间把买了好久《大话设计模式》看了一遍。

     我是先看的附录,也就是面向对象基础。
     这是一本通俗易通的好书,毋庸置疑。看完之后至少有三个收获:
1.对面向对象语言编程(书中用的是C#)有更深的理解。
       面向对象三大特性:封装,继承,多态。
       抽象类与接口是什么?
       泛型,事件,委托与代理。
    真如书中所说,看完比上一个月课,读几本砖头书印象深,理解透。
不是说看完了就学到很多东西,而是看完之后你会有“原来如此”感觉,理解了基础,再深入就不是问题。
2.UML类图
  UML包含的东西当然很多,但书中用一例子就把类图继承,依赖,接口等等基本要素都讲到了,
至少让你我这个从没用过UML的人,看到类图能明白是什么意思。
3.设计模式及面向对象原则
  全书围绕大鸟和小菜,讲解了GOF的23个设计模式+简单工厂模式,及面向对象的四大原则+其它几个原则。

  单一职责,开放-封装,依赖倒转,里氏代换是面向对象编程之所以有效的原则,它们让软件系统是可复用,可维护,可扩展,灵活性好的。也是这些设计模式所遵守的原则。

     看完了,想想应该练习下。可书中都是用面向对象语言实现的(C#,Java等)。可我不怎么用面向对象语言,我就想用C语言来
实现它们。可C语言如何面向对象呢?之前看过有用结构来模拟实现类的,但继承,多态这些怎么弄呢?想起了很久以前瞄过的一本书《OOC》,讲的是用标准c实现面向对象。把c和对象放在一起,大家就会想起C++,是啊!有C++不就行了,为什么要折腾c呢?可就是有很多人对c++不满意,Linux之父Linus就是力挺C而批判C++的。讨厌C++的人似乎认为C++过于复杂,内部机制陷阱过多等等。OOC作者也是由于对c++不满足而转向c。

OOC这本书中主要讲了以下两点:一个发现,一个实现。
1.发现c是完全面向对象的
2.利用c实现面向对象(这里不是用c实现一个面向对象的语言,而是就是用c实现面向对象)
从抽象数据类型说起,到面向对象的要素讨论,最后提出自己的对象模型,推导出了一个类树。包括对象,类,继承,多态,最后还实现了类型检查,异常处理。为了方便编程,作者实现了一个预处理器。这本书对理解面向对象原理,很有帮助。
这里有本书的原文和部分译文下载:http://wiki.chinaunix.net/OOC
我开始看前几章觉得很晦涩难懂,硬着头皮,中文加英文看下去,搞清楚了大概思路,作了一些变化,
自己也写了一个预处理器玩了下,现在也可以很容易定义类,实现继承、多态等。

     后来搜索“面向对象理论”,发现一篇自称是扯淡的文章:http://www.iteye.com/topic/89241
我觉得这文章还是很有启发意义的,至少知道了面向对象的历史,发展,知道了有类,无类语言,3P和4P的概念。

     看了评论发现《程序设计--实践之路》这本书,这是本讲如何设计语言的书,从编译原理,语言发展,到语言的各种要素。
大概看了下里面“10.数据抽象和面向对象”一章,才知道从基本类型(整数,浮点),函数类型,结构类型,后来发展出
模块类型,按理论,类是从模块类型发展而来,面向对象也应该按此发展。可事实上面向对象的基本要素都是从20世纪60年代
开发的simula语言中来的。

     关于c语言实现面向对象,最经典的应该是gtk+了,一个基于C语言的面向对象的图形编程环境。
其中GOjbect就是基于C语言的面向对象的实现,它和glib是gtk+的两大基石。
这里面有很多关于GObject的文章:http://ekd123.is-programmer.com/posts/28754.html
什么时间好好学习下GObject了。

Oct 19

typeof关键字是C语言中的一个新扩展。

typeof的参数可以是两种形式:表达式类型
下面是使用表达式的的例子:
    typeof(x[0](1)
这里假设x是一个函数指针数组,这样就可以得到这个函数返回值的类型了。
如果将typeof用于表达式,则该表达式不会执行。只会得到该表达式的类型。
以下示例声明了int类型的var变量,因为表达式foo()是int类型的。由于表达式不会被执行,所以不会调用foo函数。
   extern int foo();
   typeof(foo()) var;

下面是用类型作参数的例子:
   typeof(int *) a,b;
等价于:
   int *a,*b;

下面是两个等效声明,用于声明int类型的变量a。
   typeof(int) a; /*int类型*/
   typeof('b') a; /* GCC中这个表达式的类型是int(自动提升为int),
                  注意typeof(char)和typeof('b')得到的不是一样的,这个用sizeof可以看出来*/

Apr 27

其实这里讲的不是用C语言来实现面向对象,只是用了一点点面向对象的思想,来进行分层的模块化设计与简单的封装。

这里把一个软件分成了三层,用户层,接口层与实现层。上面是我自己根据理解自己起的名字。

还可以进行一下类比,就是用户,品牌P collapsedC厂商和硬件生产商。下面详细讲解:

首先是用户层:

#include "stdio.h"
#include "stdlib.h"

int main(void)
{
    printf("system start...\n");
	if (mod_init("mod_finished")<0) {
		exit(0);
	}
	mod_operation_1(0,1,2);
	mod_operation_2(0,1,2);
	mod_operation_3(0,1,2);
    return 0;
} 

Apr 27

注:这个程序是在软件设计师教程上看到,并做了一点点修改得到。。

在一个简化的绘图程序中,支持点(point)和圆(circle)两种图形,在设计过程中采用面向对象思想,认为所有的点和圆都是一种图形(shape),

并定义类型shape_t、point_t、circle_t分别表示基本图形、点和圆,点和圆自然具有基本图形的所有特征。

下面是利用C语言,通过函数指针和可变参数机制实现上面的类层次关系:

#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>

// 程序中的两个图形:点和圆
typedef enum {point,circle}shape_type;
// 基本图形类型
typedef struct {
	shape_type type;
	void (*destroy)();
	void (*draw)();
}shape_t;
// 点类
typedef struct {
	shape_t common;
	int x,y;
}point_t;
// 圆类
typedef struct {
	shape_t common;
	point_t *center;
	int radius;
}circle_t;
/*

Mar 28

来源:www.matrix67.com

代码分析在这里