TinyLab

Keep eyes on the star and feet on the ground.


  • 首页

  • 归档

  • 分类

  • 标签

每周一荐:设计模式

发表于 2012-03-04   |   分类于 每周一荐

书籍:《设计模式——改善既有代码的设计》

简介

这本书结合设计实作例从面向对象的设计中精选出23个设计模式,总结了面向对象设计中最有价值的经验,并且用简洁可复用的形式表达出来。书中分类描述了一组设计良好、表达清楚的软件设计模式,这些模式在实用环境下特别有用。

设计模式

笔记

23个设计最基础的设计模式,每每读起如醍醐灌顶!不愧为经典之作!

创建型

Abstract Factory:提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类

Builder:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示

Factory Method:定义一个用于创建对象的接口,让子类决定实例化那一个类。Factory Method使得一个类的实例化延迟到其子类

Prototype:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象

Singleton:保证一个类仅有一个实例,并提供一个访问它的全局访问点

结构型

Adapter:将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能在一起工作的那些类可以一起工作

Bridge:将抽象部分与它的实现部分分离,使它们都可以独立地变化

Composite:将对象组合成树形结构以表示”部分-整体”的层次结构。Composite使得用户对单个对象和组合对象的使用具有一致性

Decorator:动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式比生成子类给为灵活

Facade:为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得子系统更加容易使用

Flyweight:运行共享技术有效地支持大量细粒度的对象

Proxy:为其它对象提供一种代理以控制对这个对象的访问

行为型

Chain of Responsibility:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止

Command:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作

Interpreter:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子

Iterator:提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示

Mediator:用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式的相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互

Memento:在不破坏封装的前提下,捕获一个对象的内部状态,并在对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态

Observer:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新

State:允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类

Strategy:定义一系列的算法,把他们一个个封装起来,并且使它们可互相替换。本模式使得算法可独立与使用它的客户而变化

Template Method:定义一个操作中的算法骨架,而将一些步骤延迟到子类中。Template Method使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤

Visitor:表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作

书籍:《设计模式解析》

简介

本书以作者自身学习、使用模式和多年来为软件开发人员(包括面向对象技术老兵和新手)讲授模式的经验为基础撰写而成。首先概述了模式的基础知识,以及面向对象分析和设计在当代软件开发中的重要性,随后使用易懂的示例代码阐明了12个最常用的模式,包括它们的基础概念、优点、权衡取舍、实现技术以及需要避免的缺陷,使读者能够理解模式背后的基本原则和动机,理解为什么它们会这样运作。

设计模式

笔记

对象、封装、面向对象设计不同视角的定义

视角对象封装面向对象设计概念具有责任的一个实体任何形式的隐藏:实现细节、派生类、设计细节、实例化规则共性分析规约接口集合共性分析、变性分析实现数据和方法集合数据隐藏变性分析

优秀代码的目标:

  • 高效
  • 健壮
  • 灵活
  • 无冗余
  • 可读
  • 可测试

面向对象的一些原则和方法

内聚性(cohesion):例程中操作之间联系的紧密程度

耦合性(coupling):两个例程之间联系的紧密程度

软件开发的目标:高内聚、松耦合

发现变化并将其封装

  1. 寻找变化,并将它封装在一个单独的类中

  2. 将这个类包含在另一个类

当一个类处理越来越多不同变化时,代码的内聚性就会变得很差。即:它处理的特殊情况越多,可理解性就越差。

设计的两步法:

1> 抽象类(共性)—— 需要什么接口来出来这个类的所有责任?

2> 派生类(可变性)——对于这个给定的特定实现,应该怎样根据给定的规约来实现它?

处理新需求的选择:

1> 分析瘫痪;

2> 放任自流;

3> 考虑变化的设计

考虑变化的设计

原则:针对接口编程,而不是针对实现编程

原则:优先使用对象组合,而不是类继承

原则:考虑设计中什么应该是可变的

防止“分支蔓延”

一条规则,实现一次

组合起来:用模式思考

Alexander: 设计应该从问题的一个简单陈述开始,然后通过在这个陈述中加入信息,使它更加详细(也更加复杂)。一种基于模式的方法(《建筑的永恒之道》)

从整体的概念性理解开始,以理解需要实现的目标

找到整体中出现的模式

从为其它模式创造背景的那些模式开始

从背景向内:应用这些模式,找到新的模式,并重复

最后,通过每次应用一个模式,改进设计,并在所创建的背景中予以实现

用模式思考的过程:

  1. 找出模式
  2. 分析和应用模式
  3. 按背景的创建顺序将模式排序
  4. 选择模式并扩展设计
  5. 找到其它模式
  6. 重复
  7. 添加细节

考虑背景时候的一条规则:先考虑系统中需要什么,然后再去关注如何创建它们

背景和被使用的关系:当一个模式使用另一个模式时,被使用的模式就处于使用模式的背景中

设计模式的策略:

从背景设计

在类中封装变化

设计模式的原则:

开闭原则——模块、方法和类应该对扩展开放,对修改封闭。换言之,软件应该设计成不加修改缘由代码就能扩展功能。

依赖倒置原则——其背后的理念是在设计细节之前先创建总体概念。高层模块不应该依赖底层模块。相反,它们都应该依赖于抽象。

理性怀疑原则——小心过分依赖模式。概念层次的模式和模型都是真理的抽象。它们是已往经验和教训的结晶。使用它们来帮助我们思考摆在前面的问题。

共性与可变性分析(CVA):

先寻找共性

从这些共性创建抽象

从共性的变化寻找派生

看共性之间的关系如何

分析矩阵:

找到某种特定情况中最重要的特性,并用矩阵将它们组织起来。用特性所表示的概念为每个特性标记。

继续处理其它情况,安需要扩展这个矩阵。处理每一情况时应该独立于其它情况。

用新的概念扩展该分析矩阵

用行发现规则

用列发现实现

从这种分析中确定模式

得到高层设计

对象创建和管理规则:对象应该要么构造和/或管理其它对象,要么使用对象,而不应该兼而有之。

常见的设计模式:

Facade  
Adapter  
Strategy  
Bridge  
Abstract Factory  
Decorator  
Observer  
Template Method  
Singleton 和 Double-Checked Locking  
Object Pool  
Factory Method  

每周一荐:程序设计语言原理、英国组曲

发表于 2012-02-18   |   分类于 每周一荐

书籍:《程序设计语言原理》

豆瓣:<http://book.douban.com/subject/3119946/

简介

本书从为什么学习程序设计语言入手,深入细致地讲解了命令式语言的主要结构及其设计与实现,内容涉及变量、数据类型、表达式和赋值语句、控制语句、子程序、数据抽象机制、支持面向对象程序设计(继承和动态方法绑定)、并发和异常处理等方面。最后两章介绍了函数式程序设计语言和逻辑程序设计语言。

程序设计语言原理

笔记

作为一个程序员,一般只有精通一门程序设计语言就可以胜任当前的工作了。当往往进入一个新的项目,或者重新选择一份工作,或者自己发现当前的所使用的程序语言对于有些问题的解决,用着不是那么方便,这个时候我们就倾向于去寻求一种合适的语言。比如,我最近在工作过程中,发现当前项目其实缺少很多工具,我们开发主要用的是C++,一个个对于C++不能说的上精通,但各种语法与库也了然于胸,用C++去写一些工具的时候就发现细枝末节太多、太烦人,数据库、XML文件解析、字串处理虽说都有库支持,但总感觉用着不那么顺手,速度也没那么快,还不如找一个脚本语言快速开发一个,Python正和我意。

程序语言之间有很多共同之处,往往当你精通一门之后,学习其它语言就触类旁通了。需要做的事情就是熟悉它的语法,如果能看懂相应的BNF(巴克斯——劳尔范式)那就更好了,遇到模棱两可的语法问题,多去查查就好了。语义一般都大同小异,当你知道了程序言的各种机制的实现之后,对其语义的理解就更加深刻了。《程序设计语言原理》这边书相当于程序语言各种机制的总结,同时对于我们去学习新语言也指出一条清晰的思路,对现在正在用的语言也有更加深刻的认识了。

程序语言的分类:
  1. 命令式语言:使用最多的,如:C/C++/Java/VB/Pascal等所有主流语言。主要是因为冯诺依曼计算机模型(处理器负责计算,内存负责存储中间结果)。

  2. 面向对象语言:基于数据抽象的封装,提出类、对象、继承、动态绑定等概念,用来模拟问题领域出现的事物。C++/Java最好的例子了。

  3. 函数式语言:这种类型的语言是基于阿隆佐·邱奇(Alozo Church,阿兰·图灵的师傅)提出的lamda演算,语言中一切皆函数。Lisp就是典型的函数式语言。

  4. 逻辑语言:基于谓词演算,可以进行逻辑推理的语言,如:Prolog(这种类型的语言至今还没用过,只是听说过大名~~)

命令式语言的学习思路:
  1. 名字、变量、绑定

    名字是否大小写敏感?那些是关键字?那些是保留字?
    变量六个基本属性:名字、地址、类型、值、生存期(时间)、作用域(空间)
    变量类型检查?强类型吗?
    变量的作用域如何?静态作用域、快、动态作用域?
    变量的生存期如何?精通变量、栈动态变量、显示堆动态变量、隐式堆动态变量(垃圾回收)?

  2. 数据类型

    基本类型:数值类型(整数、浮点数、复数、小数)、布尔类型、字符类型
    字符串类型
    序数类型:枚举、子范围类型
    数组类型
    关联数组
    记录类型
    联合类型
    指针类型
    引用类型

  3. 表达式与赋值语句

    算术表达式
    关系表达式
    布尔表达式
    操作符号的优先级、结合性
    操作符号的重载
    赋值语句:简单赋值、条件目标、符合复合赋值操作符、列表赋值、混合模式赋值

  4. 控制结构

    选择语句:双向选择语句(if… else …)、多向选择语句(switch .. case ..)
    循环语句:计数器循环(for …)、逻辑控制循环(while)、用户定位的控制循环(break、continue)
    无条件跳转(goto)

  5. 子程序(过程抽象)

    过程
    函数
    参数传递语义模式:输入形、输出型、输入输出型
    参数传递实现模式:按值传递、按结果传递、按值与结果传递、按引用传递
    参数的类型检查
    局部引用环境:局部变量、嵌套子程序
    重载子程序
    通用子程序(如:C++函数模板)

  6. 面向对象的程序设计(数据抽象)

    抽象数据类型
    继承
    动态绑定

以上大概列举了一个语言的所有特性,有些语言支持、有些语言不支持。语法不尽相同,但语义一般都是相同的。只要按着上面列举的顺序,确定好某一种语言的语法形式,我相信你我都会很容易学会一门新的语言。上述的仅仅是学会了一门程序设计语言,为了解决实际问题其实我们还面临着无尽的长路,问题的模式和相应的程序语言库等都需要慢慢去熟悉和学习。

所以我认为,精通一门语言并不代表着你会用那种语言写一些不算糟糕的程序,还意味着必须知道常见的问题模式及其对应的程序库,并且烂熟于心,遇到问题时候很自然地就会用到它。当然每种语言还有它独有的一些技巧和使用注意事项,对这些也要必须有所了解。千万不要自称:“我精通xxx语言”,其实我们只是“会”用它写一些程序而已,所谓的精通者必定对这门语言有着极其深刻的理解和认识、甚至编译器效率,各种细微之处也了然于胸。(以上仅为个人观点)

音乐:巴赫的《英国组曲》

英国组曲

试听:http://www.xiami.com/album/368302

简介

巴赫的英国组曲是17世纪键盘名作,根据最新考证应该写于巴赫服务魏玛宫廷时期(1708-1717)。各曲都充满协奏曲的华丽精神,具有典型的德国风格,因为巴赫将乐谱献给某英国贵族,所以被称之为《英国组曲》。《英国组曲》共有六号,在规模、表现力以及情感上都比巴赫的同类键盘作品《法国组曲》要庞大。这些组曲有的短小但意境广博,有的具有浪漫的气息,有的清新内敛,有的庄严肃穆。用现代钢琴来演奏这部巴洛克的复调作品更有一番迷人的风韵。明朗、快乐又清澄的第一号;华丽却流露出女性般的柔美与优雅的第二号,而阴暗感伤味较沈的第三号,流露牧歌气氛的华丽组曲的第四号,有威严威、作曲法很用心的第五号,隐藏阴暗热情的第六号。

评价

听着很舒服,很安静,特别是晚上一个人的时候。看着书,听着bach的音乐,思考一些问题。

烦躁的根源

发表于 2011-12-08   |   分类于 心情日志

世界如此美好,而我却如此烦躁!—— Unkown

最近几天小雨稀稀拉拉地下个不停,心情也随着天气变得阴郁起来。加之一大堆事情需要处理,还动辄就被中途打断,让人感到异常的烦躁。难怪一个同事以前在自己电脑上贴张字条,上面赫然写着“世界如此美好,而我却如此暴躁”,看来也是做事情的时候被中途打断的几近崩溃了。

午饭回办公室的路上,在雨中撑着一把大伞,突然一个念头闪过:人为何会烦躁?为什么会面对一件事情的时候表现出来极度不耐烦?

思前想后,烦躁源于对事情失去控制,不耐烦源于事情太过琐碎和单调。生活、工作都有太多的未知,当太多的未知一下子涌现在你的面前的时候,或者面对一件不知道从何处下手的事情的时候,人就会对事情失控,甚至逐渐地自己被事情控制。失去控制的事情越多,压力就越大,总感觉有很多的事情要做但又不知从何做起,再加上中途可能有紧急的事情介入而不得不中止手头正在进行的事情,这样持续下去就会引起情绪上的失控,变得烦躁起来。当有了烦躁情绪之后,见到那些琐碎、需要大量重复工作的时候,就会表现出极大不耐烦,甚至怒发冲冠。

烦躁一点好处都没有,既影响了工作效率,又影响了自己的心情,发火的时候也有可能影响同事之间的关系。

所以还是要保持一颗淡定的心。既然不耐烦、烦躁的根源源于对事情失去控制,要想改变,那就:

  • 面对一大堆事情的时候,要学会控制,让它们变的有条理。面对无从下手的事情的时候,要冷静分析,逐步推进。
  • 面对未知的明天,变化无常的世界!拒绝浮躁!保持淡定!

版本制作自动化方案

发表于 2011-08-21   |   分类于 项目管理

最近工作比较忙,游戏功能相关的代码就敲个不停,根本无暇去思考一些东西。趁着周末,整理下上周关于版本制作流程的优化的一些想法,有时间就立马去实现,希望能提高征途2项目组做版本的速度,省得每次程序兄弟每天等版本等的都想哭,还有做版本的兄弟,天天就重复着在一堆svn revision list里面挑来挑去,如此机械的工作,希望脚本可以帮他们完成一部分。既省了时间,也省了人力。只期望以后少加点班。

1. 问题

有两个svn分支,一个用于开发(主干Trunk),一个是对外发布的分支(BranchA)。根据要发布的内容列表,合并主干相关的revision到BranchA,有冲突解决之。

这里,要发布的内容列表就是taskid列表,某个要发布的功能都会对应唯一的一个taskid,代码提交的时候,提交日志里面一般都会标有相对于的taskid。制作版本的核心,就是根据这些taskid从主干代码提交日志里面去找相应的日志条目所对应的revision,然后合并到BranchA,合并过程中有冲突则找相应的程序予以解决。重复上面的操作,直到tasklist里面所有功能相关的revision都被合并入BranchA。然后提交,编译,测试。

2. 版本制作现状

手动维护一份未从Trunk分支合并到BranchA分支的revision列表,Trunk新提交的日志也只能手动复制下来,格式化处理一下,然后复制到未合并列表中。根据需求,将要发布的功能,一个一个在未合并列表里面手动查找,然后去合并,有冲突就通知相应的开发程序去解决冲突,合并好之后把相应的条目从未合并列表中删除。全部手动完成的,机械并且效率低下,并且很容易漏掉某条提交revision,实在于心不忍啊!

3. 解决方案

对于上述问题和现在版本制作现状,提出下面的解决方案。实现制作版本的脚本化,提高工作效率。

注意:版本制作的自动化,刚开始实施可能会有点问题。因为大家的提交日志,虽然包含了功能taskid,但格式千奇百怪,没有统一,虽然脚本可以识别大多数提交日志,但还是存在挑错revision的可能,对此也不必担心,在此提供了一个工具去检测这些不符合规格的提交日志,可以先手动去改下这些提交日志即可。希望以后svn提交日志的格式也符合指定的规格,这样更加利于版本制作的自动化。

3.1 版本工具脚本

config

用于配置一些相关参数,比如svn主干或分支的路径、未合并revision列表文件、task列表文件、版本制作日志等等。

getlog

根据指定的revision或revision1:revision2从主干上抽取相应的日志,并格式化处理之,格式化处理的文件有3种格式,下面会有详细介绍。

pickup

根据要合并的功能列表文件(tasklist)从未合并列表unmergelist中挑选出要合并的revision列表,并将其从未合并列表中删除。生产一个要合并的revision列表文件mergelist,和新的unmergelist文件。

merge

根据mergelist提供的revision,将主干Trunk中相应的revision合并到BranchA中,没有冲突就自动提交并继续下一个revision,有冲突就会停止并给出提示,此时可以让相应的提交者解决冲突。

resolve

冲突手动解决完后,执行该脚步,自动解决所有的冲突然后提交到BranchA,继续执行merge脚步直到结束。

3.2 三种版本日志格式

  • list revision数字列表文件。
  • xml xml格式的提交日志,提供了详细的提交信息,版本号、提交者、日期和时间、提交日志等。
  • txt 文本格式,只提供版本号、提交者和提交日志。

三种文件格式的转换

3.3 整体流程

制作版本的整体流程图如下:

  1. ready 准备阶段,设置配置。
  2. getlog 提取主干日志。
  3. pickup 挑版本。
  4. merge 合并。
  5. resolve 解决冲突。

整体流程

3.3.1 准备工作(ready)

执行所有脚本之前,请先做好准备工作。详细内容如下:

  • 准备好当前的未合并列表文件(unmergedlist)
  • 准备好要发布的功能列表文件(tasklist)
  • 创建一个工作目录,脚本生成的结果和中间结果都会在此目录下
  • 配置config脚步里面相关的参数,包含svn路径、工作目录等等相关信息。

准备工作

3.3.2 提取日志(getlog)

从主干中提取指定版本范围的提交日志。此操作根据需求可选。生产的gelostlist文件的路径还有版本范围都在config配置中可进行设置。

提取日志

3.3.3 挑选版本(pickup)

完成版本挑选过程,代替人工挑选版本的机械重复劳动。

挑选版本

3.3.4 合并版本(merge)

自动完成版本的合并工作,并提交至BranchA。有冲突就会停止,手动解决完冲突后继续执行该脚步。合并完所有mergelist里面的revision。

合并

3.3.5 解决冲突(resolve)

merge的时候发现冲突了,让相应的提交者修改完冲突后,执行该脚本,完成解决冲突的工作并提交至BranchA。然后继续执行merge脚本。

解决冲突

总结

希望上面的脚本可以实现版本制作的自动化,上面的内容不包含编译、打包、测试等过程。对于版本制作者而言,上面这些工作占据了大量的时间,并且非常容易出错。希望该方案可以解决版本制作中的一些问题。

每周一荐:五大云存储

发表于 2011-07-12   |   分类于 每周一荐

五大云存储对比






























































































































特性 Google Document(Google) Cloud Drive(Amazon) SkyDrive(Microsoft) iCloud(Apple) DropBox
空间容量 1G免费,可扩容 5G免费,可扩容 25GB免费 5GB免费 2GB免费
界面 简约 简约 略显臃肿 未上市 简约
操作 非常好 一般 一般
上传 Y Y Y
下载 Y Y Y
文档列表 Y Y Y
文档描述支持 Y Y
在线创建文档 Y Y
在线创建表格 Y Y
在线创建幻灯片 Y Y
在线创建图片 Y Y
分享 Y Y
版本管理 Y Y
GFW Y Y Y

Google Document

Google的东西不用多说,界面简约,功能强大。Google的产品是我的最爱,行事风格也是我所崇尚,但无奈已退出中国市场,很多功能用起来网络连接会时断时续(如Google Reader),更有甚者直接被GFW干掉,Google

Document,Pisca都不能幸免于GFW的淫威。

Google Document的功能如下:

  • Document List(文档列表):可以方便地存取在线创建的文档、表格、幻灯片或图片和上传的文件;并提供文件格式的转换;可以自由的下载;并可以为每个文档设定一些描述信息;自定义树状分类体系;随时随地分享自己的文档给合适的人群;提供一定的文档版本控制功能….
  • Documents(文档):在线创建并编辑文档,类似于WORD。
  • Spreadsheet(表格):在线创建和编辑表格,类似与EXCEL。
  • Presentations(幻灯片):在线创建和编辑幻灯片,类似与PowerPoint。
  • Drawings(画图):在线画图。

提供了1GB的免费空间,为了提升空间容量,需要支付一定的费用。

Cloud Drive

Amazon推出的的云存储Cloud Drive,提供5GB免费空间,扩容需要支付一定的费用。适合存储个人文档,但功能比起Google Document少了很多,但基本上也可以满足个人的存储需求。主要功能:

  • 可以上传、下载文档。
  • 提供自定义树状文档列表。
  • 无文件描述,无分享也成为非常不便之处,望以后可以看到Cloud Drive的改进。

SkyDrive

Microsoft的SkyDrive功能和Google Documents很是接近,用起来还算方便。但微软帝国,一统江湖,喜欢搞垄断,很多东西都略显臃肿这种行事风格,就不怎么喜欢了。

SkyDrive的功能如下:

  • 文档列表:
  • 在线创建WORD文档:
  • 在线创建EXCEL表格:
  • 在线创建PowerPoint演示文稿:
  • 在线创建Note笔记:
  • 群落共享:

SkyDrive在线创建文档基本上都可以和微软相应的Office软件无缝结合,所以经常使用Ms Office套件的人,很适合使用SkyDrive作为自己的云存储服务。群共享功能也是不错的,可以分享文档给群落指定的成员。也可以通过邮箱,SNS来共享文档。在中国网络环境下,推荐使用SkyDrive(无语的GFW,再次表示对其表示无奈)。

iCloud

Apple总是时尚的,创新与艺术的先锋。iCloud旨在为Apple的设备提供一个云存储,让一些数据都在云端,非常容易地将数据无缝地推送到你所拥有的Apple产品。有5GB的免费空间可以使用。至今还未上市,可以期待下。

DropBox

DropBox 就是一款非常好用的免费网络文件同步工具。当你在电脑A使用DropBox时,指定文件夹里所有文件的改动均会自动地”同步”到DropBox的服务器,当下次你在电脑B需要使用这些文件时,你只需登录你的账户,所有被同步的文件均会自动下载到B电脑中,同样,你在电脑B对某文件的修改,也会体现在电脑A上,而所有这一切均是全自动的,这样你的文件可以说是随时随地都能保持着最新了。

使用Dropbox前,需要先安装它的桌面客户端,DropBox 提供了Windows、Mac和Linux 的版本。可以跨平台实现文件同步,也可以共享文件。又是一个被GFW干掉的东西。

关于代码学习的一些看法

发表于 2011-07-08   |   分类于 关于学习

代码的三中类型

  • Product:产品代码,一个可用的产品代码。比如一些开源软件,还有当前工作整天面对的代码。
  • lib:库代码,对某一种功能封装的模块,一个工具库。
  • framework:框架代码,某种业务常用逻辑的封装,就形成改业务逻辑的框架库。比如,游戏客户端来说就是游戏引擎,MFC是window下的一个GUI框架,等等。

三种代码的编写与设计,抽象层次依次递增,对编写者能力的要求也依次递增。

代码发布的内容

无论是作为产品、库、还是框架,代码发布的形式一般都有下面的内容:

  • Source Code:源码
  • Product/Example/Demo:产品/示例/演示
  • Test:对源码的全面单元测试(现在项目的产品代码几乎是没有的,质量无法保证,只能靠功能测试)
  • Docs:分析/设计/代码/测试 文档。方便后来者学习。

代码开发流程

开发的正向流程:

分析 -> 设计 -> 编码 -> 测试

每一步的成果:

  • 分析:分析文档(需求分析,可行性分析,等)
  • 设计:整个架构设计文档
  • 编码:程序接口文档 + 源码
  • 测试:测试用例等
  • 最终成果:Source Code

如何学习代码:

理解程度:

★ 知其然。知道是干什么用的,有什么优缺点。对多数代码的理解都应该在该层次,以后做东西时候,可以权衡使用那个代码,并且作出合理选择,然后再进一步学习。这样,可以了解许多新技术。

★★ 可以熟练使用,但不知其所以然。对经常使用的代码,达到这个程度就可以了。

★★★ 知其然,并且知其所以然。不但要知道是干什么的,会熟练的使用,还要知道来龙去脉,整个代码的架构设计,都要了如指掌。非常感兴趣,或着非常重要的代码,可以进入深入的分析。加深理解。学习代码的封装技巧和架构。
根据理解程度的不同,方法肯定不同了:

对于有详细文档的代码:

★ 粗略浏览文档,特别注意介绍部分的阅读。不必计较细节。

★★ 详尽的学习文档,和例子源码的学习,了解如何正确的使用。某些部分文档没有描述清楚的,可以参考下源码,切勿深陷源码的泥潭,大体浏览即可。

★★★ 在上面的基础上,研究源码。可以正向,根据设计来研究代码,也可通过源码逆向出架构和设计。

对于没有文档或者文档简洁的一塌糊涂的代码:

★ 运行几个可执行的东西,看看这个玩意到底是个什么。没有可执行文件,那就只能大体浏览下源码了。看看文件里面的注释之类的就可以了。不必深究代码到底是什么。

★★ 要熟练使用该代码,必须要读代码了,先模仿已有的各种写法。若有不明白之处,可以问问别人,查查资料,或者跟进实现代码,看个究竟,也不要纠结于具体实现,只要保持自己在应用层就可以了。

★★★ 想要知道一切,只能深入研究代码了。

注意:上面的方法还是比较笼统的。需要进一步细化。

保存学习成果:笔记/博客/代码/知识库

学习的过程中,可能要产生些想法,或新知识,或自己写的一些试验代码。最好都保存下。也可以成博客,与其他人分享学习所得。讨论并进步。

手机也玩网游

发表于 2011-06-30   |   分类于 游戏开发

MMORPG多数只能在PC富客户端上运行,因为要考虑效率、网络速度、网络流量等各方面的因素,很难用手机等移动终端玩MMORPG的。昨天,听到一条消息,感觉想法还不错:用手机客户端登陆我们的MMORPG服务器,并且可以和PC客户端的玩家进行交互。想法虽然很好,但也有很多问题。手机客户端运行在智能手机上,下面的问题都都将会成为核心需要关心:

  • 网络流量:流量对于PC客户端来说,还好了,只要不是用无线上网的用户,应该不成问题。但手机就不一样了,那可都是白花花的银子,所以对于手机客户端与游戏服务器之间的通信,流量一定要进行很好的优化。

  • 网络连接:手机信号时有时无,假设你经过了一个信号不好的区域,怎么保持与游戏服务器的连接也成为一个问题,总不能像PC客户端那样,掉线了重新登录,这样的话用户体验将会很差的。

  • 手机CPU性能:手机的CPU和PC的CPU相差还是很大的,它的性能也要考虑。什么多线程、多进程、一些并发处理,不知道手机搞的定不。

  • 图像处理:PC客户端动辄上G的图像资源,各种各样的特效,这也将成为一个问题。

当然不仅限于上面的问题,还有很多问题需要考虑,毕竟是手机客户端,游戏内容肯定要比PC客户端缩水很多,并且对于手机客户端登陆的角色,服务器估计还应该和PC客户端登录的角色区别对待。一些实时交互,如:PK ,实现起来估计还是比较麻烦的。

每周一荐:《盗梦空间》《不能承受的生命之轻》

发表于 2011-01-01   |   分类于 每周一荐

Movie: 《Inception(盗梦空间)》

有时会感觉到自己的不真实,也许我们就在一个梦的世界里面,等着某年某月某日死去的时候,一觉醒来!发现原来是做了个梦!也许一觉醒来的时候,其实我们还在梦里...

《盗梦空间》又名《奠基》。是大导演克里斯托弗·诺兰继《蝙蝠侠前传2:黑暗骑士》后再次给我们带来的惊喜,本片将带观众游走于梦境与现实之间,被定义为’’发生在意识结构内的当代动作科幻片”。 由莱昂纳多·迪卡普里奥和奥斯卡影后玛丽昂·歌迪亚主演。7月16日在北美正式上映的《盗梦空间》连续三周蝉联北美票房冠军,不少激动难平的影迷都涌入IMDB打分,令分数高达9.3,其中高达四分之三的投票都给出满分,《盗梦空间》的IMDB排名眼下已经冲到第三,仅次于《肖申克的救赎》和《教父》。

片名“Inception”一词,在片中指的是通过梦境中的思想植入,改变他人原本根深蒂固的思想。以往在某些有超现实元素的悬疑作品里经常看到催眠高手用一通电话甚至一个眼神就把人催眠,然后指使他做任何事。实际上在现实中这是不可能办到的。人的心理拥有很强的防御机制,心理学上的研究表明催眠师很难让被催眠者做出违反他们自身意愿的举动,更别说让他们改变自己那些原先根深蒂固的想法了。所以《盗梦空间》在思想植入困难性上的设定,是有一定的合理性的。在人们所知的各种意识状态中,梦境是防御机制降到最低的一种状态,只有借由深层的梦境,才能真正完成思想改造。这是《盗梦空间》与以往这类题材的作品很大的区别,以往催眠师用一个眼神就搞定的事情,《盗梦空间》里的盗梦专家们用了一整部影片的篇幅去试图完成。是诺兰舍近求远吗,其实是前人异想天开罢了。

每周一荐

Book: 《不能承受的生命之轻》

  最沉重的负担压迫着我们,让我们屈服于它,把我们压倒在地上。但在历代的爱情诗中,女人总是渴望承受一个男性身体的重量。于是,最沉重的负担同时也成了最强盛的生命力的影像。负担越重,我们的生命越贴近大地,它就越真切实在。
  
相反,当负担完全缺失,人就会变得比空气还轻,就会飘起来,就会远离大地和地上的生命,人也就是一个半真的存在,其运动也会变得自由而没有意义。

  那么,到底选择什么了?是重还是轻?

                              -- 米兰·昆德拉

《不能承受的生命之轻》是米兰·昆德拉最负盛名的作品。小说描写了托马斯与特丽莎、萨丽娜之间的感情生活。但它不是一个男人和两个女人的三角性爱故事,它是一部哲理小说,小说从“永恒轮回”的讨论开始,把读者带入了对一系列问题的思考中,比如轻与重、灵与肉。

《不能承受的生命之轻》是一部意象繁复的书,其中装载了多种涵义:被政治化了的社会内涵的揭示、人性考察、个人命运在特定历史与政治语境下的呈现,以及对两性关系本质上的探索等。昆德拉将这些元素糅合在一起,写成一部非同凡响的小说——其中既有隐喻式的哲学思考,也有人的悲欢离合的生命历程的展现。

每周一荐

Refrence

  1. http://baike.baidu.com/view/2789436.htm
  2. http://book.douban.com/subject/1017143/

每周一荐: Google Dictionary,The Polar Express

发表于 2010-12-24   |   分类于 每周一荐

祝大家,圣诞快乐!

Software: Google Dictionary

浏览英文网页时,有个好的翻译工具,往往事半功倍。当然现在有很多词典软件,都是非常好用的,商业软件《金山词霸》,开源的就更多了,如《StarDict》就很不错的。而这些词典一般都会带屏幕划词功能的,鼠标轻轻移到相应的英文单词时,它就会自动弹出翻译后的结果。对看英文网页或书籍,是很有帮助的。

上面说的都是独立的软件,今天要推荐给大家的是Chrome的一个词典扩展应用:Google Dictionary。安装后,在Chrome浏览器的地址栏后面会有一个词典图标,点开后就可以手动敲入药查询的单词。当然也支持划词功能的,只要用鼠标左键选中要查询的单词即可。Google真是提供了不少好东西哦,大家慢慢发现吧。

Google Dictionary

Movie: The Polar Express

只有相信圣诞老人真的存在的人,才能听到小铃铛清脆的响声 -- 《极地快车》

明天就是圣诞节了,今天刚好平安夜。给大家推荐一个很经典的3D电影《The Polar Express:极地快车》,是一个关于圣诞前夕的电影,很久以前就看过了,印象非常深刻。童真永存!只有相信,它就存在!

《极地特快》,根据作家克里斯·范·奥斯柏格的同名冒险童话改编的,原作曾经荣获美国童话作品的最高荣誉奖项,凯迪克大奖。虽然原著仅有短短的三十几页内容,但华纳兄弟影业公司却将其拍摄成为了一部3D的动画巨作。

圣诞老人是圣诞节的象征,传说中的圣诞老人会在圣诞前夜驾着由驯鹿拉的雪橇,将礼物送到千家万户。然而,随着人类社会的不断进步,已经没有什么人再相信这个流传了很久的传说,没有人再相信圣诞老人的存在了。然而,小男孩克劳斯(乔什·哈切森配音)却不这么认为,尽管他的父母和周围的朋友都告诉他圣诞老人只不过是个虚构的人物,他本身根本就不存在,但克劳斯却坚持相信圣诞老人的存在,因此,克劳斯经常会遭到同伴的嘲笑,但他始终没有动摇他的信念。终于,克劳斯的坚持为他赢得了回报。在一个圣诞节的前夕,克劳斯在恍惚中睡着,忽然地板开始颤抖,桌上的器皿哗哗作响,随着汽笛声呜呜长鸣,一列神秘的火车停在门前,他紧张地打开房门,看见一个和蔼的列车长(汤姆·汉克斯配音)站在了他的面前。列车长邀请他乘车旅行,前往北极参加圣诞庆典,拜访传说中的圣诞老人。克劳斯孩惊讶极了,惴惴不安地答应下来。

在克劳斯登上火车后,他又发现更多的小伙伴,大家在一起十分的开心,经历了一场难忘的旅程。最终,火车到达打了终点站北极,孩子们欢快地跳下火车,北极城的圣诞庆典正式开始了,所有人都沉浸在欢乐的气氛中。这时,一个圣诞老人走到克劳斯面前,和蔼地询问他需要什么礼物,克劳斯嗫嚅地说,他只想要驯鹿身上的一个小铃铛。克劳斯如愿以偿的得到了想要的礼物,但在回家的时候,他却不小心弄丢了铃铛,他伤心极了。没想到第二天醒来,他发现小铃铛就完好无损地摆在圣诞树下。母亲看到后非常惊讶,不过她认为铃铛坏掉了。然而克劳斯心里却非常清楚,他知道只有相信圣诞老人真的存在的人才能听到小铃铛清脆的响声。

极地快车

Music: When Christmas Comes To Town

在影片《极地快车》中,当寻找圣诞老人的火车驶入北极圈,相信圣诞老人存在的小男孩和多才多艺的小女孩站在极地特快车厢的尽头,合唱了这首《When Chrismas Comes To Town》。童声唱出来的感觉,永远都是那么纯真而美好。孩子们天真的梦想,令人感动。孩子们神奇的想象,是不属于这个世界的。

试听:http://www.google.cn/music/song?id=S806c56359b278b9c&rview=share

歌词:

I'm wishing on a star
And trying to believe
That even though it's far
He'll find me Christmas Eve
I guess that Santa's busy
Cause he's never come around
I think of him
When Christmas comes to town
>
The best time of the year
When everyone comes home
With all this Christmas cheer
It's hard to be alone
Putting up the Christmas tree
With friends who come around
It's so much fun
When Christmas comes to town
>
Presents for the children
Wrapped in red and green
All the things I've heard about
But never really seen
No one will be sleeping on the night of Christmas Eve
Hoping Santa's on his way
>
When Santa's sleigh bells ring
I listen all around
The herald angels sing
I never hear a sound
And all the dreams of children
Once lost will all be found
That's all I want when Christmas comes to town
That's all I want when Christmas comes to town

Refrence

  1. http://www.hudong.com/wiki/%E3%80%8A%E6%9E%81%E5%9C%B0%E7%89%B9%E5%BF%AB%E3%80%8B
  2. http://xmasfun.com/Lyrics.asp?ID=97

每周一荐:卡农,Google Bookmarks

发表于 2010-12-18   |   分类于 每周一荐

Music:Pachabel’s Canon

卡农的作者,德国作曲家帕海贝尔(1653-1706),是巴洛克时期相当重要的作曲家,他的音乐影响了音乐之父巴赫。“卡农”是现今为止最受全世界的喜爱的古典音乐作品,曾称霸美国告示牌流行音乐排行榜长达百周以上。据统计,到目前为止世界上重新演绎的卡农版本达2000余种!如果帕海贝尔还在世的话,可能是全世界版税收入最高的音乐家。

卡农”并不是曲子的名字,而是一种音乐曲式,照字面上是“轮唱”的意思。简单说,就是有好几个声部的旋律重复出现,交织着演奏互相追随,让人有无退延伸的感觉。“卡农”全长仅五分钟,旋律简单仆实,却具备精密完美的音乐结构,十足表现出对位法的严谨与平衡,它不仅是一首男女老少雅俗共赏的曲子,也是初次接触古典音乐的最佳入门曲。  

复调音乐的一种,原意为“规律”。一个声部的曲调自始至终追逐着另一声部,直到最后……最后的一个小结,最后的一个和弦,它们会融合在一起,永不分离。缠绵极至的音乐,就像两个人生死追随。

D大调卡农—出自Johann Pachelbel ,直入心底的温柔,温柔到忧伤,让人幸福、感动、落泪…它包含了对世间所有的憧憬,执子之手,与子偕老,在旅途中,你我扶掖而行,像这缠绵的曲调一样相互追随。

Johann Pachelbel 是在妻子双双死于鼠疫后在意大利的威尼斯谱下这即动人又伤感的灵感,生死契阔这种穿透脊骨的颤抖,直达了乐人的灵魂,也直达了后人的灵魂。想起了简奥斯汀,流芳百世的不只是傲慢与偏见,还有傲慢与偏见大团圆的结局背后,缅怀与凭吊爱人一辈子的孤寂。天才是上天的歌者,就像荆棘鸟,只有刺入胸膛的刺,才能演绎出绝唱。

试听:http://www.google.cn/music/song?id=S1a90596bf3cde85b&rview=share

software:Google Bookmarks

现在好东西真是太多了,并且还都是免费的,感谢那些夜以继日为开源世界做出贡献的每一个人。

Google Chrome浏览器,是我最喜欢用的浏览器,界面简洁,功能强大,多进程处理,并且提供了许多扩展插件,非常好用。

今天给大家推荐一个“收藏夹”,就是Google Bookmarks(Google书签)。当我们浏览网页时候,遇到自己经常访问的或者比较感兴趣的网址,一般都会添加到收藏夹,以便以后方便访问。Google Bookmaks最大好处就是,当你将网页添加到收藏夹的时候,它不是存在本地电脑,而是存在Google的服务器上。这也就意味着,你可以实现在不同的电脑上,在不同的操作系统下,都有自己的Bookmaks。非常方便。特别是,上班上网,家里上网,有什么好的网页立马收藏起来,然后在任何一台计算机上,只要安装了Google Chrome + Google Bookmarks,你就可以方便访问了。下面是我的收藏夹@_@

Google Bookmarks

Refrence

  1. http://music.douban.com/subject/1463565/
  2. Google Chrominum开源代码:http://code.google.com/chromium/
  3. Google Bookmars:https://www.google.com/bookmarks
1…8910…13
David++

David++

123 日志
25 分类
65 标签
RSS
GitHub 知乎 微博 豆瓣
© 2007 - 2021 David++
由 Hexo 强力驱动
主题 - NexT.Pisces