这里讲的不是一个一步一步的做麻将游戏执行教程,而是“设计”本身——探索,思考,执行,修改的过程,一步步地执行设计其实是最简单的那一部分,执行设计不叫设计,最多算个熟练工。
首先我们拿到一副麻将。第一步应该是分解“设计”这件事情本身,(注意,这里不是把麻将分成几类),分解出数据结构的那一层次设计。通常我们拿到一份这样的设计,直接开始选择数据结构——麻将是背包、堆栈、队列、红黑树?特别喜欢照本宣科,善于模仿的同学。而做过项目的同学,通常首先开始弄一个麻将接口、麻将类,然后增加打麻将方法。而我认为这都不是好的设计步骤。
传统开发人员对软件的理解是数据结构+算法,现代面向对象的开发人员的理解是抽象对象(继承/多态/泛型)出具体对象。它们的共同特点都是将现实世界直接抽象为程序设计,而每种开发人员所掌握的设计范式或习惯均有差异,为了团队不得不用框架及最佳实践来约束差异,减少理解和修改的成本。
但是,将现实世界直接抽象为程序设计到底是不是正确的思路呢?这个思路对开发人员无疑是最直观的,但长久在团队的约束下,久而久之就变成了对“最佳实践”的执行——而非设计,而执行则是最简单的那一部分,只会执行的程序员通常被戏称为码农。
那么麻将是背包、堆栈、队列还是红黑树呢?都不是,你会发现你学会了这么多数据结构,一点用处也没有,(传统的面向对象设计无疑能够解决这类问题,面向对象(比如;" /> 为什么这么多数据结构,都处理不了麻将?抑或说处理地非常别扭,不够完备。因为我们只是背诵了那些数据结构,就像背诵乘法口诀表,1乘以1到9乘以9,那么19乘以1234呢?没有人教你乘法过程——没有人教你对数据结构的设计。因为初学者在学习数据结构时是与算法相对的,会被理解为一个静态的结构。但是数据结构不是一个静态结构,不是像房型建筑就是那个样子。数据结构就包含了算法,我们应该将数据结构分解为集合与算法——数据结构的本质不是结构,而是集合与算法,这看起来很像面向对象中的对象——状态与方法。但它们之间还是有一定的差别。
为什么说数据结构的本质是集合与算法?回到麻将游戏上,不能用其它数据结构,不如我们设计一个麻将结构——麻将本身是一个集合,这个集合分为两大类。1)桌面上的麻将,2)人手上拿的13张麻将。
1)桌面上的麻将——它的最大值是恒定的,只能被随机delete不能被add,为空后游戏结束。(这就是3个算法) 2)人们手上的麻将——它的值始终是恒定的,随机add,选定delete,每delete一次,同时被从桌面麻将上add一个进来。(这是4个算法) 你说这是什么数据结构?第2个看起来有点像哈希表,因为要选定delete,要有索引,有索引就用哈希?No,这不是任何数据结构,这只是集合,以及对集合的操作。不是栈也不是树,不要让数据结构将你的思维限定住了
不应该将现实世界直接转化为计算机语言,而应该先抽象为数学语言(或者说数学语言的需求分析),然后进行技术选型,再转化为计算机语言——函数式也好,面向对象也好,动态语言也好,都是浮云。 |