转载从CEGUI源码看代码规范
原文:http://www.cnblogs.com/coderzh/archive/2011/05/08/cegui_coding_style.html
CEGUI(Crazy Eddie’s GUI)是一个使用C++实现的基于LGPL协议的的开源GUI库,主要应用于游戏界面。连著名的开源游戏引擎Orge3D也放弃了自己的界面引擎而使用第三方的开源界面引擎CEGUI。
对于开源的代码工程,我首先会观察它的代码规范。比如,使用什么命名法,是否使用异常等等,这很有用。看不同的开源工程,可以看到各种不同的代码规范,其中有很多是值得借鉴的。
代码规范本身并没有绝对的对错之分,但我们往往为了某一个代码规范争论的面红耳赤。比如,是否使用匈牙利命名法,使用BOOL还是bool等等。这时,就 必须综合考虑团队现有的使用习惯和既有代码的风格,制定出一套适合自己的统一的规范。所以,规范除了对与错,最关键的地方还是要统一。存在即合理,我们不 要一味去排斥其他人的使用习惯和规范,而应该多读读别人的代码,看看著名的开源代码,了解别人的做法,然后对自己的做法进行一些反思。这才是面对代码规范 正确的心态。
CEGUI是一套不错的界面库,界面布局使用XML来描述,提供了专用的界面编辑器,让界面制作变得更简单。CEGUI作为一个成熟的开源产品,代码已经 经历了无数的千锤百炼,整体风格比较统一,是一个很好的学习范本。接下来,我粗浅的分析一下CEGUI一些值得学习的地方。
1. Camel命名法
CEGUI完全摈弃了匈牙利命名法,而使用更贴近语义的不使用变量类型前缀的Camel(骆驼)命名法,这也是现今代码通用的做法。匈牙利命名法在 较老的工程中比较常见。无数使用Camel的著名开源工程,很好的告诉了匈牙利命名法的支持者,不使用匈牙利命名法,代码依然清晰可读,甚至会更好。
2. 成员变量前缀
CEGUI中无论是class还是struct,成员变量都统一加d_前缀。通常的两种做法是不加前缀和加m_前缀。
3. struct
CEGUI中,struct的命名没有使用全大写,而是和class的大小写命名一样。在struct中,只可能出现数据成员,操作符重载函数,构造函数等。struct只用来数据结构存储使用,不使用任何其他的成员函数。
4. 字符串处理
CEGUI中的字符串处理没有使用char, wchar_t, TCHAR,std:string,ATL::CString,而是自己实现了一套String类(CEGUIString.h)。自己实现的 String类优势非常明显,可以让程序员从繁琐的字符指针操作中解脱出来,将更多的精力放在功能的实现上。自定义的String可以实现更多方便、切合 实际使用的函数。(比如CEGUI中的find_first_not_of,replace等函数。)如果要实现一个String类,CEGUI中的 CEGUIString是一个很好的范本。
5. 使用bool
使用bool和BOOL都有各自的理由,CEGUI中全部使用bool,是现在流行,最常见的,也是我喜欢的做法。
6. 异常机制
CEGUI中完全使用异常机制,通过重载std::exception定义了一套完整的异常机制。通过异常的处理,使得程序员从繁琐的错误检查和错 误返回值中解放出来。如果想了解C++中如何能够很好的使用异常,看看CEGUI中异常的实现吧(CEGUIExceptions.h)。
7. 不用goto
几乎每一本教材都会告诫用户,不要使用goto,这会让你的代码变得凌乱不堪。然而当真正成为一个程序员,加入一个公司甚至大型公司,里面的代码照 样充斥了无数的goto语句。goto的滥用是绝对不允许的,goto在某些情况下的确有它的合理之处(比如保证函数单一出口,释放资源)。还是那句话, 存在即合理。CEGUI中完全不使用goto,有了错误,立即抛异常,或者直接返回。我本人也是比较喜欢这种提前返回的方式。
8. 简单易用的Log系统
如果想实现一个既简单,又易用的Log系统,就看看CEGUI中的实现吧(CEGUILogger)。支持Log等级(Error,Warning等),输出日期、当前代码行等功能。
9. Singleton的实现
CEGUI中使用了一个通用的Singleton<T>模板基类,这个技巧非常好使。实现也非常简单:
{
protected :
static
#ifdef __MINGW32__
CEGUIEXPORT
#endif
T * ms_Singleton;
public :
Singleton( void )
{
assert( ! ms_Singleton );
ms_Singleton = static_cast < T *> ( this );
}
~ Singleton( void )
{ assert( ms_Singleton ); ms_Singleton = 0 ; }
static T & getSingleton( void )
{ assert( ms_Singleton ); return ( * ms_Singleton ); }
static T * getSingletonPtr( void )
{ return ( ms_Singleton ); }
private :
Singleton & operator = ( const Singleton & ) { return this ; }
Singleton( const Singleton & ) {}
};
如上面的Logger类,要使用Singleton,则这样定义:
{
}
这样做最大的一个好处是统一,不会在代码中出现各种稀奇古怪不同的Singleton实现。同时哪个class是Singleton也一目了然。
总结
本文仅仅讨论CEGUI中的代码规范,而且也只是其中很小的一部分,如有疏漏欢迎一起讨论。之后我会更加关注CEGUI现细节,如有收获将与大家分享。
最后,我还是那句话:不要完全排斥任何一种规范,将每种规范了解和使用过后,再来思考自己应该怎样做。
转载于:https://www.cnblogs.com/waynecheng/archive/2012/04/19/2456556.html
转载从CEGUI源码看代码规范相关推荐
- 从CEGUI源码看代码规范
CEGUI(Crazy Eddie's GUI)是一个使用C++实现的基于LGPL协议的的开源GUI库,主要应用于游戏界面.连著名的开源游戏引擎Orge3D也放弃了自己的界面引擎而使用第三方的开源界面 ...
- 从 Chrome 源码看浏览器如何计算 CSS
作者:李银城(内容经作者授权转载) 原文链接请点击左下角「阅读原文」 在< Effective 前端 6 :避免页面卡顿>这篇里面介绍了浏览器渲染页面的过程: 并且< 从Chrome ...
- linux内核第一个函数,通过内核源码看函数调用之前世今生 - 极光 - CSDN博客
通过内核源码看函数调用之前世今生 作者:杨小华 栈(Stack):一个有序的积累或堆积 韦氏词典 对每一位孜孜不倦的程序员来说,栈已深深的烙在其脑海中,甚至已经发生变异.栈可以用来传递函数参数.存储局 ...
- 从 Linux 源码看 Socket 的阻塞和非阻塞
转载自 从 Linux 源码看 Socket 的阻塞和非阻塞 笔者一直觉得如果能知道从应用到框架再到操作系统的每一处代码,是一件Exciting的事情. 大部分高性能网络框架采用的是非阻塞模式.笔者这 ...
- 读Zepto源码之代码结构
虽然最近工作中没有怎么用 zepto ,但是据说 zepto 的源码比较简单,而且网上的资料也比较多,所以我就挑了 zepto 下手,希望能为以后阅读其他框架的源码打下基础吧. 源码版本 本文阅读的源 ...
- [转载].NET商业软件源码保护
[转载].NET商业软件源码保护 列举工作以来遇到的各种类型的软件所采用的代码保护技术,只讲原理不涉及技术细节实现,以避免产生法律问题.有些朋友说直接把代码放在Github开源下载,开源可以促进技术交 ...
- codeblock socket 编译错误_从Linux源码看Socket(TCP)Client端的Connect
从Linux源码看Socket(TCP)Client端的Connect 前言 笔者一直觉得如果能知道从应用到框架再到操作系统的每一处代码,是一件Exciting的事情. 今天笔者就来从Linux源码的 ...
- linux内核线程socket,从Linux源码看Socket(TCP)的accept
从Linux源码看Socket(TCP)的accept 前言 笔者一直以为若是能知道从应用到框架再到操做系统的每一处代码,是一件Exciting的事情. 今天笔者就从Linux源码的角度看下Serve ...
- linux源码_从linux源码看epoll及epoll实战揭秘
从linux源码看epoll 前言 在linux的高性能网络编程中,绕不开的就是epoll.和select.poll等系统调用相比,epoll在需要监视大量文件描述符并且其中只有少数活跃的时候,表现出 ...
最新文章
- 2019年上半年收集到的人工智能深度学习方向干货文章
- 受软银收购利好影响 ARM股价大涨近50%
- 下午回来才后知百密于一疏忽
- 常见的http状态码
- 人脸识别(8)----人脸识别主要算法原理
- CentOS 挂载 exfat 和 FAT32格式的U盘
- Android input监控耳机插入demo
- 小白教程:Python爬取12306车票信息以及后期数据处理
- 利用不共线三点求解并联机构动系在定系中的位姿
- mc服务器小地图不显示玩家,为啥小地图莫名消失了 玩家:或许是它喝完随机饮料后 自己隐身了...
- Python爬虫—爬取京东商品信息(自动登录,换关键词,换页)
- 齐岳|马钱苷酸小麦麦清白蛋白纳米粒|雷公藤红素乳清白蛋白纳米粒Celastrol-whey protein
- 3DMAX导出插件编写(续)
- 高中数学培训高一数学提分技巧
- linux内核mproject函数,把linux驱动独立于内核外编译--示例
- 相亲交友app开发的系统功能
- java导出excel报表_java生成excel报表文件示例
- LCD1602液晶显示屏使用方法
- apicloud加java,【APICloud】App开发中加入系统分享功能案例源码分享
- Android高德地图自定义地图指南针