`
fixopen
  • 浏览: 83894 次
文章分类
社区版块
存档分类
最新评论
文章列表
我先从现有的模块结构说起,然后做一个分类和总结,同时预测一下未来的趋势 最初的Fortran语言就提供了各种模块机制【当然,按照现在普遍的认识,不认为它们是模块,不过按照我的看法,它们显然是】。比如Routine,DataBlock ...
模块化是迄今为止对付复杂软件系统的最好的办法。 问题并不在于上面这句话。问题在于怎么模块化。这儿的“怎么模块化”并不是说不知道模块化是把系统分拆成几个模块,组合而成系统。而是说不知道以什么规则指导我们进行模块分拆。 当然,关于模块化,有很多非常著名的指导原则,最著名的莫过于“高内聚,低耦合”。可是这个原则有点太过空泛。即便如此,我们也很有必要研究一下这个原则。高内聚的好处是什么?为什么要高内聚?我个人的感觉是,高内聚降低了模块的理解成本,同时潜在的降低了模块组合的困难程度,因为高内聚比较倾向于产生一致性好的接口。低耦合呢?低耦合有一个非常直接的目的,就是为了降低模块的相互依赖程度,以便于:一、更 ...
今天看了hax的blog,不知道哪个项里面提到了CSS面对表格的col的时候的尴尬。后来深入思考了一下,发现这其实是一个本质性的困难。而且问题并不是出现在CSS上,而是出现在XML上。 由于XML要求任何一个元素(除了根元素)都必 ...
一个定时器队列 实现了一个高性能的定时器队列处理系统,基本的实现思路是把所有的定时器请求按超时的前后顺序排入队列中,然后不断的查看是否开始的定时器超时已经到达,如果到达则调用回调处理函数。 这个定时器队列依赖于时间处理的函数和线程,这两个都是平台相关的,不过幸运的是我把他们包装起来了,也就意味着这儿有一个简单的线程包装库。同时有一个小小的可用的可池化的线程的实现。
只适合在Windows系统下[包括WinCE]使用。主要是因为依赖于Windows平台的CString和FindFirstFile、FindNextFile以及FindClose系列函数。其实对于CString的依赖并不是必要的,只是方便了Find*系列函数的调用而已。 examples里面是一些使用这个简单遍历器的例子。包括删除目录中所有文件,复制到另一个目录,生成vector或者一个别的表达等等。 StringOp实现了std::string和CString之间的转换。 当然,我知道,boost实现了一个更漂亮的目录访问器,并且显然功能更强,适应性更好,但是由于我想到我仍然不得不在自己的平台 ...
有限状态机 实现了一个确定型的有限状态机,可以向它注册状态跃迁规则和动作,然后在事件发生的时候通知它,别的都由它实现了。动作的原型是一个void (*)(void* params)的函数指针。 FSM的实现不依赖于任何超越标准C++的内容,也就是说,它可以使用在任何支持标准C++的环境中。顺便说一下,我在WinCE和Windows上都使用过它。 HTML2TEXT 一 个简单的例子使用有限状态机,它能够实现快速的把HTML文件转换为TEXT文件,具体的说,就是把标签(头尾tag)去掉,同时其属性也被去掉,把注释 内容去掉,把脚本和内嵌样式单中的内容去掉,把实体引用转换为实体代表的内容本身。 ...
在合适的地方使用合适的技术,我想这一点没有人会反对。而且大多数人都会觉得做到这一点极端简单,无需乎强调。大家可能会觉得问题倒是在于怎么断定什么是合适的技术这个问题。 但其实这两个问题(1、使用合适的技术,2、判定技术是否合适)并没有明确的分界线。因为显然如果不能判定技术是否合适,我们就不能使用合适的技术。 现在说一下我判断技术是否合适的基本原则。1、要经过时间的考验。2、要有比较严密的理论基础。3、技术本身的流行度高。 看看软件开发过程中涉及到的问题。1、理解问题域。这个过程叫做什么业务建模也罢,叫做什么需求分析也罢,主要的目的就是理解问题域。2、设定解决方案。 这个区间承上启下,是一个关 ...
C和C++语言是流行和常用的依赖于顺序的语言。C++略为有点改进,在类范围内部不依赖于顺序。依赖于顺序是一种惩罚,是一种不重视程序员感受的表现,并且在深层次要求采用采用声明和实现分开,因而也就不能维持DRY原则。违背DRY会导致维护复杂。 我详细说明一下为什么依赖顺序是罪恶的。 大家都知道抽象是一种强大的能力,但是,依赖于顺序强迫我们只能从低层次的细节开始,这跟现如今流行的IDE的智能完成一样。我们不得不把所有的细节描述完备,才能构造更大的构件。 我还是用一个实例来说明吧。 我为了练习的目的,试图写一个HTTP Client,自然,我是从阅读RFC规范开始的。通过扫描RFC的目录和快速掠过其内容 ...
关于这个话题,我似乎说过好多次了。软件系统其实就是现实系统的抽象,就是现实系统的模型。最近,看到一个论点,是这样说的:软件建模(架构)的过程其实就是一个定理证明的过程。我得说,在我看来,这有一定的真理性。但是事实有一定的差异。基本原因是:我们碰到问题的时候,并不总是对问题的解决方案一无所知的,或者更确切的说,对问题的解决方案几乎总是有一定的了解得。这时候,证明的过程其实并不是很明显,反而是表达的过程成了重头戏。 这儿,我在阐述一遍我的观点,软件就是模型,就是抽象。基于上面的描述,软件开发过程也就是构思模型和表达模型的过程。由于表达和构思互相影响,密不可分(大家可以参照语言和思维的关系来理解这一点 ...
interface EventTarget {   void               addEventListener(in DOMString type, in EventListener listener, in boolean useCapture);   void               removeEventListener(in DOMString type, in EventListener listener, in boolean useCapture);   boolean            dispatchEvent(in Event evt) raises(Ev ...
interface StyleSheet {   readonly attribute DOMString        type;            attribute boolean          disabled;   readonly attribute Node             ownerNode;   readonly attribute StyleSheet       parentStyleSheet;   readonly attribute DOMString        href;   readonly attribute DOMString        ...
由于Ajax的火爆,所以我会重点介绍与它相关的一些技术。下面的文档已经写了很久了,由于上一篇的尖括号搞的我非常之烦,现在才贴出来,见谅。 我将从Window,XMLHttpRequest等这几个主要接口出发(Document前面已经描述了),描述客户端Javascript编程的主要轮廓。另外,值得注意的是,这个领域的变化仍然非常剧烈,我不保证我描述的东西都可用。无论是现在(我描述的东西还太新)还是以后(而且还没有定型)。 interface XMLHttpRequest {            attribute EventListener   onreadystatechange;   ...
虽说我认为上面的东西基本上不言自明,但我也意识到,很多人并不是很清楚XML的基本概念。所以,我准备把上面的东西解释一遍,只解释那些我认为确实有必要解释的东西。 一个XML文档就是一个文本文档。跟普通文本文档完全 ...
介绍host概念 与普通的语言不同的是,JavaScript一开始就被设计为一个嵌入式的语言。这意味着,它是寄生在某个环境中而不是自足的。当然,这也意味着其运行环境的边境就是JavaScript的能力边境。JavaScript所寄居的那个运行环境 ...
上面的描述中,我特意的省略掉了RegExp的具体描述。RegExp就是大名鼎鼎的规则表达式,我准备用一章描述之。 规则表达式是用来在文本中进行高效查找和替换的一种语言体系。按照分类,它是正则文法。 按照惯例,先说RegExp的li ...
Global site tag (gtag.js) - Google Analytics