摘要: # -*- coding: cp936 -*-import copyMV = 0xFFFFFFFFVertexs = {0:'v0',1:'v1',2:'v2',3:'v3',4:'v4',5:'v5'}Arcs = [[MV,MV,10,MV,30,100],[MV,MV,5,MV,MV,MV],[MV,MV,MV,50,MV,MV],\ [MV,MV,MV,MV,MV,10],[MV,MV,MV,20,MV,MV],[MV,MV,MV,MV,MV,MV]]#初始化源点到目标点的最短路径 def 阅读全文
posted @ 2013-06-18 23:27 平凡之路 阅读(1095) 评论(0) 推荐(0) 编辑
摘要: # -*- coding: cp936 -*-#构建表达式二叉树import Stack#if 'ch' is opreator,then return True,otherwise return Falsedef isOperator(ch): if '+' == ch or '-' == ch or\ '*' == ch or '/' == ch or\ '(' == ch or ')' == ch or\ '#' == ch: return True retur 阅读全文
posted @ 2013-06-15 12:29 平凡之路 阅读(582) 评论(0) 推荐(0) 编辑
摘要: 系统背景:分布式消息架构,所有模块通过消息机制交互。问题现象:客户在界面执行业务的命令偶尔会失败。问题分析:1:表面看是消息无法发送,但经过消息平台定位,发现出错的时候消息内存被破坏。2:由于不是必现,没有什么错误日志,只有走读业务流程代码。问题定位:1:业务流程会申请一个消息包,结构大体如下:#define MAX_NUM 10struct { short userIns[MAX_NUM];//用户实例数组 short userNum; //有效用户数 };2:业务是实现一个用户监测功能,在一条消息中根据actionType取值不同表示启动和停止用户监测,代码流程如... 阅读全文
posted @ 2013-01-11 23:00 平凡之路 阅读(2766) 评论(0) 推荐(0) 编辑
摘要: 依赖倒置:就是要依赖于抽象,不要依赖于具体。简单的说就是要求对抽象进行编程,不要对实现进行编程,这样就降低了客户与实现模块间的耦合。假设一个客户端可以根据不同的终端智能显示,面向过程的处理流程结构图如下:客户端代码流程如下:if (type == Teminal1){ T1_disply();}else if(type == Teminal2){ T2_disply();}功能实现没有任何问题,考虑到软件的扩展如果增加一个新的终端我们再客户端的流程中就要加一个判断分支,如果系统够复杂后果往往是在流程中遍布判断,对后期的开发、维护都是艰巨的任务。产生这种结果的原因是业务依赖了底层的具... 阅读全文
posted @ 2013-01-08 21:54 平凡之路 阅读(3871) 评论(2) 推荐(2) 编辑
摘要: 接口隔离:定义为客户端不应该依赖它不需用的接口,在C语言中我们可以把头文件看成一个模块的接口,根据接口隔离原则也就是说这个头文件中只能包含外部需要的接口,但在实际的项目中往往头文件都不符合接口隔离原则。1:内、外部接口的隔离:头文件中通常包含了模块内部接口(内部类型定义、内部接口声明)和外部接口(外部接口声明)假设moudle模块对外提供一个fun1接口,模块内部实现需要定义一个结构类型,一般的实现如下:/*moudle.h*/typedef struct str_s str_t;struct str_s{ int a; int b;};void fun1();/*moudle.c... 阅读全文
posted @ 2013-01-06 23:08 平凡之路 阅读(6843) 评论(5) 推荐(1) 编辑
摘要: 为什么要用C来模拟面向对象的机制,在实际的工作中我们往往在感慨一些面向对象的经典设计模式由于C语言的限制无法使用,其实通过简单的模拟面向对象的行为,在C语言中也可以使用这些模式。1:类的构建类描述了所创建的对象共同的属性和方法。我们在一个源文件中通过把数据和操作进行适当的组织来完成类的模拟。/*类的数据*/typedef struct SQUARE_S SQUARE_T;struct SQUARE_S{ void (*draw)(void*); int sideLen;};/*类的方法*/static void draw(void* pObj){ SQUARE_T* pSqr... 阅读全文
posted @ 2012-12-22 21:49 平凡之路 阅读(9287) 评论(2) 推荐(0) 编辑
摘要: 单一职责原则:通常的定义是只专注于做一件事和仅有一个引起它变化的原因。对于接口、实现、函数级别往往我们比较容易关注单一职责,大家谈的也比较多,但对于返回值、参数可能不会有太多的人关注。但往往就是这些不符合单一职责原则的设计可能导致一些很难发现的BUG。看看下面这段代码:pBuf = (byte*)realloc( pBuf, size);if( pbBuf != NULL ){ TODO...}可能很多人一眼看上去并没有什么问题,先让我们看看这个库函数的定义:函数简介 原型:extern void *realloc(void *mem_address, unsigned int ... 阅读全文
posted @ 2012-12-11 22:00 平凡之路 阅读(4698) 评论(2) 推荐(3) 编辑
摘要: 一提到多线程一般大家的第一感觉就是可以提升程序性能,在实际的操作中往往遇到性能的问题,都尝试使用多线程来解决问题,但多线程程序并不是在任何情况下都能提升效率,在一些情况下恰恰相反,反而会降低程序的性能。这里给出两个简单的例子来说明下:程序1:View Code import threadingfrom time import ctimeclass MyThread(threading.Thread): def __init__(self, func, args, name): threading.Thread.__init__(self) self.name ... 阅读全文
posted @ 2012-12-08 11:57 平凡之路 阅读(17275) 评论(7) 推荐(2) 编辑
摘要: 多态是面向对象语言的一个基本特性,多态意味着变量并不知道引用的对象是什么,根据引用对象的不同表现不同的行为方式。在处理多态对象时,只需要关注它的接口即可,python中并不需要显示的编写(像Java一样)接口,在使用对象的使用先假定有该接口,如果实际并不包含,在运行中报错。class handGun(): def __init__(self): pass def fire(self): print 'handGun fire'class carbine(): def __init__(self): pass def fire(self): print 'carbine 阅读全文
posted @ 2012-12-02 20:30 平凡之路 阅读(12528) 评论(0) 推荐(0) 编辑
摘要: 由于在项目中需要使用到不同关键字类型(整数,字符串等)来构建hash表,可以使用一个较为通用的hash表操作算法来实现。1:支持多种关键字类型。2:支持hash表的动态扩大。3:通过双向链表链接所有元素,方便hash表的动态扩展和清空。一个实例:hash值1、3、5、7中存在对应的元素节点,这些元素节点又互相链接并由一个pHead节点指向。数据结构定义:每个元素是双向链表的节点。pFirstElem是链表的头结点,通过该节点可以快速遍历所有元素。View Code #define STR_TYPE 0#define INT_TYPE 1typedef struct elem_s elem_t, 阅读全文
posted @ 2012-08-15 22:50 平凡之路 阅读(3133) 评论(0) 推荐(2) 编辑