Web Analytics

Transaction模式的C实现

提到Transaction模式(即事务模式),很多人会感到陌生。这并不奇怪,在大名鼎鼎的GoF的《Design Pattern》一书中,它仅仅是Command模式的别名罢了。不过在实际的开发中,我们却经常会遇到可以应用事务模式的场景。本文可以理解成Command模式在事务领域的应用,但这样说有些麻烦,我们莫不如直接称之为Transaction模式。 与前几篇设计模式C实现系列文章一样,这篇文章也源于对实际问题的思考和总结。这次的问题是这样的:我们的业务系统实现了一个ftp上传文件的功能,其v1版代码的结构简化后大致如下: int ftp_upload_file(const char *filename, const remote_server_desc *desc) { int ret; ...

November 4, 2011 · 5 min · Tony Bai

Chain of Responsibility模式的C实现

又是一个行为类的模式,似乎这类模式在使用C语言开发的项目中适应性更强,而另外两类模式创建型和结构型则略显不受待见^_^。 Chain of Responsibility模式(中文名:职责链模式)是一个不算复杂的模式。虽不复杂,但用好了同样可以解决大问题。个人觉得其最大的好处就在于可以动态地重组针对一类对象的处理流程。正是得益于这一优势,它才可以在纷繁芜杂的业务领域站稳脚跟。 ...

October 25, 2011 · 4 min · Tony Bai

Strategy模式的C实现

与那些复杂的模式相比,Stragegy Pattern(策略模式)是一个相对简单的模式,很直观,也易于理解。 同时它也是我们在开发过程中使用最多的模式之一。 问题是设计模式使用的驱动力,只有当我们遇到问题时,设计模式才会向我们伸出援助之手。这里我也想通过对问题以及解决方法演化的阐述来说明策略模式是如何更好地帮助我们的。我们从问题出发! ...

October 20, 2011 · 7 min · Tony Bai

Observer模式的C实现

设计模式 (Design Pattern,以下简称DP)的定义有很多种。我个人的理解:DP是人们在软件开发过程中所总结出来的一些典型问题的经验解决方法模板。使用它们可以使我们的代码更易被复用,更易扩展,更好地适应变化以及更便于后期维护。 ...

October 14, 2011 · 8 min · Tony Bai

经典设计原则背后的本质

近一段时间重读了一些经典书籍,诸如《敏捷软件开发:原则、模式与实践》、 《程序员修炼之道》、《Unix编程艺术》等。这些书中关于如何衡量或评价一个类或函数设计好坏的几个原则(Principle)让人印象深刻。《敏捷软件开发》中谈到了SRP、OCP、DIP; 程序员修炼之道则以DRY、“正交性”为话题展开;《Unix编程艺术》围绕紧凑性、SPOT、分离等阐述作者立场。这么多经典原则,如何学习把握?我们不妨来挖掘一下这些新设计原则背后的本质。 追本溯源,从计算机编程语言的发展历史来看,成熟的结构化程序设计语言(如C语言、Pascal等)要先于成熟的OO设计语言(C++、Java等)出现,那么其成熟的设计理论显然也是要早于后者的。这里就不能不提到经典结构化设计的代表作:《Structured Design: Fundamentals of a Discipline of Computer Program and System Design》,这本书出于1975年(年份来自维基百科,Amazon上卖的是1979年版)。说实话我也没有看过此书原版,不过书中的内容和思想早已被其他后继书籍引用和借鉴,我们在市面上能看到的关于结构化设计方面的书籍,尤其是中文书籍,多照搬了此书内容和思想,所以也算是间接学习到了。 ...

September 17, 2010 · 3 min · Tony Bai

一次函数设计讨论

近期在考虑对底层函数库进行一些重构,今天下午花了两个小时考量现有的函数库的接口设计,发现目前函数库的实现存在着一个普遍的问题:与特定的内存分配实现耦合的太紧。 我们的应用是多进程结构的,并使用了共享内存这种最快捷的IPC机制,鉴于此很多同事在实现一些数据结构或者算法时可能只考虑到了我们常见的应用场景-多进程共享,而对非共享内存分配的情况考虑不足。那如何将目前某些库函数实现与内存分配之间的强耦合解开呢?针对这道题我发起了一次mail讨论。 题目再重述一下:“目前底层库中的一些数据结构,比如xx_tree、xx_hash_table等,在它们的实现中都会有“分配内存空间”的需求,现有的实现多是直接调用已有的xx_shm_malloc和xx_shm_free在共享内存上动态申请和释放内存,但实际上有些场合我们并不需要在共享内存上分配内存,进程私有堆上的内存完全可以满足需求。如果让大家考虑修改目前xx_tree的实现或重新设计xx_tree的接口,以达到让xx_tree支持多种内存分配策略的目的,你是如额考虑的,请谈谈你的设计思路。" ...

September 2, 2010 · 5 min · Tony Bai

iterator的C实现

这几天一直处于编码状态,也找回了一些对代码的良好感觉。 昨天晚上闲暇时翻阅“Head First设计模式”,当翻到迭代器模式时,突然有了想法:实现一个iterator。这几天编码时恰好也写了一个简单的带有遍历功能的小数据结构,不妨用iterator改造一下这个数据结构的遍历接口,看是否能成行。 ...

January 30, 2010 · 3 min · Tony Bai

软件业的'图纸'在哪里?

上周日和橱柜公司商量好,下午三点到我的房子量尺,橱柜设计师按时到达,拿着一卷尺开始了测量工作。有过装修经历的人都知道:在装修公司进场之前需要橱柜设计师出一份水电改造图,便于装修公司人员确定水电改造的具体方法。装修公司的施工人员与橱柜设计师之间仅需要一份设计图纸就可以完成水电路改造的沟通,这不由得让我想起这样一个问题:“软件开发领域的"图纸"在哪里呢”? ...

March 31, 2008 · 4 min · Tony Bai

软件抽象

不知道“软件抽象”这个标题能否恰好表达出我想表达出的意思,暂且就起这个名字吧。随着工作经验的增加,对软件开发所涉及的技术知识体系的理解也渐渐地清晰(起码自己是这么感觉的^_^),思考了若干时间后,拿出来给自己一个和大家交流的机会。 ...

November 21, 2005 · 3 min · Tony Bai

tony说设计-实践后的体会

入司后连续做过几个项目。最近在做一个新的项目的设计的时候,突然想到是不是该把以前项目中一些好的设计想法应用到新的项目中,并且尽量减少在新的项目中遗留以前的不好的设计呢?那么以前的项目中哪些是值得我去借鉴,哪些又是应该去避免的呢?真的很遗憾,自己并没有系统的反思和总结过,这就是我写下这篇Blog的直接起因。 ...

November 16, 2005 · 5 min · Tony Bai