2年的感悟,未来的方向

用了VC这么久,C/C++用了也三年了,期间也做过不少所谓的项目,发现自己还是在慢慢地进步的,只是有时候没有时间停下来总结

发现总结真的很有必要,譬如说怎样去设计函数的参数以及怎样去设计类

关于怎样去设计函数

我就提一些我自己的切身体会吧,同时将论坛里面的兄弟们得回答总结了一下

我觉得设计一个函数有一下几点:

1)函数的功能尽量单一

如果你想函数的功能很杂很多的话,就像人一样,一个人同时做很多事情,必然做不好,函数的设计也是如此,功能越单一越好,那样函数之间的耦合才越小

2)函数的参数尽量简洁明了

一般函数的参数在3-4个最容易接受,想一想,如果你的函数参数很多而且乱七八糟,参数有的是输入参数有的是输出参数,那么你该怎么使用它们?

那么长的函数,那么多的参数谁愿意去使用它?当你一开始看到微软那么多参数的API是不是也有同样的感觉呢?是不是觉得参数特多?

那么从一个使用者的角度去考虑,你就会发现,函数的参数尽量少,如果参数很多,你可以用一个结构体作为参数一个参数,是不是简洁明了多了呢。

3)函数的传入的参数问题

根据函数传入的参数可以分为传入型,传出型,以及传入传出型

一般传入的参数有数据(譬如说int 、double、float、等传值参数)、指针(指向数据,从内存中申请的一块区域或者是某个值的地址(比如说int类型的))、资源句柄(比如说HANDLE)

其实之前我一直都不是很在意这些,但是直至做完了这次项目,我才知道我设计上又出现了错误,尽管我把函数设计得够独立,但是其实我还是没有注意到资源类型的参数的问题

以下有一个原则那就是:

如果传入的参数是指针,并且指针指向的是从堆上申请的内存,那么,请谨慎了,在函数内部最好不要释放掉该块内存,而是由调用者去释放这块内存,函数内部千万不要释放。

如果传入的是句柄,同样也要遵循这样的原则,那就是一旦出现什么错误返回了,别再调用的函数内部CloseHandle(),让这个工作给调用的函数去完成吧,你需要做的仅仅是返回出错的代码,供调用的函数去判断出错的原因。

4)函数的传出的参数问题

函数传出参数莫非有两种一种是值类型一种是引用类型(或者指针),这个错误很久以前我犯过现在不会犯了,传值类型还好,一般会将值复制到所调用的函数中去,如果传入的是引用类型或者指针,就得注意了,你所引用的对象还存在吗?指针指向的内存还在吗,是不是在函数执行完毕后就已经释放掉了。特别关注静态数组,动态内存分配的空间等

5)函数的命名

函数的命名,我觉得遵循见名知意原则就可以了,没有多大的学问,可是适当地简化命名,如果很长的话

其实我想肯定还有其他的学问在里面,只是我实在太浅,只能总结这么一点点,日后肯定会有更深的感悟吧。

那么如何设计类呢?

初用过MFC的人都觉得它和类没多大的关系,即使用到了类也是一些比较简单的继承关系没有多么高深的知识在里面。

这大概是一个新人的感受吧,我也用了不少,基于对话框的,SDI,MDI的,可能是我用的不够多,研究的不够透彻,还停留在应用层面

里面用到的莫非是继承某个控件,然后重写控件,重绘什么的,或者从一个窗口去继承,然后处理窗口的事件什么的。

至于更深的理解还有待提高。

虽然说设计模式好,我觉得不需要迷信就好

到目前为止还没有看设计模式,不过也应该去看一看,吸取吸取前人的经验,不要为了用设计模式而去用。

论坛上的兄弟们推荐了一本Design.Patterns.Explaineda即设计模式精解,有机会看一看吧。

其实对于如何设计类,我是最没有发言权的,因为我写的程序都是以面向过程的方式写的,即便用了类,也只是使用了最简单的依赖关系一个类里面封装了几个函数,然后实例化调用函数而已。

类的设计网上有一些比较好的文章关于类之间的关系:

1、单向关联

2、双向关联

3、自身关联

4、多维关联(N-ary Association)

5、泛化(Generalization)

6、依赖(Dependency)

7、聚合(Aggregation)

8、组合(Composite

这里给出一个链接:

http://hi.baidu.com/danghj/blog/item/5a349282f35f2d9cf603a6ea.html

讲的挺实在的。

如何设计类对于现在的我来说其实还是有点勉为其难的,我好像一直难以摆脱C语言的过程式的阴影

到了C#上才能够以面向对象的方式去思考,在C++上一直把C++当做C语言用,这一点需要自我反省啊,不能再把C++当C用了

关于类是如何设计的这个其实没有一个约定俗成的答案,世上的代码不可能完美,只有不断地重构,才能不断地精进。

我这里也推荐一篇文章

http://www.cnblogs.com/admin11/archive/2008/08/08/1263868.html

讲的挺好的,我自己看过之后的理解是:尽量让自己的类依赖减小,能够独立,低扇入,高扇出,接口要简洁

关于注释

最是最好还是用英文写吧,免得你来回切换。每个文件有每个文件总的注释,每个函数有函数的每个参数的注释以及函数的作用,遇到重要的控制结构也要注释

写在最后

看完了C++ Primer之后对C++的理解增加了不少,最近想看看OpenCV的了解一下基本的操作,然后看看数字图像处理了解一下图像处理的原理

MFC也好,QT也好wxWindow也好,关键是理解思想,理解算法原理,理解设计原则。万变不离其宗,抓住根本才是最佳捷径。

关于自己怎么走:

其实每个人有每个人的走法,每个人有每个人的想法不一定都相同。

我也想好了,接下来把前面提到的OpenCV过一遍,然后看数字图像处理,Matlab理解理解图像处理的一些基本知识

关于语言方面的,主要还是加强基础方面吧,譬如C专家编程、C和指针、C陷阱与缺陷,Effective C++ 、More Effective C++、Exceptional C++等经典名著

关于库方面主要还是STL,泛型,模板等要熟练,Boost库可以适当看看,这里其实大部头还是有很多啊侯捷推荐的那几本。

关于嵌入式方面,上面语言的基础之下是不会有问题的,Linux程序设计->Unix环境高级编程->Unix网络编程->Linux内核源码(深入理解Linux内核、Linux设备驱动程序、Linux内核源码剖析等等)。这么个思路

关于算法和数据结构,算法导论,数据结构与算法分析,这两本啃啃。

其实关于嵌入式,这些我不知道各位是怎么走的,大致心里就这么个思路吧。

目前在OpenCV的阶段,同时处在加强基础的阶段,嵌入式方面还没开始,需要抓紧进度。

希望每一个心中都有一个目标,这样才不会迷失自己!Fight! 执行力!

文中提到了肯定有不妥之处,希望各位手下留情那,(*^__^*),还请各位多提意见,完善学习之路。谢谢!

                                                                                                                                                                                           2011/08/23


刚才和QQ:273451405 面壁者 聊了一下关于嵌入式的内容,谢谢他的无私的指导,谢谢你们!

学习Linux还需要理解计算机系统的知识这里推荐一本书《深入理解计算机系统》

另外《Linux内核设计与实现》比较浅显可以从这本开始看

然后就是《深入理解linux内核》、《Linux设备驱动程序》  ------这些都是概念性的知识,可能有些会搞不懂需要反复去读,在实践中去理解

更高级的就是研究源码的赵炯的《linux1.0分析》、《Linux内核设计的艺术》

                                                                                                                                                                                       2011/08/23/ 18:16


  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 16
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值