摘要: “你体会的挺深刻的啊,”老C点点头,“你说的没有错,如果照这种方式写代码的确有些繁杂,因为这个工作不应当直接在编码过程中进行,而应当在设计过程中进行。要解决这个问题,需要引入新的工具——UML……等会再给你解释什么是UML……”制止住小P的发问,老C接着说,“确实,将 index放在list内部会造成种种不便,但是也有解决之道,比较经典的做法是将index从list中拿出来单独成为一个模块或class,这就是 iterator设计模式,我们以后再慢慢说……”他停顿了一下,“至于怎么良好的设计list,也有一些经验可以总结,同时也有一些业内的惯用法,这个我们接下来会更早讨论这个问题。”
“噢?那么我应当先学习什么呢?”小P问。
“嗯,先接触一下UML,”老C想想说道,“然后我给你讲讲一些关于线性表的惯用法或者习语。最后我们再来讨论如何将index与它的操作从list中拿出来。”
阅读全文
摘要: “哦?这样有什么好处呢?”小P问道。
“最大的好处是在语言层面对基于对象的编程方法给予了更多的支持,这样在开发的时候开发人员的智力负担会小很多……”老C停了一下,加重了语气,“我们做事情的目的是简化问题,任何新工具和新方法被发明的目的都是为了使问题看起来更简单一些,而不是使问题看起来更复杂。”老C想了想,“如果你了解了某种语言特性所针对的需求,你就可以更准确的使用这种语言特性而不会出现误解,同时也会说,啊,这样多好,不得不如此。”
阅读全文
摘要: 老 C接过彩笔,在白板中间从上到下画了一道线,左边写上思想,右边写上方法。“你先写写思想上的东西吧,”他喝了一口水,“思想是最重要的,我们需要通过学习语言来学习思想——只要学会了编程的思想,那么你再学习其他任何语言都会很快——要深入语言去学习,而不是只是使用语言。首先我们的第一个经验是,以数据为中心思考问题,而不是以活动为中心思考问题。”
“嗯,好像没有什么问题,如果我们以数据为中心思考问题,那么总会抽象出一些变化较少的,相对稳定的数据,将对数据的操作与数据捆绑到一个代码单元中,这样就可以有限度的复用已经开发的代码……”小P若有所思。
“呵呵,这只是一个好处,还有一些其他的好处,需要你在以后的编程中体会。”老C笑笑。这样白板的左边出现了第一个和第二个经验的总结。
阅读全文
摘要: “编译……运行……ok,我们的V1.01版本也好了。”老C又将所有文件拷贝到AppleGame_V1.01目录下。
“等等,”小P问道,“我看不出有什么实质性的变化啊,无非就是用一些static函数替换了原来的内容,换汤不换药啊。”
“呵呵,你看不出区别是因为你熟悉,如果你第一次看代码,你会觉得是在代码中看到QueMoveToNextChild(&(game->childrenQueue_))感觉好些,还是看到一堆鬼画符似的结构体点点点的感觉好?”老C解释道,“意图,这里强调意图,因为使用了函数你一眼就可以看出程序执行的意图,而如果是一堆代码的话,你还要反应半天;如果明白了意图,再去看代码,感觉会好很多——而且你可以根据代码意图提出更好的实现方法;同时这样也减少了代码中注释的工作量——一般在维护代码的时候人们很少去修改注释的;最后,如果你的具体实现需要被维护,这样也给维护代码的人提供了线索,无需他在源代码程序中找来找去……如果不小心还有可能将你的代码进行错误的修改……”他找到水杯,喝了一大口,“总之不要害怕小而短的函数,有时它们对阅读代码的人来说是很
阅读全文
摘要: “很遗憾,一般概念都伴随一些晦涩的术语,而一般人则视术语如猛虎,认为术语只属于学术,在一般的实际开发中没有什么用处——然而我们组织逻辑的最基本单位就是词汇,如果我们在思考、交流的时候连基本的词汇也无法理解,那么就根本谈不上什么思考和交流了——毕竟大多数人类还是靠语言进行思考的,除了少数天才使用图形和符号进行思考;同时术语也简化了我们交流的复杂度,比如我说PID,只要你理解了什么是PID这个概念,那么我就不用画出框图并解释这个带有比例、积分和微分环节的反馈系统,这样在行业内工作的人们可以方便的使用术语进行交流……罗嗦了这么多,只是希望你不要对这些晦涩的术语带有排斥的心理,而是要慢慢习惯它们,接受它们……虽然有些术语名字起得的确有些脑残……”老C喋喋不休的说道。
阅读全文
摘要: “叫我看看……”小P开始比较代码,“哦,在这个版本你用 game 代替了 queue,用 child 代替了 one, 但是有什么实质区别?”小P有些不解。
“嗯,这个是一个用问题域词汇编程而不是解决域词汇编程的例子,最大的优点是意图明确,容易理解,代码可读性强;另外一个好处是相对稳定——比如用 game 代替 queue——其一,评审代码的人可能会不明白这个queue是做什么的,为什么和下面的初始化函数格格不入,从而造成你频繁的回答大量的沟通性的问题,这将大大影响你生活的稳定性和质量;其二,如果我们将来——我是说如果——使用list数据结构来替换queue,避免了还要更改注释的风险——代码更新而注释陈旧,正是我们在进行项目开发时一个特别特别特别的n次幂严重的问题……而使用问题域的词汇,只要需求不发生变更,则我们就不需要修改什么而导致一些……代码人格上的分裂……”
阅读全文
摘要: “嗯,虽然理论上说只要保证你的代码缩进风格前后统一就可以了,但是在现实生活中我们不会也不允许千人千面,因为大家还是要互相交流的,让任何人去适应别人的缩进风格都是低效率和不公平的,因此形成了很多约定俗成的东西,哪怕它们不合理,但是它们的确形成了,而且你最好也遵守这样的规矩,如果你违背了这些东西,只能说明要么你是捣乱,要么你是绝对的新手。”
“哦?”
“这些有点像江湖黑话,如果你不是混江湖的,在打切口的时候闹了笑话,道上的兄弟一定会笑话你,新警察吧……”
“哈哈哈哈……”
“就我所知,目前江湖上有几种常用的黑话格式,K&R,BSD和GNU等,无论你采用哪一种,别人看了就知道你是道上混的,而且知道了你的山头,也就会高看你一眼……”
阅读全文
摘要: “我看不懂……”老P才看了30秒就决定放弃了。
“不会吧,我觉得我写得逻辑性还挺清楚的啊。”小P有些得意老C看不懂他写的代码,觉得可能自己写的逻辑过于高深了。
“……”老C沉默了半分钟,“这个不是C代码!”他肯定的说道,“所以我看不懂,也不想看懂。”
“?”小P有些奇怪,“这明明就是C语言写的代码啊,你看,我来给你解释解释……”
“哦,算了,这些根本不是C代码,我没有必要看懂。”
“那你说这些是什么?”小P有些不高兴了。
“这些是……”老C找着合适的形容词汇,“这些是猫爬过屏幕的脚印,我没有必要看懂脚印所代表的含义……”看到小P有些惊愕,然后开始有些生气,逐渐开始恼羞成怒了,老C赶快对他说:“呵呵,别生气了,我开玩笑的,不过,”老C的语气严肃起来,“这些的确是很糟糕的代码,哪怕它的算法多么高效,执行效率多么高,它都是糟糕的代码!”
阅读全文
摘要: “呵呵,”老C停止了和小P的说笑,觉得下午的疲倦一扫而空,“对了,刚才你在忙什么呢?”
“喔,我在做C++的练习题目。”
“是么?这么刻苦,厉害。什么题目?”
“呵呵,还挺有趣的,说是用C++的格式输出cout在屏幕上输出各种对齐的数据,用*号组成一个五角星,还有……”
“天,功不是这样用的,习不是这样学的……”老C有些囧,“扔掉那本烂书吧,没有这样学习C++的。”
阅读全文
摘要: “好像一段代码对其具体实现了解的越少,它的维护性就会越好?”小P有些猜测。
“呵呵,的确,那么我们通过各种不同的方法达到了什么样的看似相同的目的?”老C开始掉小P的胃口。
“信息隐藏?”小P不太确定。
“信息隐藏是手段,但不是目的。”老C很确定的否决掉小P,“我们达到的目的是控制问题的规模!”
老C觉得有必要给小P讲讲哲学:“我们写软件的目的是为了解决现实生活中的具体问题,没错吧?”
“没错,的确是这样,可是这个和C++有什么关系的?”小P觉得有些莫名其妙。
“那么你觉得使用高级的语言、先进的设计和合理的开发流程,问题的复杂度会降低吗?”
“那是啊,问题的复杂度当然会降低啊。”
“唉,错了,问题的复杂度不会降低的,因为问题的复杂度是客观存在,不会因为人主观的原因而改变!”
阅读全文