开发者学堂课程【高校精品课-上海交通大学 -互联网应用开发技术:移动端App 4】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/76/detail/15782
移动端App 4
目录
一、Touchable
二、页面跳转
三、如何通过网络抓取数据
四、复用
一、Touchable
上节课讲到了布局,后面就要去处理这个事件,因为手机比较特殊,屏幕是触屏的,要去处理所有的触动的动作。触屏的动作有点击一下以及长摁的区别,在处理触屏这个动作的时候,常见的是点击一下。
比如在这里定义了button,onPress就是按下去,不叫onClick,因为在手机是用手指去摁,要去调用我们定义的方法,这个就是我们自己定义的方法,它就会弹窗。所以这里看到的四个按钮无论按哪一个,它都会弹窗去显示信息。
在react- native里面除了按钮可以按,其它的很多东西都可以摁,这一类东西统称为touchable,就是可以按的东西,它有能力去捕捉按下的姿势是什么,比如短摁还是长摁。
这里可以看到短摁和长摁分别是什么,它会按照识别出来的姿势去显示相应的东西。这里面列了一些算touchable的东西,在官网上也有。
TouchableHighlight是说摁的时候会高亮显示一下,TouchableOpacity是会变得透明一点,
TouchableNativeFeedback 是说它按照操作系统,比如安卓或者是ios的本地的特征的表现方式去显示,TouchableWithoutFeedback是说不带任何的反馈。
所以,后面有一个例子用到了这些不同的按钮和统称为touchable的东西,它们都会有被按下的时候,要去调用什么方法。这里的NativeFeedback就是按下会调用这个方法,但它会把背景设置成比如它如果是安卓的,它就会把背景设置成安卓特有的背景,否则的话就是空什么都没有,所以它只能在安卓手机上有这个效果。也可以是像下面的放这种按钮,如果是安卓的,它显示,只有安卓能跑,否则不显示。
TouchableOpacity点一下它会变暗,TouchableNativeFeedback(Android only) 是说它只能在安卓上跑,所以点它没有反应,Touchable with long press点一下就会出按下的这个按钮,但是长按它,就会说你长按这个按钮。所以这个代码不复杂,它的意思就是在说,已经提供了这些东西,你可以去用,它在响应不同的事件,可以理解为就像按web上的按钮,只不过它的onClick在手机上变成了onPress和onlongpress,就是有两种不同的动作。这些就是关于touchable的东西。
二、页面跳转
接下来讲页面的之间的跳转。它的页面之间的跳转和之前看到的微信上的页面跳转是类似的,它采用的是一种堆叠的方式在那里跳转。
要注意的是要用到react-navigation ,react-navigation是自己的工程,它有自己独立的网页,要在这个网页上看它的官方文档,要有安装的过程,因为安装上才能用。在使用的时候就要导入它,才能去使用。
在整个通过React-navigation做页面导航的时候,就要把所有的信息放到<NavigationContainer>里面,实际上微信走地跟这个路线一样,只不过这个信息是放在了它的配置信息里面,就是那个Js文件里面。这里面它是按堆叠的方式放了,例如,假如做了两个页面,一个叫做Home,对应的写了叫home的控件,另外一个是Profile,对应写的一个叫Profile的控件。那么在堆叠的Navigator里面,要依次把它列出来,列出来的同时要考虑它们互相之间怎么跳转,因为现在只是把它列出来了,它跳转的时候比如说在home的控件里面,当它在调用的时候,
这些信息可以传递进来。
它就会说上面有一个按钮,这个按钮一旦按下,就把它导航到Profile那去。带进去的Profile,比如说它带参数,就是我们说的Profile的props,就把name给传递进去,这就导航到了Profile。
当然这个工具不会这么简单,只是简单提一下。接下来看一个稍微复杂一点的例子,是官网上的例子。
这个例子是说我有一个叫HomeScreen的东西,它在创建的时候Navigation的信息会进来,然后我有个View,这个View是居中的。以下布局上的东西上节课提到过,不详细说明。再往下看,里面有个叫做HomeScreen的text,就显示了一行文本。然后有一个button,这个button在按下的时候,用传递进来的navigation去导航到details上。这个信息就在下面的app这里,可以看到它在定义NavigationContainer,里面有个Stack.Navigator,就是堆叠式的,这个navigator里面就会写Home对应的就是HomeScreen这个component,details对应的就是DetailsScreen这个component。
所以它的意思就是你按下这个按钮之后,它就跳转到了这个页面。跳转到这边,
再看这边,
这边也要接受navigation,那就是说这边路由的信息会传递过来,上面就会有一行字,有几个按钮,其中第一个按钮是说go to details again,就是往前再走一次,再次走到detail就注意它的navigation.push( ‘details’),就是它自己的页面就在这,它往里面像堆栈一样再加一层,还是它这个页面,就是details的页面,details对应的还是DetailsScreen,就相当于它又加进这一层。
如果按了这个按钮,就相当于在这个页面栈里,先是有HomeScreen,有DetailsScreen,然后又有一个DetailsScreen。
为什么要这么做?原因是底下有这些东西。
先看Go back,就是navigation.goBack往前回退一格,回退一个页面。刚说有三个页面,一个home,两个details。现在第二个details,go back就回到了第一个details。然后Go back to first screen instack,是说要一直pop到顶端为止,那它就直接回到了home,这个是相当于要通过navigation就是导航的信息直接跳到home对应的页面上。所以它是几种不同的情况,可以看到它跑起来的样子。
可以看到这是home的页面,因为在这里面一启动的时候,就会跑到Home里面来。
在这里,它是initialRouteName,所以它就跑到这个home页面,home页面,只有HomeScreen,是go to details这个按钮,点一下就会到Details,
Details就会有刚才看到这四个按钮。再点一下,它又进到Details。可以按回退的按钮看一下,回退一下,它还在第一层的Details,再回退一次,才到Home。然后再进去,再进一层,这个go back就回退到前一层,Go to home直接回到home。在这里可以可以进很多层,多点几次,直接到第一个页面,它就直接跳转过来了。
它跟home的区别就是这个地方是要让它跳到具体的某一页面上,
这个是说跳到一个开始。
这个是往前跳一页。
所以就是这样来的,可以看到也不是很复杂,就是用的navigation的各种各样的导航的方法的navigate,有go back 、pop to pop等等。手机上的验证的导航其实跟Web上的差异并不大,而且它还看起来更容易一些,因为它主要用到像回退这样的功能。这就是它有关导航的,更详细的要看具体的工程。
底下会有它动画的效果,这个比较简单,就是如果要使用这个动画的效果,它会持续多长时间,每一次就开始去把颜色变暗。
就是做这样的动作,这个按钮一旦按下,它会就不断地越变越暗。 除了点击这个按钮,点一下和长按之外,可能还有别的。
也就是说,你的手势上来之后,要去想一想谁在那里响应。
比如说在这里点这个按钮,这个按钮它当然可以响应,但是这个按钮是在View里,这个View本身要不要去响应,比如说最简单的道理,这是一个页面,点进去,你经常做这个动作是什么,比如说你想回到前面,就拿手在这划了一下,但拿手划的时候也未必非要放到空白地方去划,也可以在按钮上面,直接点住以后来回滑,当然我们没有做这个动作,没有这个事件,就是想象一下,如果是你的手放在这里来回做滑动,并不是这个按钮在响应,而是这个按钮在这个View里面的这个View整体在做响应。所以这里的问题,关于这个手势到底谁在响应它,就是这个意思。可以根据这个手势的动作去决定,到底要谁响应,以及怎么响应,滑动(上下滑还是左右滑),还是确实是在小工具上去做了一次点击的动作,
就是有这些东西,
它甚至还可以是多个同时的触点,比如两个手指同时一滑,它就放大或者缩小,去响应这样的东西,那响应这些东西,就要有相应的一些代码要去控制,
它就会在View上面,它们的属性里就会去说你要不要去作为这个事件响应的对象去启动这样的事件,这个有很多例子,就不展开讲解了,也不讲这个问题了,因为在模拟器上显示,可能大多数还是通过鼠标去展示的。
大概意思就是你可以通过在每一个View上面的属性里,去开启相应的东西,就来告诉它这个View要不要去对一些事件做响应,或者是拒绝响应,就是给它关掉。它的时机可以是在它被加载的时候或者上面确实有东西在做移动的时候,就是你想去移动它的时候再去响应。
这里面无论哪个方法,响应的这个事件里面包含了底下的信息,包含到底在动哪个东西,这个东西的ID是什么,它的位置在哪里,它在哪一页上等等,实际上就是在告诉你,它点的这一个动作到底在哪里发生的。
三、如何通过网络抓取数据
接下来看怎样通过网络抓取数据。
这个抓取数据的方式实际上是用的是fetch的api,其实它不是React-native自己带的东西,它就用的fetch的api,之前给大家专门讲过fetch api,
这里面也是一样,先是uil ,接着是什么方法,然后是请求头,最后是请求体。
同样的道理,跟react一样使用的是fetch,所以在跑的时候,后台要支持跨域操作,但好在我们后台就一个,所以它实际上可以支持跨域,你就拿到了你的数据。所以在网络通信的时候,要用到fetch,然后fetch回来的东西,就是这个response,如果你前端请求了,发的请求说这是一个json,它返你一个json,就直接取出来里面的内容,拿到它的内容,再去做其它处理,这个就和react是一样的。
当然有同学说要用View用Axios行不行,老师没试过,所以不知道行不行,大家可以试一试。
拿到fetch之后就可以去做处理,但是我们这种处理都是异步的,也就是说fetch完了之后,大家不要忘记它背后发生的是Ajax请求,它实际上是说发走之后,如果响应回来了,就在这里去做这样的处理。那也可以让它在这里等,就是在没有回来之前,我也可以让它一直等。下面是fetch的一个具体例子。
它就在往抓一个json数据回来的这里去显示。
它有两种写法,一种是写成一个函数,
一种是写成一个类,
写成类的时候,要在ComponentDidMount就是说这个对象被创建出来之后,马上去抓取。如果是写成函数,要用useEffect来进行抓取这个动作,ComponentDidMount和这个useEffect的效果是一样的,所以写类或者写函数都可以,它两种写法都支持。这是在抓取这个数据。
本质上它仍然是用的fetch的api。那如果不用fetch,用原生的也可以。
用原生的XMLHttpRequest,这个写法就跟之前在讲Ajax的时候讲的原生的写法是一模一样的,这也可以去抓取你想要的东西。所以React Native的东西很多,尤其是它除了React Native,还有前面讲的navigator。
所以助教给了例子,再把这个页面呈现出来。把助教的例子放到网上,可以去下载。有一句话在放的例子里面没有加,但是演示的时候,那句话是加了的,就是密码怎么样让它是以密文去显示的。
四、复用
接下来谈一谈复用的故事。我们以故事的方式来讲,谈一谈怎么复用,整个我们的专业都在讲这个东西是什么意思。做了两个版本,一个版本是比较详细的,有比较多的技术内容,但有很多内容可能现在还没有学,所以现在讲的是一个非专业版的,但是大家也能听懂它的意思。
这个故事就叫两个屌丝的成长史,借用一下李雷和韩梅梅这两个名人来讲。这是中学英语课本里面的名人,我们用它俩来讲一讲所谓的复用是怎么回事。
假设时间是从2003年开始,他们是交大软件学院的新生,大一进来就学C++编程,交大软件学院C++编程一开始就讲的是类,没有讲结构化编程。于是他们俩就知道怎么按对象来思考这个问题。所谓类是什么,类就是我们刚才讲的抽象的一个过程。无论是hello kitty、加菲猫还是哆啦a梦,它们都是猫,它们有一些共性的东西,提取出来就是猫。它们有一些个性化的东西,实例化一下就出来了具体东西,比如猫都有头,有胡须,具体到它们三个猫的颜色分别是白色、黄色和蓝色,把它们共同的属性提取出来就变成了一个类,类的目的是什么,就是无论是Hello kitty、加菲猫还是哆啦A梦都可以用猫的类的代码去实现它里面的功能,只不过它们的具体属性不一样,但是一些功能比如吃饭,睡觉,玩都可以去复用。这是第一次接触到软件复用这个概念。
到了大二学软件工程概论(当然现在推到大三了),就说以前的学生在学软件工程概论,在学面向对象的分析和设计,要学习基于构建的开发。所谓基于构建的开发是什么意思?假如要做login这个动作,会发现前端要有个login的controller,要有login的service,然后要有login的DAO,要去读用户名和密码,要有userEntoty,接着会发现把这些东西打包在一起,无论哪一个系统,它做login的时候都可以去复用这块代码。所以它就类似于盖房子的时候,砖头就相当于是类,如果你盖的房子是一扇墙的预制板盖出来的,每一块预制板都是若干块砖头拼起来的,那它就是构建。所谓构建就是若干个类合作完成了一个复杂的功能,这个功能可以被复用。这时候复用的就不是单个类,是整个构件。
所以未来的系统就像这里看到的它是靠构建以拼积木的方式拼出来的。现在实际上在做web开发的时候,走的就是这条路径,这个就是更大力度的服用,现在复用这个思想就已经深深地植入到他们俩的脑海里了。从第三方去找React框架,没有框架或者是后排的Spring这样的东西,本身就是在复用代码,是在把它们的代码在各种各样不同的应用里复用。
到大三,要学习操作系统,网络,还有企业金融系统开发,这时候就会发现要去复用更多的构建和框架。比如,在开发web系统的时候面临大量的数据,就会用到spark,就会用到Hadoop等等。这时候可以知道了,在更大力度上地复用,因为学校原来大三的暑期是有实习的,到企业里面实习就是做暑期大作业,他们俩受到这种互联网奇迹的那种鼓舞,就决定以后要从事这方面的行业,所以到大四的时候就去了著名的IT企业实习。最后他们在2007年毕业了,毕业之后两个人选择的路不一样,李雷创业了,假设说他开发了一个社交网站,这社交网站的域名是acme.com,一般大家喜欢用顶峰、顶点这样的随便举个例子,女孩子保守一点,韩梅梅就加入了一个叫someone的IT大厂,他俩就开始工作了。
所以在2007年的时候,他俩就利用在大学里的学习到的知识捞到了人生第一桶金。李雷通过快速构建网站,马上就有了大量注册用户。他为什么能快速地构建出来?原因是他用到了一些现成的东西,比如说买过来SOMEONE这个公司开发的一些构建,比如地图,导航这样的构建,然后快速在自己的系统里搭建了一下,这个网站就有了。韩梅梅也赚钱了,因为她在SOMEONE这个公司,她开发了比如地图导航的构建,叫OneX,这个OneX是个商业构建,就会有大量的人去买,买了以后,比如就给你这个jar包,把它组装到你的应用里面就可以去用了,它的销量非常的惊人,所以她也捞到了第一笔的奖金。所以他俩都挺高兴。这是第一年。
一年以后再来看,幸福总是伴随着烦恼。从李雷的角度来看,他要去维护SOMEONE公司的构建,因为他的应用是买来的,他从SOMEONE买了一些东西构建了他自己的网站,结果他发现SOMEONE有些构建不太可靠,经常导致他的系统出问题。系统一出问题,他就要给SOMEONE打电话,SOMEONE就会更新一个包发给他,他去重新部署一下。所以对他来说,这个过程很痛苦,像噩梦一般,也就是说,他觉得他陷入了系统维护的沼泽里面,因为只要这个东西有bug,他就必须得汇报给SOMEONE,SOMEONE就debug之后再把新的包给他,他再去部署,才能用它,他就觉得很累,所以他受不了。韩梅梅一样碰到一个问题,她卖OneX,一方面市场饱和了,她卖不动了,就捞不到更多的钱了。第二,OneX它本身就像别人说,如果有问题了,就要去debug,它的维护升级也很吓人。别人一报debug,她就去debug掉,她要通知所有的买家现在系统有升级了,就像windows一样,它经常不断地打补丁在升级。所以她觉得这对她来说也是个噩梦,她也受不了。
接下来两人就要去解决问题,他们就走了面向服务的架构。注意,刚才老师说的是李雷买了SOMEONE的一些构件,把它集成到了他的系统里,就像你现在拿着Spring的GPA去跑你的系统,如果说Spring的GPA发现有漏洞,你是把Spring的GPA的jar包拿下来打到了自己的应用里,如果别人告诉你是有漏洞的,你怎么办?要下载新的jar包,把东西全部替换掉,重新部署才行。这种方式看起来就比较弱。
SOA的架构是什么意思,但举一个例。你要盖你们家的房子,怎么盖?所谓基于构建的方式是说,不会盖厕所,买一个整体厕所回来,不会盖厨房,买一个整体厨房回来,当然这里就要求比如厨房和厕所都必须是3米高,如果一个3.5米高,一个3米高,楼就盖不到一起去,于是就出现了相当于软件里面的到底是donet的架构还是java的架构,不一样的东西是没法集成的。如果买了个整体厕所,买了个整体厨房,但是客厅你觉得可以自己搞,而且它要体现家里的个性,所以你自己盖了个客厅, 于是你就把你家快速构建起来了,缺点这个整体厕所有点问题马桶经常堵,堵了之后,搞得家里很麻烦,于是生产整体厨房的这一方就相当于韩梅梅这一端就说,要debug,里面要换个配件。于是它要到所有的买了这个整体厕所的人家去把这个配件换掉。它的问题在刚才讲的维护的问题,其次,盖这个家,要买整体厕所,要买整体厨房,价格也是比较高的。
换个思维就说,不买这个厕所,家里就盖客厅、卧室,能睡觉就行。以服务的方式去处理这个厨房和厕所,就是上厕所到公厕去上。当然,公厕人家会处理得比较好比较卫生,不是我们一般意义上的公厕。于是公厕的打扫,它漏不漏水,这些问题我一概不考虑。对于厨房,我可以到食堂去吃,不是拿一个厨房,拿一个厕所过来到我本地。换到软件系统里面,就是说你不要把那个jar包拿过来打到你的系统里去跑,而是你要通过一个URL去访问到这个服务,把你的东西给了它,它返你一个结果。这是面向服务的一个场景。
于是可以看到,有了面向服务的架构。李雷就说我不需要把SOMEONE的构件拿来绑定或者集成到我的系统里,而是我去调用这个服务,也就说我要有导航的服务,比如说oneX是导航的,我不需要拿到这个jar包,打到我的系统里面一起去部署,而是我去到oneX的某一个url上,每一次传递给它经度、纬度,它就直接把地图给我或者导航的路线给我。这样做的好处是导航功能是否完备,由SOMEONE来负责,我就不用管了。只要它把对应的url后面的实现更新掉了,我就能去调用它,就能享受到它已经更新过,质量提高过之后的服务。所以服务的质量完全靠SOMEONE去搞,去让它保证,就不用我每一次自己去拿到jar包,去绑定它。现在我只是租这个服务,而不是买,租总比买要便宜。比如调用一次一块钱,要买的话可能就要1万块钱买一套,那我调十万次才会跟它一样,但是,我还可以去省掉维护的代价,总的来说划得来。所以李雷觉得这方案不错。
从韩梅梅的角度来说,oneX的升级变得简单了,不用自己debug之后给所有的用户都要发,就在自己服务器这块部署一个服务,所有需要调用它的都来调用,如果要改,就改我这机器上的一个就可以。所以她把oneX就部署成为一个外部服务,只有一个实例,大家都来访问,我的维护也很简单,更重要的是我本来就卖不动了,但是按租金的方式就是细水长流,就一直有钱。所以他俩的事业可以继续,彼此之间都觉得省事。这就是所谓的面向服务的架构。从这里可以看到,它又在提高复用的级别,原来是说这个构件可以去卖,很多的应用都有一个,其实还是重复,现在是所有的应用都到这来调用,你们不要有自己的jar包了,这就是在高度地复用。所以他俩又很高兴,皆大欢喜。
再过去两年。李雷的acme.com已经变成中国顶尖网站之一,SOMEONE也出现了像OneX这样的,可能有超过一万个服务暴露在web上去给用户用,它有大量租金的收入。但是新的障碍又出现了。从李雷的角度来说,我有很多的数据,顶级网站有很多数据,这些数据造成了很大的负担,这是一个问题,就是存储的负担和处理的负担,我需要买大量的服务器去存下它。另外一方面有大量的注册用户,这个带来的压力导致系统负载受不了了,没有那么多服务器处理它,要买的话,价格很高,也就是说计算资源严重的不够,难以承受这个压力之重。
从韩梅梅的角度,所有的服务都放到了SOMEONE的大的集群里面,每开发一个服务就买了一些机器扔进去,时间长了发现这些服务满负荷运转的时候,计算资源是足够的,如果所有的服务不是都满负荷运转,就显得资源有点浪费,就是杀鸡在用牛刀。他俩一个是资源不够,一个是资源过剩,显得浪费。
于是就出现了云计算。云计算是说会把所有的资源,包括硬件的、软件的,全部通过互联网的方式暴露出来给用户去用。这里举的几个例子是在不同的几个著名的文章或者是组织发布的文件里面写的cloud的意义。
所谓的云计算,就是有一个云,实际上云不是一个虚拟的东西,就是有很大的机房,也没有大量的硬件和部署在上面的软件。 它们可以以互联网的方式被访问到,以服务的方式被访问,这就是我们看到的有专门租存储的云盘,有租虚拟机的阿里云,有租虚拟机之上的包含了数据库和其它中间件的PaaS层的,比如说谷歌应用引擎或者百度应用引擎,还有直接租服务的,比如说有很多的app,天气预报或者地图这样的服务的,那它们是说所有东西都在云里部署。云这个词有两个含义,第一个含义,它比较远,它确实离你很远,像阿里云就在杭州,第二个含义是你看不穿里面,也就是说它里面你说我要一个虚拟机,这个虚拟机是在哪个物理机上,这个虚拟机崩了之后是怎么迁移到哪个物理机上来保证我一直能用的,这些信息全部对你屏蔽掉,由云的提供商来处理,也就是说你使用的时候会非常省事。所以云会带来一些好处,细节就不谈了。
所以毕业N年之后,他俩有一次重要的会见。李雷说:把我的网站部署到SOMEONE的云里面去,这样我的计算资源就不用自己去买,只是租,价格会下来,而且到底这个服务器会不会崩,如果计算能力不够,怎么去扩展,这些复杂性问题全部扔给SOMEONE。而韩梅梅代表SOMEONE,她想的是:既然我们计算资源过剩,为什么不把它租出去,租给别人还能赚租金,比把它放着闲置去耗电要划得来。所以两人一拍即合。
现在这个应用就部署到了云里面去。两个人的目的都可以看到,他们都是在最大化自己的利润。从李雷的角度来说,我现在就是租不是买,我就不用自己买一大堆的服务器去存那些数据或者是应对大并发量,而且租的复杂性比买要小得多,因为买我还要自己建机房,自己维护。如果租,就把一系列的复杂的维护的工作全部丢给了云。韩梅梅就会去想,把这个资源租给他,就不让它在这白耗电,可以挣钱。但她还需要考虑一个问题,怎么样以比较合理的方式去租。比如,要根据所有的租户的负载情况,决定开多少个物理机,让多少去睡眠,多少去活跃。为了去满足它们的可靠性,比如说李雷的这个应用就需要在杭州的机房有一个虚拟机,在北京的机房有一个虚拟机,在上海机房有一个虚拟机,这样,碰上停电,地震,甚至打仗这样的事情,这个服务都可以提供不间断的服务。当然这些东西都要换算成钱去管李雷去收。不管如何,他俩都实现了利润的最大化,从这个角度去看,他们俩又再次合作了一番,所以大家都赚到了钱。
一直演化,演化到后来,李雷和韩梅梅就变成了高富帅和白富美。但是这个问题还没完,新的问题会出现。比如说云,天上的云就一朵一朵的,谁也没说一定要用SOMEONE的,天上到处都是云,凭什么一定要部署到SOMEONE里,我为什么不在亚马逊里部署一个,在阿里云里部署一个,在华为云里部署一个,我不跟具体的提供商绑定,将来它也不能去绑架我说价格谈不拢,它就停掉我的服务。所以,就有个问题,我应该怎么去部署,我的系统会显得更好,我要提高我的系统的可靠性,考虑到我对提供商的独立性,我怎么去部署会显得更合理。从韩梅梅的角度,她会想:虽然我有大量的资源,我可以租出去,但是租户太多了,我的资源如果消耗完了怎么办?我的服务的质量会不会下来,有没有可能跟其它的云去协作,共同提供这种服务。所以两个人还在想这个事情,这个故事就没完,于是就会看到有多个云之间的部署问题,以及云和云之间的协作问题。从这里可以看到,一旦讲到云,它还是在复用,只不过它现在复用的已经不纯粹是代码,它复用的是硬件以及在硬件上部署的那些系统级的软件,也就是说,我在这里面有几台服务器,上面可以跑若干个虚拟机,只要你付钱,我就把这虚拟机给你,你钱如果不够,你不付了,我就把资源收回,可以给别人用。这个机器如果崩了,我可以在另外空闲的机器上马上重启两个虚拟机去把你的虚机迁移过来。不管怎么说,它仍然是在复用。所以从头贯穿到尾,他们从大一进来,学习C++程序设计,一直到现在, 可以看到他们从学习到事业发展过程当中始终离不开复用这个词。
当然说的这个故事是瞎编的,但是我只是想说明一下整个复用为什么在我们的专业里面这么可靠。
最后想说这个故事的精髓是说教给你的知识大概有一半是错的,这个不稀奇,因为老师有自己的理解,技术也在进步,这是网上很有可能哈佛医学院的主任的杜撰声明,它的这个话的意思就是说,老师教你的知识有一半错了,问题是我们不知道哪一半错了。
意思就是说即便我滔滔不绝讲这么多,你也别全盘接受,你也可以去辩证地去看,也许我讲的有一些是不对的,就是你在实践的过程当中发现可能会有一些问题,就是千万不要教条。有一个笑话说李雷和韩梅梅有一天开车,结果碰上了车祸,就是出了个事故,这车翻到山底下去了,严重受伤,有一个人路过,看到了这个车就喊(中学课文里的经典对话):How are you。韩梅梅就条件反射式地回答:I am fine ,thank you, and you?这个人一听,还很好,他就走了。
就是说你在学习东西的时候,千万不要太教条,你自己的脑袋接受这些知识之后,你要去分析。
属于教条式的机械式的反应最后导致了不良的结果。所以我们讲这么多,谈了这么多的基本原则,这原则本身不能教条的去应用,还是要去灵活运用。