C/C++中一个简单的enum手法(idiom)

今天写程序的时候,又用到这个idiom了,于是顺便贴出来。这个idiom蛮简单的,估计很 多人都用过。今天主要是贴出来给新手参考(老手们就甭费时看此帖了)。

为了说明这个手法具体该咋用,咱举一个简单的例子来说事儿。比方说要开发一个网络程 序,其中需要统计各种网络协议的数据包数量。

★版本1

假设一开始只需要处理HTTP和FTP两种协议。有些同学不假思索,立即会声明如下两个整 数用于统计:

int nCntHttp = 0;
int nCntFtp = 0;

猛一看,似乎没啥问题。但是,如果需求发生变更,又要增加两种协议:SMTP和SSH。然 后,该同学会继续扩展上述代码,变为如下:

int nCntHttp = 0;
int nCntFtp = 0;
int nCntSmtp = 0;
int nCntSsh = 0;

这时候,问题开始显露出来了。比方说要打印上述4统计值,就得写4个printf;再假如要 用断言确保所有统计值大于零,也得写4个assert。这都是挺烦人的事儿。(当然啦,有些同 学会把4个变量的打印写在一个printf中,但还是一样烦人)

★版本2

这可咋办捏?某些同学就灵机一动,把上述代码修改为数组形式,上述的4个统计值依次 放入数组中。具体如下:

int nCntProto[4];

/* 第0个是HTTP,第1个是FTP,第2个是SMTP,第4个是SSH */

这样,无论是打印还是断言,都可以用for循环搞定,貌似挺方便的。但这么一来,引入 了另一个问题。假设我在程序中要用到SMTP的统计数字,就得这么写代码:nCntProto[2]。 这就造成了很不雅观的“Magic Number”!要知道,Magic Number可是代码的臭 味之一啊(其弊端在“这里”曾经介绍过)。万一将来,数组中的存放顺序发生 变化,那就完蛋了:好多用到Magic Number的代码都得跟着改。一旦漏改某处,引出Bug无数 !

★版本3

为了消除Magic Number,增加代码可读性和可维护性,有些同学开始打起enum的主意。在 代码中增加了一组enum,具体如下:

enum PROTO
{
 PROTO_HTTP,
 PROTO_FTP,
 PROTO_SMTP,
 PROTO_SSH,
};

int nCntProto[4];

这样,如果我需要用到SMTP的统计数字,我就不用写nCntProto[2],而是写nCntProto [PROTO_SMTP]。这样,可读性明显好多了。即使将来数组中的存放顺序发生变化,也没关系 :只需稍微调整enum中常量的顺序即可,其它代码不用动。

时间: 2024-12-30 20:31:48

C/C++中一个简单的enum手法(idiom)的相关文章

qt c++-qt中一个简单数据传送问题

问题描述 qt中一个简单数据传送问题 想通过点击1按钮后pc会向串口发送数据1,使用了qt第三方串口类,不知道这样写对不对?求大神指教一下. 解决方案 qt中的一个问题 解决方案二: QT5 已经添加了QSerialPort 类了 你这样写 应该没啥问题的 解决方案三: QT5 已经添加了QSerialPort 类了 你这样写 应该没啥问题的

vc.net中一个简单的问题,可是自己纠结了好久,纯新手,希望大家帮忙解答,谢谢!

问题描述 大概代码如下:namespaceCOMRecEvent{--(在窗体设计时添加了一个TextBox1)--#pragmaendregionrefclassPortDataReceived//一个串口数据接收的类{public:staticvoidMain(){//串口实例化及初始化设置SerialPort^mySerialPort=gcnewSerialPort("COM1");mySerialPort->BaudRate=9600;mySerialPort->P

Android开发中一个简单实用的调试应用技巧分享

前言 大家应该都有所体会,在应用开发中,我们常常会进行日志打印或者debug调试,以此来分析运行时的一些信息,便于发现bug和问题.Android Studio的Debug功能很好用,但是有时候有些情况下,就显得不是那么快捷和便利. 比如 我们调试的点在应用一打开的时候,很靠前,例如Application的onCreate方法中,以至于我们不能足够快的设置进程为debug模式 虽然上面的情况可以通过Android Studio的debug运行来解决,但是如果项目很大的话,运行起来也会比较耽误时间

asp中一个简单的用户登陆验证类

源代码如下: <%'========================================================================== ' ' 用户登陆身份验证类 ' ' NAME: CheckLogin ' ' AUTHOR: Infozero ' DATE : 2006-5-28 ' ' COMMENT: 用户登陆身份验证类 ' '================================================================

dess中一个简单的多路委托的实现_javascript技巧

复制代码 代码如下: var SDelegate = function(f, b, c) { if (b) { this.asFunction_ = function() { return f.apply(b, arguments); } } else { this.asFunction_ = function() { return f.apply(this, arguments); } } this.method_ = f; this.binding_ = b; this.continus =

java 中一个简单的正则表达式问题,帮忙看下.

问题描述 哪位朋友帮忙看一下.这个正则表达式:String regex = "mailto:\w+\?";匹配下面这段内容为什么匹配不到..mailto:34553234@qq.com?cc=zhoueyese7290783@126.com&subject=applicationID:10001-action:approver&body=特别无聊. String regex = "mailto:\w+\?"; Pattern pattern = Pa

SharePoint中创建一个简单的Web Part 部件

标准的Web部件有时候可以非常强大,可以执行许多函数.本文主要讲解如何使用Visual Studio 创建一个简单的Web部件. 1. 打开VS,点击文件----新建项目. 2. 选择空白SharePoint项目.命名SmallvilleWebPartProject,点击确定.选择部署为场解决方案. 3. 右击项目添加新项目. 4. 选择Web部件. 5. 命名CustomerInformation,点击添加. 6. 右击新的Web部件项目,选择添加类,命名CustomerData,点击确定.

java中一个商品列表集合简单问题

问题描述 java中一个商品列表集合简单问题 java中一个商品列表集合简单问题 java中一个商品列表集合简单问题 肯德可以理解为对象,java一切都是对象 那么可以理解为一个类吗可以理解为一个数组吗,可以理解为一种数据泪腺吗 解决方案 对象集合类是类,但不能说对象集合的对象是一个类,对象就是类的实例,和类是不等的.数组是指基本数据类型集合.比如int [] arrs = new int[]{},而List 等类创建的对象集只能称为集合.不能理解为数据类型.数据类型只有基本类型和引用类型.

[原创]一个简单的windows HOOK - 隐藏进程管理器中特定的进程

一个简单的windows HOOK - 隐藏进程管理器中特定的进程  (适用平台:windows 2000 sp4,windows XP sp2)           屏蔽任务管理器中的进程名称有很多种方法,可以在ring0级做文章: 修改内核进程链表,拦截内核API等.我这里只给出win32下的实现,原 理是最普通的 windows 钩子机制.实现语言 win32 汇编 (masm32):   0 在DllEntry中处理资源取得和产生"工作"线程: mov eax,_hinstan