(续上篇)
“大鸟,我们继续讨论吧!”小菜很沮丧的说。
“小伙子,不会修收音机也是很正常的,没什么大不了的,用不着丧着一个脸。好象失恋一样,男人再强也要学会说‘不’。”大鸟安慰着说,“如果你的目标是要成为修理电器专家,那么你连收音机都不会修,那是很郁闷的事。但你现在的目标是什么?”
“我想成为软件架构师,编程专家。”小菜毫不含糊的说。
“就是,你的人生目标很明确,别的方面弱一些有什么关系呢。”大鸟继续说道,“现在电视节目《波士堂》里请来的嘉宾,全是中国的大企业家,许多人身家上亿,节目中都要求他们要有一个Boss秀,难道真的要把他们的才艺去和人家艺术家比吗,我看老板们唱歌虽很业余,但却也感觉得到他们那份认真和情趣——原来亿万富翁也是会唱歌,会跳舞,会食人间烟火的。至于他们歌唱得是不是跑调没有人在意的,明白吗?”
“我明白!,我一定要好好努力,成为编程专家。”,小菜说,“我们言归正传,你说我那程序用了反射后,还有什么需要修改的呢?”
“嗯,好!”大鸟清了清嗓子,开始上课,“如果你的程序再也不修改了,或者就是改改打折的额度和返利额度,那么你的代码是足够可以了。不过需求却是会不断产生的。比如说,现在这个程序是单机版的程序,如果需要商场多层楼的所有收银机都要使用,那该怎么办?”
“那用XML的配置文件就不合适了,应该用数据库会比较好!”
“那么老板听说了C/S架构的坏处,更新麻烦,不够安全等等,他也不是傻瓜,每次更新都需要针对每台机器部署,一次就半天,那些工作时间他是需要给程序员付薪水的。所以他提出要改为B/S架构,客户端用浏览器支持,你怎么办?”
“那需要改界面了,把应用程序改成Web程序。”
“就你现在的代码,改起来容易吗?”
“好象不容易,需要重新写,尽管可以复制一些代码过去,不过要重新写的东西还是很多的。”
“好,那你有没有发现,我说了这么多的需求变动,但系统中有一些东西一直没有变,是哪些?”
“我知道,是策略模式用到的那几个类,也就是正常收费、打折消费、返利消费等算法是没有变化的。”
“是呀,其实不是算法不会变,而是之前我们已经考虑它很多了,用了策略模式,用了反射技术使得它的变化相对稳定。你刚才也说,要把应用程序改为Web是需要复制粘贴的,可实际上,改改界面和这些算法有什么关系?”
“没有关系。”
“还有,把配置文件改为数据库访问,这其实是读取写入数据的操作,和算法又有什么关系呢?”
“也没有关系,我知道了,你是说,他们之间完全可以分离开,互不影响,改动其一,不要影响其它两者?哦,这是不是就是所谓的三层架构?”
“对,说得好,就是三层架构。三层架构或者分层开发说起来容易,在程序开发时的初学者还是有很多的误解。比如有些初学者以为,DBServer-WebServer-Client是三层架构,其实这是物理意思上的三层架构,和程序的三层架构没有什么关系。还有人以为,WinForm界面的窗体或者WebForm的aspx是最上一层,它们对应的代码后置(codebehind)文件Form.cs或aspx.cs是第二层,然后再有一个访问数据库的代码,比如ado.cs或SqlHelper.cs是最下一层,这其实也是非常错误的理解。再有,很多人认为MVC模式(Model-View-Controler)就是三层架构,这是比较经典的错误理解了。总之,尽管三层架构不算难,不过由于现在很多数书籍材料的讲解不透,所以让我们初学者都概念模糊,理解有误,非常的可惜的。”
“啊,我一直以为MVC就是三层架构呀,看来真的弄错了。那么三层具体是什么呢?”
“我不是已经告诉你了吗?你说说看,不管是应用程序WinForm,还是网页程序Aspx,它们主要用来干吗的?”
“用来界面显示和处理的,对的,它们可以看作是一层。叫界面层?”
“界面层这种叫法可以,或者叫UI层、表现层都可以。”
“访问配置文件或处理数据库是不是就是数据层了?”
“哈,三层架构是不是不难理解呀!说得很对,不过名称应该叫做数据访问层(Data Access Layer)或简称DAL层。”
“那么第三个层就是那些算法类了,这叫什么层呢?”
“这些算法是谁制定的?由谁来决定其变化?”
“当然是需求提出者,即软件系统所有者制定的,他们要改算法,我们开发就得改。这都是他们的业务算法呀!”
“哈,好,你说到了一个词,业务(Business)或叫商务,这其实是软件的核心,我们就是根据业务规则来开发软件提供服务的,所以这个层叫做业务逻辑层(Business Logic Layer)。不过它应该是中间的一层,介于另两者之间。”
“哦,所谓的三层开发,就是关于表现层、业务逻辑层和数据访问层的开发。那么他们之间的关系呢?”
“你需要知道,这其实只是大方向的分层,每个层中都有可能再细分为多个层次和结构。比如PetShop4,这是微软用它来展示.Net企业系统开发的能力的范例,PetShop尽管作为对大型软件系统开发的样例还是不够,但可以理解为儿童的智力玩具。不过对于初学编程的小菜你来说,玩具却是最好的学习道具。”
下面图源自Bruce Zhang博客
“第一次看到就完全看明白,那不就成天才了。学习它还需要慢慢来,以后再说。你现在应该对改写商场收银系统有点数了吧,应该怎么做呢?”
“应该原来的解决方案分为三个项目,一个UI项目,目前是WinForm的程序,一个BLL项目,用来把算法类都封装,还有一个DAL项目,用来访问配置文件。对吗?”
“嗯,差不多了,快去改吧,口说容易,实践中会有很多细节问题等着你去解决的。”
“好的,不过今天不行了,我前几天面试的一家公司给我Offer了,我明天就要去第一天上班,明晚我再去改写这个程序。”小菜说道。
“恭喜恭喜,就是你之前提到了那家做物流软件的公司吗?找到工作你得请客啦。”
“No problem,不过等我发工资吧。就是那一家。感觉公司还是很大的。”
“那你快去休息吧,第一天要好好表现哦!”
应一些回复朋友的要求,专门写了关于Web架构方面的文章,本篇还只是简单介绍。其实这些都不是新鲜的东西,如果你认为自己的确是小菜,我建议你去下载上一篇的代码来根据本篇的介绍去改写,编程是实践性很强的技术,理解不等于会应用的。