面向对象软件设计知识点整理

  • 更新时间:
  • 3101人关注
  • 点击下载

这是一个不错的面向对象类学习资源,由何英哲提供,主要知识点是关于面向对象、软件设计、面向对象的内容,已被543人关注,同类资源中评分为7.5分。

精选笔记:C语言中函数指针与软件设计经验总结

11小时44分钟前回答

函数指针与软件设计

记得刚开始工作时,一位高手告诉我,说,longjmp和setjmp玩得不熟,就不要自称为C语言高手。当时我半信半疑,为了让自己向高手方向迈进,还是花了一点时间去学习longjmp和setjmp的用法。后来明白那不单是跳来跳去那样简单,而是一种高级的异常处理机制,在某些情况下确实很有用。

为了显示自己的技巧,也在自己的程序中用过几次。渐渐发现这样的技巧带来的好处是有代价的,破坏了程序的结构化设计,程序变得很难读,尤其对新手来说。终于明白这种技巧不过是一种调味料,在少数情况使用几次,可以简化对问题的处理。如果把调味拿来当饭吃,一定会本末倒置,写出的程序会呈现营养不良之状。

事实上,longjmp和setjmp玩得熟不熟与是不是C语言高手,不是因果关系。但是,如果可以套用那位高手的话,我倒想说如果函数指针玩得不熟,就不要自称为C语言高手。为什么这么说呢,函数指针有那么复杂吗?当然不是,任何一个稍有编程常识的人,不管他懂不懂C语言,在10分钟内,我想他一定可以明白C语言中的函数指针是怎么回事。

原因在于,难的不是函数指针的概念和语法本身,而是在什么时候,什么地方该使用它。函数指针不仅是语法上的问题,更重要的是它是一个设计范畴。真正的高手当然不单应该懂得语法层面上的技巧,更应该懂得设计上的方法。不懂设计,能算高手吗?怀疑我在夸大其辞吗?那我们先看看函数指针与哪些设计方法有关:

与分层设计有关。分层设计早就不是什么新的概念,分层的好处是众所周知的,比较明显好处就是简化复杂度、隔离变化。采用分层设计,每层都只需关心自己的东西,这减小了系统的复杂度,层与层之间的交互仅限于一个很窄的接口,只要接口不变,某一层的变化不会影响其它层,这隔离了变化。

分层的一般原则是,上层可以直接调用下层的函数,下层则不能直接调用上层的函数。这句话说来简单,在现实中,下层常常要反过来调用上层的函数。比如你在拷贝文件时,在界面层调用一个拷贝文件函数。界面层是上层,拷贝文件函数是下层,上层调用下层,理所当然。但是如果你想在拷贝文件时还要更新进度条,问题就来了。一方面,只有拷贝文件函数才知道拷贝的进度,但它不能去更新界面的进度条。另外一方面,界面知道如何去更新进度条,但它又不知道拷贝的进度。怎么办?常见的做法,就是界面设置一个回调函数给拷贝文件函数,拷贝文件函数在适当的时候调用这个回调函数来通知界面更新状态。

与抽象有关。抽象是面向对象中最重要的概念之一,也是面向对象威力强大之处。面向对象只是一种思想,大家都知道,用C语言一样可以实现面向对象的编程。这可不是为了赶时髦,而是一种实用的方法。如果你对此表示怀疑,可以去看看GTK+、linux kernel等开源代码。

接口是最高级的抽象。在linux kernel里面,接口的概念无处不在,像虚拟文件系统(VFS),它定义一个文件系统的接口,只要按照这种接口的规范,你可以自己开发一个文件系统挂上去。设备驱动程序更是如此,不同的设备驱动程序有自己一套不同的接口规范。在自己开发设备开发驱动程序时,只要遵循相应的接口规范就行了。接口在C语言中如何表示?很简单,就是一组函数指针。

与接口与实现分开有关。针对接口编程,而不是针对实现编程,此为《设计模式》的第一条设计准则。分开接口与实现的目标是要隔离变化。软件是变化的,如果不能把变化的东西隔离开来,导致牵一发而动全身,代价是巨大的。这是大家所不愿看到的。

C语言既然可以实现面向对象的编程,自然可以利用设计模式来分离接口与实现。像桥接模式、策略模式、状态模式、代理模式等等,在C语言中,无一不需要利用函数指针来实现。

与松耦合原则有关。面向过程与面向对象相比,之所以显得苍白无力,原因之一就是它不像面向对象一样,可以直观的把现实模型映射到计算机中。面向过程讲的是层层控制,而面向对象更强调的对象间的分工合作。现实世界中的对象处于层次关系的较少,处于对等关系的居多。也就是说,对象间的交互往往是双向的。这会加强对象间的耦合性。

耦合本身没有错,实际上耦合是必不可少的,没有耦合就没有协作,对象之间无法形成一个整体,什么事也做不了。关键在于耦合要恰当,在实现预定功能的前提下,耦合要尽可能的松散。这样,系统的一部分变化对其它部分的影响会很少。

函数指针是解耦对象关系的最佳利器。Signal(如boost的signal和glib中的signal)机制是一个典型的例子,一个对象自身的状态可能是在变化的(或者会触发一些事件),而其它对象关心它的变化。一旦该对象有变化发生,其它对象要执行相应的操作。

如果该对象直接去调用其它对象的函数,功能是完成了,但对象之间的耦合太紧了。如何把这种耦合降到最低呢,signal机制是很好的办法。它的原理大致如下:其它关注该对象变化的对象主动注册一个回调函数到该对象中。一旦该对象有变化发生,就调用这些回调函数通知其它对象。功能同样实现了,但它们之间的耦合度降低了。

在C语言中,要解决以上这些问题,不采用函数指针,将是非常困难的。在编程中,如果你从没有想到用函数指针,很难想像你是一个C语言高手。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对码农之家的支持。如果你想了解更多相关内容请查看下面相关链接

展开阅读

相关资源

  • 【Python面向对象(封装、继承、多态)】知识结构图(超大图)

    大小:239 KBPython知识结构图

    立即下载
  • 《面向对象程序设计(Java版)》电子资源

    《面向对象程序设计(Java版)》电子资源

    编辑推荐 1.满足学生需求:结合学生学习模式,本书采用项目引导与驱动模式,让学生快速掌握Java 相关知识。 2.满足老师需求:老师可根据学生现状和人才培养方案,参考本书设计教学计划,高效准备Java相关课程。 3.满足行业需求:针对开发行业对Java 的技能需求,本书通过理论与实践相结合的方式,帮助读者更好地胜任Java相关岗位。 内容简介 针对目前开发行业对Java开发工具应用的技能需求以及计算机类专业对Java编程的基本要求,《面向对象程序设

    大小:133.82 KB程序设计

    立即下载
  • c++面向对象程序设计(第二版)

    c++面向对象程序设计(第二版)

    《普通高等教育十一五国家级规划教材中国高等院校计算机基础教育课程体系规划教材:C++面向对象程序设计》作者谭浩强深入调查了我国大学的程序设计课程的现状和发展趋势,参阅了国内外数十种C++的教材,认真分析了学习者在学习过程中遇到的困难,研究了初学者的认识规律,做到准确定位,合理取舍内容,设计了读者易于学习的教材体系,并且以通俗易懂的语言化解了许多复杂的概念,大大减少了初学者学习C++的困难 本书是为具有C语言基础的

    大小:41.3 KBc++

    立即下载
  • 面向对象的思考过程

    面向对象的思考过程

    面向对象的思考过程(原书第4版) 是一部独具特色的面向对象技术著作。书中结合代码示例生动透彻地讲述了面向对象思想的精髓,让读者真正学会以对象方式进行思考。本书共15章,在结构上

    大小:72.9 MB面向对象

    立即下载
  • 面向对象程序设计与C++语言

    面向对象程序设计与C++语言

    《面向对象程序设计与C++语言》是西安电子科技大学出版社出版的图书。 目前面向对象程序设计方法是软件开发的主流方法。本书讨论面向对象程序设计的基本概念,以及使用c++语言进行面向对象程序设计的基本方法。本书的内容主要包括面向对象技术的基本概念和思想、类和对象、友元和运算符重载、继承、运行时的多态性和抽象类、模板、异常处理、I/0流类库、C++对C常规性能的扩充等。另外,为方便学生上机实践,附录中还讨论了Visual C++集成开发

    大小:49.7 KB面向对象

    立即下载
  • 面向对象葵花宝典:思想、技巧与实践

    面向对象葵花宝典:思想、技巧与实践

    《面向对象葵花宝典:思想、技巧与实践》 系统地讲述了面向对象技术的相关内容,包括面向对象的基本概念、面向对象开发的流程、面向对象的各种技巧,以及如何应用面向对象思想进行架

    大小:53.7 MB编程思想

    立即下载
  • 面向对象分析与设计

    面向对象分析与设计

    《面向对象分析与设计》是机械工业出版社于2008年出版的一本图书,作者是麻志毅。 本书是一本关于面向对象分析和设计的教材,讲述了面向对象的基本思想、主要概念以及相应的表示法,并给出了建模过程指导。本书注重理论与实践相结合,给出大量的例题和一个内容较为详尽的案例分析,详述了建模概念的运用以及进行面向对象建模的方法与技术。 本书适合作为高等院校的软件学院和信息学院(或计算机学院等)软件工程专业以及相关专业的工程

    大小:280 KB面向对象

    立即下载

学习笔记

1小时56分钟前回答

PHP面向对象中new self()与 new static()的区别浅析

前言 本文主要跟大家介绍了关于PHP面向对象中new self()与 new static()的区别,这两个方法new出来的对象有什么区别呢,说白了就是new出来的到底是同一个类实例还是不同的类实例呢?下面话不多说了,来一起看看详细的介绍吧。 区别如下: 首先阐明结论,在PHP中 self指向定义了当前被调用方法的类, static指向调用当前静态方法的类。 接下来通过一个例子来证明上面的结果 class A { public static $_a = 'Class A'; public static function echoProperty() { echo self::$_a . PHP_EOL; }}class B extends A { public static $_a = 'Class B';}$obj = new B();B::echoProperty();//输出 Class A 之所以会这样是因为使用self:: 或者__CLASS__对当前类的静态引用,取决……

9小时11分钟前回答

PHP面向对象程序设计之对象生成方法详解

本文实例讲述了PHP面向对象程序设计之对象生成方法。分享给大家供大家参考,具体如下: 对象 看个例子 ?phpabstract class Employee { // 雇员 protected $name; function __construct( $name ) { $this-name = $name; } abstract function fire();}class Minion extends Employee { // 奴隶 继承 雇员 function fire() { print "{$this-name}: I'll clear my desk\n"; }}class NastyBoss { // 坏老板 private $employees = array(); function addEmployee( $employeeName ) { // 添加员工 $this-employees[] = new Minion( $employeeName ); // 代码灵活性受到限制 } function projectFails() { if ( count( $this-employees ) 0 ) { $emp = array_pop( $this-employees ); $emp-fire(); // 炒鱿鱼 } }}$boss = new NastyBoss();$boss-addEmployee( "harry" );$boss-addEmployee( "b……