首页 开放性思维

开放性思维

举报
开通vip

开放性思维4 开放性思维(1)      要具备开放性思维,就必须了解包括从CPU的执行方法,到Windows平台的运转,到你的程序的调试,最后到你要实现的功能这一整套的内容,只有做到这样,才能真正提高。如果你的知识范围很窄,什么也不了解,纯粹只了解语言,那你的思维就会很狭隘,就会只想到这个语言有这个函数,那个语言没有那个函数,这个C++有这个类,那个语言没有这个类等。而真正要做一个系统,思维一定要是全面的,游离于平台之上的系统和实际的应用软件是不现实的。 这种所谓理想化,已经有很多人提出是不现实的。所以,任何一个软...

开放性思维
4 开放性思维(1)      要具备开放性思维,就必须了解包括从CPU的执行方法,到Windows平台的运转,到你的程序的调试,最后到你要实现的功能这一整套的内容,只有做到这样,才能真正提高。如果你的知识范围很窄,什么也不了解,纯粹只了解语言,那你的思维就会很狭隘,就会只想到这个语言有这个函数,那个语言没有那个函数,这个C++有这个类,那个语言没有这个类等。而真正要做一个系统,思维一定要是全面的,游离于平台之上的系统和实际的应用软件是不现实的。 这种所谓理想化,已经有很多人提出是不现实的。所以,任何一个软件一定都是跟一个平台相关联的,脱离平台之上的软件几乎都是不能用的。这就必须对平台的本身非常了解。如果你有平台这些方面的知识,这样在思考一个问题的时候,能马上想到操作系统能提供些什么功能,我再需要做些什么,然后就能达到这个目标。这就是一种开放的思维。 在开放的思维下,我要做这个程序的时候,就会考虑怎么把它拆成几个独立的、分开的模块,最简单的,怎么把这个模块尽量能单独调用,而不是我要做个很大的EXE程序。一个很普通的程序员,如果他能够考虑到将程序分成好几个动态库,那么它的思维就已经有点开放性了,就已经不是MFC那些思维方式了。思考问题的时候能把它拆开,就是说,任何一个问题,如果你能把它拆开来思考,这就是简单的开放性思维。 但光会拆还是不够的,尽管有很多人连拆都不会。很多教科书中的程序,要解决问题的时候,就一个main,以后就是一个非常长的函数。这个main函数把所有的事情都解决了。如果连函数都不会分的话,则就是典型的封闭式思维。 这样的人不是没有,我是碰见过的。一些毕业生做的程序就有这种情况。所有的问题都由一个函数来解决。他就不会把它拆成几个模块。我问他,把一件工作拆成几件模块不是更清晰吗?他说,拆出来后的模块执行会更慢些。这就是很明显的封闭式思维和非封闭式思维的区别。 你看MFC的思路,那就是一层套一层的,要把所有的类都实现了,然后继承。它从CWnd以后,把所有的东西都包括进去了,组成一个巨型的类。这个巨型的类连界面到实现统统包括在里面。这时你怎么拆?根本就没有拆的方法,这就是封闭式思维。 如果一个系统、一个程序不能拆的话,则它基本上是做不好的。因为任何一个程序,如果它本身的复杂度越大,它可能出错的几率就越大。比如最简单的,哪个函数越大,则该函数的出错几率就越大。但如果把该函数分成很多小的函数,每个小的函数的出错几率就会很小,那么组合起来的整个程序的出错几率就很小。这就是为什么要把它拆出来的原因。 你用C++来实现的方法也是一样的。你要把它拆成许多的接口,如果能做到这样,你就能把它独立起来,甚至你能把它用动态库的方法去实现。动态库是现在的程序非常重要的一块。 1.4.1 动态库的重要性 有了动态库,当你要改进某一项功能的时候,你可以不动任何其他的地方,只要改其中你拆出来的这一块。这一块是一个动态库,然后把它改进,只需要把这个动态库调试好后,整个系统就可以进行升级。 但如果不是这样,你的整个程序是独立的文件,然后,另外的功能也是一个独立的文件,把这个程序编译成一个EXE,这就不是动态库的思想。按道理,我只改这个文件,其他系统也不需要进行调试。理论上看起来是一样的,而实际的结果往往就是因为你改动了这个文件,使得原来跑得很好的整个系统,现在不能跑了或者出现了很奇怪的现象。如何解释这个问题?事实上,这就涉及到编译器产生代码的方法,如果不了解这点的话,永远找不出问题来。 不存在没有BUG的编译器,包括VC,它也会产生编译上的问题。就算把这些问题都排除,你的软件也可能因为你加了某些功能,而影响了其他的文件,这个几率甚至非常大。这又得把你以前的测试工作重头再来一遍了。 动态库和EXE有什么不同呢? 动态库,包括它的代码和数据都是独立的,绝对不会跟其他的动态库串在一起。但是,如果你把所有功能放到一个EXE的工程里面,它的数据和代码就都是放到一起的,最后产生可执行程序的时候,就会互相干扰。而动态库就不会,这是由操作系统来保证的。从理论上看,动态库也是一个文件,我做这个工程的时候也是一个独立的文件,但它就会出现这样的问题。 1.4.2 程序 设计 领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计 流程 快递问题件怎么处理流程河南自建厂房流程下载关于规范招聘需求审批流程制作流程表下载邮件下载流程设计 程序设计流程其实很简单。第一步就是要拆出模块,如果你有开放性思维,则任何软件都非常容易设计。怎么设计呢?首先,拿到问题的时候,一定要明确目标;然后,对操作系统所提供哪些功能,程序怎么跟操作系统接口考虑清楚;接着,就是“砍”,把它分开,要把它拆成一个个的独立的模块;最后,再进一步去实现,从小到大地进行设计。 首先“抓”马上能进行测试的简单的模块,就像刚才说的成对编码那样,写任何一个部分都要进行调试,每个部分最好能独立进行调试。这样,每个部分都是分开的时候,它都有一定的功能。当把所要做的功能都实现后,组合起来,再进行通调就可以了。 决定一个软件的成败还是得看该软件设计的思维是否正确。我们也试过,即使你把那些所谓的软件写得再明白也没有用,如果实现这个软件的思路不对,则下面的工作根本就没有必要。 做软件时,一定要把注释写进去。这样写成的软件如果要改版的话,就很容易,因为你的整个系统是开放性的,那么你要增强某些功能的时候,都是针对其中的某个小项做改进,只要改它就是了。如果那个功能是全新的,则它本身就是一个独立块,只要去做即可。 现在很多开发工具都提供了自动化设计的功能,在生成新的程序的时候,只要设置好一些条件,就能自动产生程序的框架,这是一种趋势吗? 其实,这种方法不太适用通用软件的开发,针对某个公司做个ERP系统,可能会管用,但是那些方法拿不到通用软件里面来。通用软件绝对是一行一行地编码产生出来的,而且每一行编码的结果要达到一种可预测性。 什么叫可预测性?就是你写程序的时候,如果发现某一种症状,马上就能想到该症状是由于哪个地方出了错,而不是别的地方,也就是从症状就能判断出是哪些代码产生了问题,这就是可预测性。 如果你用MFC来“玩”的话,即使它出错了,你也可能不知道错误在哪里,它的可预测性就很差。做软件时,如果它的可预测性越高,解决问题的方法就越快。如果某用户说我出现什么状况了,你马上就可以断定错误,而不用去搜索源代码,就能想到程序可能是什么地方有问题,则这就是可预测性。 开放性思维(2)      1.4.3 保证程序可预测性       设计程序的时候,如何保证可预测性呢?答案就是我们上面所说的,所有的代码必须是经过测试的,必须是一步一步调试过的。只有经过你调试过的代码,你才能知道这个代码做某种运算的时候,它是怎样的执行方法。如果你不知道它的执行方法,你没进行过调试,则你就没有任何预测性。要达到可预测性,代码在汇编级是怎么执行的,你都得非常清楚。代码对哪个部分进行了什么操作,你都得知道。如果达不到这点,你的可预测性就很差。 比如,有些程序,你看它的C或者C++的源代码时,都看不出任何的问题。你看静态的程序时看不出任何问题,动态的程序调试你也看不出任何问题,这时,你必须把它的汇编打开,看一看它具体的操作,才能知道。所以说,开放性思维非常重要,你必须从最低层到最上层都要清楚。VC本身提供了一个汇编的调试环境,但是打开汇编后,如果你都看不懂,那你说怎么调呢?调什么?如果一个程序经过调试出来,则它会出错的地方你马上就会知道,只要看一些表现,就知道它有些什么问题。 比如说,我们做“大眼睛”的时候有个这样的现象。当要显示一个很大的图的时候,屏幕上只能显示其中的一小块,这样就可能需要拖动整个图像,但是拖的时候,如果在Windows 2000或Windows XP系统下就会发现,一旦我将图像拖到右下角时,图像就一下到左上角去了。该图像在右下角没有到底的时候还是显示正确的,但一旦到底,就把右下角转到左上角去了,如图1.2所示。 这是怎么回事?在Windows 98和Windows 95下,从来没有这个问题,而且如果图像不到右下角这一行,只差一点,它也不会出现这样的问题。为什么在Windows 98下没有这样的问题,在Windows 2000下会有呢?难道是我的程序有问题? 图1.2 图像显示问题示意图 这时,我就做了一个区域的比较,即看这个区域和整个这个图像的区域,是否中间运算有错误。但程序是调用Windows本身的API,我就怀疑是不是这个API出问题了。于是又重新写了一个区域相交部分,一步一步去查它,也没有任何问题,在任何情况下都是好的,但是到达右下角时,图像就会翻过来。经过以上两个步骤后,我就能确定,这是Windows操作系统的问题,Windows 98下没有这个问题,Windows 2000有,Windows XP也没有改过来。这是操作系统的原因,绝对不是软件的问题。 为什么会出现这样的问题?这是因为微软设计系统的那些家伙自以为聪明。只要图像的左上角是0,不管三七二十一,肯定往下面放,但是它的图像是正向位图,所有的位图设计的时候是倒过来的。而一个正向位图的高度是负的,否则它显示的时候是倒过来的。高度是负的时候,这个0发生了变化,从上向下的,那么他设计操作系统的时候,只看了0而没去看高度,这时他没做条件处理。他的想法是为了加速这个位图的速度,是做优化的结果,但结果就出错了,而到现在他也没有解决这个问题。 所以,可预测性在这里就显得很重要了。当出现这个问题时,能想到要么就是区域合并有问题,要么就是直接显示的这个函数有问题。区域合并的问题可以解决,我写个函数还不行吗?我一步一步地去跟踪,就能肯定这个API有没有问题,最后得出结论是有问题,也的确是它有问题。如果你不会调试的话,这个问题你永远也查不出来;如果你不了解操作系统,你永远不会想到操作系统会出问题;如果你不了解这个平台,你根本就不知道问题所在。所以,要成为一个高手,视角一定要从里到外,从点到面非常开阔。如果你局限在一个封闭的思维里,做系统就很难。 �
本文档为【开放性思维】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_001501
暂无简介~
格式:doc
大小:66KB
软件:Word
页数:7
分类:互联网
上传时间:2012-11-02
浏览量:72