Chinaunix首页 | 论坛 | 博客
  • 博客访问: 835809
  • 博文数量: 90
  • 博客积分: 766
  • 博客等级: 军士长
  • 技术积分: 1867
  • 用 户 组: 普通用户
  • 注册时间: 2011-12-18 08:42
个人简介

linux

文章分类

全部博文(90)

文章存档

2021年(2)

2020年(2)

2017年(1)

2015年(11)

2014年(1)

2013年(53)

2012年(16)

2011年(4)

分类: C/C++

2013-10-12 14:58:40

        在编写程序的过程中经常会遇到代码重复的情况,也许在重复时选择复制粘贴,或者并因此构建一个函数来完成这一个过程来实现复用,但是这样并不是好的解决办法,
因为出现这种情况是我们一开始就不完全清楚这个过程是怎么样的,对功能没有进行深入分析。在开发之前,只是了解个大概,然后我们就开始编程,在开发过程当中东拼西凑,虽然仍然能够把功能完成,但是我们对整个软件并不能了然于胸,结果就是出现了问题就一句一句的去查找问题,显然这是很耗时间的。

        如何来解决这个问题,答案就是类化,在编写代码之前,先将整个系统的功能有个做个大概的认识,然后对过程功能进行抽象,在抽象的过程当中就需要对这个功能的各个细节进行考虑,将这个功能相关的函数最简化,由于在编写代码之前就已经对细节进行了考察,所以在编写过程中就不会出现重复代码的过程,除非你考察的不够,当然也有一个粒度问题(比如在某个参数有两个输入,在两个输入将产生4种可能,而每一种可能当中有些细节是相同的,那么到底应不应该将这些细节提取出来进行复用,这就是粒度问题,粒度问题应该考虑到实际的情况和自身的情况来做决定)。接着就将这个功能类化,功能类化都优点不仅仅可以实现类的复用(因为在设计之前每个细节都已经考虑到),更关键的地方在于使用这个类的开发人员不需要知道内部具体的实现是怎么样的,这就是我认为要既然要实现类就应该达到的目标,那么究竟应该如何来完成一个具有这种功能的类的设计,下面对一个具体的实例进行分析。

        比如某一个不懂linux系统编程的开发人员来操作一个文件,为此他不得不去学习linux系统编程或者标准库操作文件的知识,但是如果有以下一个类库:

头文件:

点击(此处)折叠或打开

  1. // file_name: file_operation.h
  2. typedef struct file_operation {
  3. char file_name;
  4. int off;
  5. int len;

  6.  int fd;

  7. int (*write)(struct file_operation *,int off, int len);
  8. int (*read)(struct file_operation *,int off, int len);
  9. } file_operation_t;

  10. int file_operation_init(file_operation_t *);

具体使用:

点击(此处)折叠或打开

  1. int main(void)
  2. {
  3.  char file_name="test_file_peration";
  4.  int off,len;
  1. file_operation_t file_operation;
  2. file_operation_init (&file_operation,"test_file_operation");

  3.  off = 0;
  4.  len = 5;
  5. file_operation.write(&file_operation,off,len);
  6. file_operation.read(&file_operation,off,len);

  7. file_operation.exit(&file_operation);   //初始化结构体的成员
  8. }
       
        那么,他还需要去了解linux系统编程吗?想提高学linux是必须的,但要完成这个功能,很明显它只需要熟练掌握C语言编程即可,因为他只需要定义一个结构体,知道文件名是什么,需要从文件的哪个位置开始操作,操作多少个字节即可,这就是类库的魔力,真正的屏蔽了底层实现的细节,他完全不需要了解什么是文件描述符。

        在结构体当中可以看出有4个变量:

点击(此处)折叠或打开

  1. char file_name;
  2. int off;
  3. int len;

  4. int fd;
        在面向对象的语言当中他们称为成员变量,使用者只使用了前面3个,它们就是成员变量当中的public数据,而fd就是private数据,而文中使用类库的方式是:

点击(此处)折叠或打开

  1. file_operation.xxxx(file_operation_t *,.....)
        在面向对象编程当中,这个第一个参数是必须要传递的,如下:

点击(此处)折叠或打开

  1. file_operation.xxxx(......)
        在这个函数的实现当中用的就是this指针锕!这他妈就是this指针的作用,当初老师讲我仲莫就不知道啦,但是在C语言当中是莫有this指针的,所以第一个参数还是要传递。

        通过上面的举例,可以看出如何来构建一个类库,首先需要提取功能,抽象功能,然后设计私有数据,公共数据以及方法,完成了这些工作之后,一个类库就完成了,把头文件拿出来,实现拿出来,放在哪里都可以用,这才是复用,当然底层系统不同具体的函数是需要重新实现的,但上层代码完全不需要更改。

        如果系统当中了每个功能模块都进行这样的抽象,你会发现错误处理更为清晰简洁了,你可以为每个模块添加日志功能,指需要提炼一个日志库即可,在主流程编程当中,你会发现逻辑更为清晰,冗余代码少之又少!(感谢在之前上班的师傅,党哥,没有你的严格要求我是不可能这么快掌握这种编程思想)

       



       
阅读(1935) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~