关于三种主流WEB架构的思考

本文探讨了三种主流WEB架构的特点及适用场景,包括基于文件、基于动作(MVC)和基于组件的开发方式。并对PHP开发现状及未来趋势进行了预测。

关于三种主流WEB架构的思考
Haohappy  haohappy AT msn.com
转载请注明来源:http://blog.youkuaiyun.com/haohappy2004

做WEB好几年了,各种语言和技术都稍有涉猎。今天心血来潮,突然想总结一下。其实不论什么技术,什么需求,通常WEB开发就是通过WEB前端管理一个或大或小或独立或分布式的关系型数据库,很多东西都是相通的。这里说的WEB架构,是指WEB应用开发中每种技术独有的资源组织形式(包括文件,数据库,HTTP请求处理等。注意并非OO的开发方式才有架构一说),也许说开发方式更容易让人理解一些。

以下想法主要以PHP实现为示例,但很多体会我想Java,.NET,Ruby开发者应该也很容易理解。最后是我对于刚面世就引起无数人关注的Delphi fo PHP的评测

WEB程序的架构基本上可以分成以下三类:

(一) 基于“WEB页面/文件”,例如CGI和PHP/ASP程序。程序的文件分别存储在不同的目录里,与URL相对应。当HTTP请求提交至服务器时,URL直接指向某个文件,然后由该文件来处理请求,并返回响应结果。

比如http://www.website.conm/news/readnews.php?id=1234

可以想像,我们在站点根目录的news目录下放置一个readnews.php文件。

这种开发方式最自然,最易理解,也是PHP最常用的方式。要注意产生的URL对搜索引擎不友好,不过你可以用服务器提供的URL重写方案来处理,例如Apache的mod_rewrite。

(二) 基于“动作”(Action)。这是MVC架构的WEB程序所采用的最常见的方式。目前主流的WEB框架像Struts、Webwork(Java),Ruby on Rails(Ruby),Zend Framework(PHP)等都采用这种设计。URL映射到控制器(controller)和控制器中的动作(action),由action来处理请求并输出响应结果。这种设计和上面的基于文件的方式一样,都是请求/响应驱动的方案,离不开HTTP。

比如 http://www.website.com/news/read/id/1234

可以想像在实际代码中,我们会有一个控制器newsController,其中有一个readAction。不同框架可能默认实现方式稍有不同,有的是一个Controller一个文件,其中有多个Action,有的是每个Action一个文件。当然这些你都可以自己控制,题外话。

这种方式的URL通常都很漂亮,对搜索引擎友好,因为很多框架都自带有URL重写功能。可以自由规定URL中controller、action及参数出现的位置。

另外,还有更直接的基于URL的设计方案,那就是REST。通过人为规定URL的构成形式(比如Action限制成只有几种)来促进网站之间的互相访问,降低开发的复杂性,提高系统的可伸缩性。REST对于Web Services来说是一个创新。

虽然本文讨论的是单个项目所采用的架构,而REST是为了解决网站之间的通讯问题,但REST的出现,会对单个项目的架构造成影响(很显然你在开发时就要构造规范的URL)。将来混用REST和MVC应该也是一种趋势。RoR提供很好的REST支持,Zend Framework也提供了Zend_Rest来支持REST,包括Server和Client。

(三) 基于“组件”(Component ,GUI设计也常称控件)、事件驱动的架构,最常见的是微软的.NET。基本思想是把程序分成很多组件,每个组件都可以触发事件,调用特定的事件处理器来处理(比如在一个HTML按钮上设置onClick事件链接到一个PHP函数)。这种设计远离HTTP,HTTP请求完全抽象,映射到一个事件。

事实上这种设计原本最常应用于传统桌面GUI程序的开发,例如Delphi,Java Swing等。所有表现层的组件比如窗口,或者HTML表单都可以由IDE来提供,我们只需要在IDE里点击或拖动鼠标就能够自动添加一个组件,并且添加一个相应的事件处理器。

这种开发方式有几个优点:

· 复用性 -代码高度可重用。

· 易于使用 -通常只需要配置控件的属性,编写相关的事件处理函数。

我个人也挺喜欢这种方式,PEAR就提供了相当强大的HTML_QuickForm,用于在页面添加表单元素及其事件处理函数,还可以与Smarty等模板引擎相结合。这对于项目开发来说是一个补充性的功能,在项目中的某些部份使用QuickForm,有时可以大大加快开发。

而完全基于组件和事件驱动的开发框架对于PHP来说也已经不新鲜,PRADO就是一个这样的框架,曾经得过Zend编程大赛的头奖。但目前来说很显然Prado所提倡的这种开发方式仍然没有被大部份PHP程序员所接受。为什么呢?

我觉得主要有以下两个问题:

(1)效率问题

这里指的不是开发效率,而是代码的执行效率。众所周知,正常情况下,PHP的执行是相当高效的。但是目前这种基于控件的框架效率都成问题。Prado本身提供了一个缓存机制来缓解这个问题。如果不采用缓存,可以说很多站点根本不能使用Prado这样的框架,比如门户网站,大型论坛等。

但ASP .NET不太一样,因为它是编译型的框架,最后生成的代码是编译生成的,不需要再次进行中间过程的诸多处理,所以在第一次执行之后速度会很快,执行效率还是很高的。 这是语言层次的功能,Prado无法通过代码层次的努力完全弥补。

(2)没有强大的IDE支持

设置控件的属性,添加其对应的事件处理器,看似简单,但控件多了,这也是个繁重的工作。.NET的强大就在于它把程序员从重复的工作中解放了出来,设置属性很方便,事件处理器也会自动添加。Prado目前没有这样的IDE支持。

总之,这种基于控件的框架比较适合于用户交互较多的,需要对页面中的很多组件设置不同处理操作,但对于性能要求不高的应用。另外,带有组件支持的框架通常对AJAX的支持都较好,比如.NET和Ruby on Rails。

综上,三种架构基本上可以代表目前的所有主流WEB开发方式,包括PHP,JavaEE,.NET,Ruby/RoR。

目前PHP开发的状况和未来的趋势:

平时做PHP比较多,特别总结一下PHP开发的趋势。目前在PHP开发中,我们最常用的是基于“文件”的架构,其实也就是一种“面向过程”的开发方式。通常我们写PHP程序的目的就是“快点上线,让程序跑起来”。而且大多数PHP程序员还要和HTML、CSS做近身搏斗,所以如果程序太抽象,调整视觉效果就比较困难。所以对于小项目,这是一个最好的选择。

但越来越多人认识到,面向对象和MVC框架更能促进代码的复用和分享,而且程序易于扩展,随着程序复杂性的增加这个趋势越明显。所以OO框架层出不穷。目前PHP框架当中最有前景的是CakePHP、Symphony和Zend Framework,各自拥有活跃的社区和庞大的用户群,都在快速成长当中。PHP的框架都避免走Java框架庞大臃肿的老路,致力于快速开发,而且主动模仿和吸收RoR这些优秀框架的新特性。随着PHP5的普及和这些框架的成熟,加上PHP原本开发社区的庞大人数,将来也许又会再产生出一些行业性的标准。

这种选择适合于中大型项目,特别是需要较大的团队合作和需要长期维护和二次开发情况。个人认为这是将来PHP开发的趋势。

而对于基于组件和事件驱动的开发方式大多数PHP程序员都不感兴趣。但是也有不少人在做这方面的努力,例如Codegear的Delphi for PHP,就吸引了很多人的关注。如果有强大的商业支持,也许将来在开发市场也会占一席之地。

我会在下一篇文章介绍D4P的新特性并作评测。

WEB开发的未来展望:

随着更贴近HTTP的REST的流行,我觉得像.NET和Java中的抽象组件的方式会受到冲击。因为这些组件并不如它们所承诺的那么方便。未来MVC+REST+RIA的模式应该会比较流行。

AJAX是一把双刃剑,尽管事件驱动的架构看起来非常适合于处理异步的请求(可以想像页面中存在几个组件,每个组件都可以触发异步请求,对应对服务器端的某个事件处理器,看起来是很理想的一个处理方式),但要为客户端自动生成良好的JavaScript代码是很不容易的,要满足各种浏览器的兼容性要求,还要能够自己进行扩展,以满足项目中千奇百怪的需求。 很多时候我更倾向于使用一些JS框架如Prototype来自己开发各种效果,而不是在服务器端生成。在服务器端生成JS的两个结果,一是对生成的代码不信任,二是人变傻,因为你并不知道真正发生了什么。

(一点牢骚也贴上来)
关于WEB开发的个人疑惑:

l 为了让开发更简单,我们不得不学习使用复杂的开发工具和框架,这到底是一个进步,还是退步?

l IDE让程序员变聪明还是变傻? 当我们在服务器代码里面就可以设计客户端界面,这是一个进步还是退步?

举个例子说,微软的ASP.NET AJAX,让我们可以在服务器端设计各种异步的控件。那么程序员甚至可以不会Javascript,不懂AJAX就设计出各种客户端效果。要是哪一天项目需要设计稍复杂的效果,靠IDE和框架无法自动完成,你要怎么办? 到这个时候再来学JS,也许就迟了。更可怕的是,技术在更新和淘汰,可能十年之后,你会发现自己除了各种IDE之后,真正精通的技术很少,脱离了IDE你写一个小程序都要查半天API手册,因为你平时都是依赖“自动补齐”来写代码的! 这样的情景,我想没有人愿意发生。

也许对于短期开发的项目来说,是一个进步,但对于程序员个人的成长来说,这并不是好事。对工具的依赖,导致了我们对于底层和核心技术的不求甚解,限制了个人的成长。




关于三种主流WEB架构的思考
Haohappy  haohappy AT msn.com
转载请注明来源:http://blog.youkuaiyun.com/haohappy2004

做WEB好几年了,各种语言和技术都稍有涉猎。今天心血来潮,突然想总结一下。其实不论什么技术,什么需求,通常WEB开发就是通过WEB前端管理一个或大或小或独立或分布式的关系型数据库,很多东西都是相通的。这里说的WEB架构,是指WEB应用开发中每种技术独有的资源组织形式(包括文件,数据库,HTTP请求处理等。注意并非OO的开发方式才有架构一说),也许说开发方式更容易让人理解一些。

以下想法主要以PHP实现为示例,但很多体会我想Java,.NET,Ruby开发者应该也很容易理解。最后是我对于刚面世就引起无数人关注的Delphi fo PHP的评测

WEB程序的架构基本上可以分成以下三类:

(一) 基于“WEB页面/文件”,例如CGI和PHP/ASP程序。程序的文件分别存储在不同的目录里,与URL相对应。当HTTP请求提交至服务器时,URL直接指向某个文件,然后由该文件来处理请求,并返回响应结果。

比如http://www.website.conm/news/readnews.php?id=1234

可以想像,我们在站点根目录的news目录下放置一个readnews.php文件。

这种开发方式最自然,最易理解,也是PHP最常用的方式。要注意产生的URL对搜索引擎不友好,不过你可以用服务器提供的URL重写方案来处理,例如Apache的mod_rewrite。

(二) 基于“动作”(Action)。这是MVC架构的WEB程序所采用的最常见的方式。目前主流的WEB框架像Struts、Webwork(Java),Ruby on Rails(Ruby),Zend Framework(PHP)等都采用这种设计。URL映射到控制器(controller)和控制器中的动作(action),由action来处理请求并输出响应结果。这种设计和上面的基于文件的方式一样,都是请求/响应驱动的方案,离不开HTTP。

比如 http://www.website.com/news/read/id/1234

可以想像在实际代码中,我们会有一个控制器newsController,其中有一个readAction。不同框架可能默认实现方式稍有不同,有的是一个Controller一个文件,其中有多个Action,有的是每个Action一个文件。当然这些你都可以自己控制,题外话。

这种方式的URL通常都很漂亮,对搜索引擎友好,因为很多框架都自带有URL重写功能。可以自由规定URL中controller、action及参数出现的位置。

另外,还有更直接的基于URL的设计方案,那就是REST。通过人为规定URL的构成形式(比如Action限制成只有几种)来促进网站之间的互相访问,降低开发的复杂性,提高系统的可伸缩性。REST对于Web Services来说是一个创新。

虽然本文讨论的是单个项目所采用的架构,而REST是为了解决网站之间的通讯问题,但REST的出现,会对单个项目的架构造成影响(很显然你在开发时就要构造规范的URL)。将来混用REST和MVC应该也是一种趋势。RoR提供很好的REST支持,Zend Framework也提供了Zend_Rest来支持REST,包括Server和Client。

(三) 基于“组件”(Component ,GUI设计也常称控件)、事件驱动的架构,最常见的是微软的.NET。基本思想是把程序分成很多组件,每个组件都可以触发事件,调用特定的事件处理器来处理(比如在一个HTML按钮上设置onClick事件链接到一个PHP函数)。这种设计远离HTTP,HTTP请求完全抽象,映射到一个事件。

事实上这种设计原本最常应用于传统桌面GUI程序的开发,例如Delphi,Java Swing等。所有表现层的组件比如窗口,或者HTML表单都可以由IDE来提供,我们只需要在IDE里点击或拖动鼠标就能够自动添加一个组件,并且添加一个相应的事件处理器。

这种开发方式有几个优点:

· 复用性 -代码高度可重用。

· 易于使用 -通常只需要配置控件的属性,编写相关的事件处理函数。

我个人也挺喜欢这种方式,PEAR就提供了相当强大的HTML_QuickForm,用于在页面添加表单元素及其事件处理函数,还可以与Smarty等模板引擎相结合。这对于项目开发来说是一个补充性的功能,在项目中的某些部份使用QuickForm,有时可以大大加快开发。

而完全基于组件和事件驱动的开发框架对于PHP来说也已经不新鲜,PRADO就是一个这样的框架,曾经得过Zend编程大赛的头奖。但目前来说很显然Prado所提倡的这种开发方式仍然没有被大部份PHP程序员所接受。为什么呢?

我觉得主要有以下两个问题:

(1)效率问题

这里指的不是开发效率,而是代码的执行效率。众所周知,正常情况下,PHP的执行是相当高效的。但是目前这种基于控件的框架效率都成问题。Prado本身提供了一个缓存机制来缓解这个问题。如果不采用缓存,可以说很多站点根本不能使用Prado这样的框架,比如门户网站,大型论坛等。

但ASP .NET不太一样,因为它是编译型的框架,最后生成的代码是编译生成的,不需要再次进行中间过程的诸多处理,所以在第一次执行之后速度会很快,执行效率还是很高的。 这是语言层次的功能,Prado无法通过代码层次的努力完全弥补。

(2)没有强大的IDE支持

设置控件的属性,添加其对应的事件处理器,看似简单,但控件多了,这也是个繁重的工作。.NET的强大就在于它把程序员从重复的工作中解放了出来,设置属性很方便,事件处理器也会自动添加。Prado目前没有这样的IDE支持。

总之,这种基于控件的框架比较适合于用户交互较多的,需要对页面中的很多组件设置不同处理操作,但对于性能要求不高的应用。另外,带有组件支持的框架通常对AJAX的支持都较好,比如.NET和Ruby on Rails。

综上,三种架构基本上可以代表目前的所有主流WEB开发方式,包括PHP,JavaEE,.NET,Ruby/RoR。

目前PHP开发的状况和未来的趋势:

平时做PHP比较多,特别总结一下PHP开发的趋势。目前在PHP开发中,我们最常用的是基于“文件”的架构,其实也就是一种“面向过程”的开发方式。通常我们写PHP程序的目的就是“快点上线,让程序跑起来”。而且大多数PHP程序员还要和HTML、CSS做近身搏斗,所以如果程序太抽象,调整视觉效果就比较困难。所以对于小项目,这是一个最好的选择。

但越来越多人认识到,面向对象和MVC框架更能促进代码的复用和分享,而且程序易于扩展,随着程序复杂性的增加这个趋势越明显。所以OO框架层出不穷。目前PHP框架当中最有前景的是CakePHP、Symphony和Zend Framework,各自拥有活跃的社区和庞大的用户群,都在快速成长当中。PHP的框架都避免走Java框架庞大臃肿的老路,致力于快速开发,而且主动模仿和吸收RoR这些优秀框架的新特性。随着PHP5的普及和这些框架的成熟,加上PHP原本开发社区的庞大人数,将来也许又会再产生出一些行业性的标准。

这种选择适合于中大型项目,特别是需要较大的团队合作和需要长期维护和二次开发情况。个人认为这是将来PHP开发的趋势。

而对于基于组件和事件驱动的开发方式大多数PHP程序员都不感兴趣。但是也有不少人在做这方面的努力,例如Codegear的Delphi for PHP,就吸引了很多人的关注。如果有强大的商业支持,也许将来在开发市场也会占一席之地。

我会在下一篇文章介绍D4P的新特性并作评测。

WEB开发的未来展望:

随着更贴近HTTP的REST的流行,我觉得像.NET和Java中的抽象组件的方式会受到冲击。因为这些组件并不如它们所承诺的那么方便。未来MVC+REST+RIA的模式应该会比较流行。

AJAX是一把双刃剑,尽管事件驱动的架构看起来非常适合于处理异步的请求(可以想像页面中存在几个组件,每个组件都可以触发异步请求,对应对服务器端的某个事件处理器,看起来是很理想的一个处理方式),但要为客户端自动生成良好的JavaScript代码是很不容易的,要满足各种浏览器的兼容性要求,还要能够自己进行扩展,以满足项目中千奇百怪的需求。 很多时候我更倾向于使用一些JS框架如Prototype来自己开发各种效果,而不是在服务器端生成。在服务器端生成JS的两个结果,一是对生成的代码不信任,二是人变傻,因为你并不知道真正发生了什么。

(一点牢骚也贴上来)
关于WEB开发的个人疑惑:

l 为了让开发更简单,我们不得不学习使用复杂的开发工具和框架,这到底是一个进步,还是退步?

l IDE让程序员变聪明还是变傻? 当我们在服务器代码里面就可以设计客户端界面,这是一个进步还是退步?

举个例子说,微软的ASP.NET AJAX,让我们可以在服务器端设计各种异步的控件。那么程序员甚至可以不会Javascript,不懂AJAX就设计出各种客户端效果。要是哪一天项目需要设计稍复杂的效果,靠IDE和框架无法自动完成,你要怎么办? 到这个时候再来学JS,也许就迟了。更可怕的是,技术在更新和淘汰,可能十年之后,你会发现自己除了各种IDE之后,真正精通的技术很少,脱离了IDE你写一个小程序都要查半天API手册,因为你平时都是依赖“自动补齐”来写代码的! 这样的情景,我想没有人愿意发生。

也许对于短期开发的项目来说,是一个进步,但对于程序员个人的成长来说,这并不是好事。对工具的依赖,导致了我们对于底层和核心技术的不求甚解,限制了个人的成长。




关于三种主流WEB架构的思考
Haohappy  haohappy AT msn.com
转载请注明来源:http://blog.youkuaiyun.com/haohappy2004

做WEB好几年了,各种语言和技术都稍有涉猎。今天心血来潮,突然想总结一下。其实不论什么技术,什么需求,通常WEB开发就是通过WEB前端管理一个或大或小或独立或分布式的关系型数据库,很多东西都是相通的。这里说的WEB架构,是指WEB应用开发中每种技术独有的资源组织形式(包括文件,数据库,HTTP请求处理等。注意并非OO的开发方式才有架构一说),也许说开发方式更容易让人理解一些。

以下想法主要以PHP实现为示例,但很多体会我想Java,.NET,Ruby开发者应该也很容易理解。最后是我对于刚面世就引起无数人关注的Delphi fo PHP的评测

WEB程序的架构基本上可以分成以下三类:

(一) 基于“WEB页面/文件”,例如CGI和PHP/ASP程序。程序的文件分别存储在不同的目录里,与URL相对应。当HTTP请求提交至服务器时,URL直接指向某个文件,然后由该文件来处理请求,并返回响应结果。

比如http://www.website.conm/news/readnews.php?id=1234

可以想像,我们在站点根目录的news目录下放置一个readnews.php文件。

这种开发方式最自然,最易理解,也是PHP最常用的方式。要注意产生的URL对搜索引擎不友好,不过你可以用服务器提供的URL重写方案来处理,例如Apache的mod_rewrite。

(二) 基于“动作”(Action)。这是MVC架构的WEB程序所采用的最常见的方式。目前主流的WEB框架像Struts、Webwork(Java),Ruby on Rails(Ruby),Zend Framework(PHP)等都采用这种设计。URL映射到控制器(controller)和控制器中的动作(action),由action来处理请求并输出响应结果。这种设计和上面的基于文件的方式一样,都是请求/响应驱动的方案,离不开HTTP。

比如 http://www.website.com/news/read/id/1234

可以想像在实际代码中,我们会有一个控制器newsController,其中有一个readAction。不同框架可能默认实现方式稍有不同,有的是一个Controller一个文件,其中有多个Action,有的是每个Action一个文件。当然这些你都可以自己控制,题外话。

这种方式的URL通常都很漂亮,对搜索引擎友好,因为很多框架都自带有URL重写功能。可以自由规定URL中controller、action及参数出现的位置。

另外,还有更直接的基于URL的设计方案,那就是REST。通过人为规定URL的构成形式(比如Action限制成只有几种)来促进网站之间的互相访问,降低开发的复杂性,提高系统的可伸缩性。REST对于Web Services来说是一个创新。

虽然本文讨论的是单个项目所采用的架构,而REST是为了解决网站之间的通讯问题,但REST的出现,会对单个项目的架构造成影响(很显然你在开发时就要构造规范的URL)。将来混用REST和MVC应该也是一种趋势。RoR提供很好的REST支持,Zend Framework也提供了Zend_Rest来支持REST,包括Server和Client。

(三) 基于“组件”(Component ,GUI设计也常称控件)、事件驱动的架构,最常见的是微软的.NET。基本思想是把程序分成很多组件,每个组件都可以触发事件,调用特定的事件处理器来处理(比如在一个HTML按钮上设置onClick事件链接到一个PHP函数)。这种设计远离HTTP,HTTP请求完全抽象,映射到一个事件。

事实上这种设计原本最常应用于传统桌面GUI程序的开发,例如Delphi,Java Swing等。所有表现层的组件比如窗口,或者HTML表单都可以由IDE来提供,我们只需要在IDE里点击或拖动鼠标就能够自动添加一个组件,并且添加一个相应的事件处理器。

这种开发方式有几个优点:

· 复用性 -代码高度可重用。

· 易于使用 -通常只需要配置控件的属性,编写相关的事件处理函数。

我个人也挺喜欢这种方式,PEAR就提供了相当强大的HTML_QuickForm,用于在页面添加表单元素及其事件处理函数,还可以与Smarty等模板引擎相结合。这对于项目开发来说是一个补充性的功能,在项目中的某些部份使用QuickForm,有时可以大大加快开发。

而完全基于组件和事件驱动的开发框架对于PHP来说也已经不新鲜,PRADO就是一个这样的框架,曾经得过Zend编程大赛的头奖。但目前来说很显然Prado所提倡的这种开发方式仍然没有被大部份PHP程序员所接受。为什么呢?

我觉得主要有以下两个问题:

(1)效率问题

这里指的不是开发效率,而是代码的执行效率。众所周知,正常情况下,PHP的执行是相当高效的。但是目前这种基于控件的框架效率都成问题。Prado本身提供了一个缓存机制来缓解这个问题。如果不采用缓存,可以说很多站点根本不能使用Prado这样的框架,比如门户网站,大型论坛等。

但ASP .NET不太一样,因为它是编译型的框架,最后生成的代码是编译生成的,不需要再次进行中间过程的诸多处理,所以在第一次执行之后速度会很快,执行效率还是很高的。 这是语言层次的功能,Prado无法通过代码层次的努力完全弥补。

(2)没有强大的IDE支持

设置控件的属性,添加其对应的事件处理器,看似简单,但控件多了,这也是个繁重的工作。.NET的强大就在于它把程序员从重复的工作中解放了出来,设置属性很方便,事件处理器也会自动添加。Prado目前没有这样的IDE支持。

总之,这种基于控件的框架比较适合于用户交互较多的,需要对页面中的很多组件设置不同处理操作,但对于性能要求不高的应用。另外,带有组件支持的框架通常对AJAX的支持都较好,比如.NET和Ruby on Rails。

综上,三种架构基本上可以代表目前的所有主流WEB开发方式,包括PHP,JavaEE,.NET,Ruby/RoR。

目前PHP开发的状况和未来的趋势:

平时做PHP比较多,特别总结一下PHP开发的趋势。目前在PHP开发中,我们最常用的是基于“文件”的架构,其实也就是一种“面向过程”的开发方式。通常我们写PHP程序的目的就是“快点上线,让程序跑起来”。而且大多数PHP程序员还要和HTML、CSS做近身搏斗,所以如果程序太抽象,调整视觉效果就比较困难。所以对于小项目,这是一个最好的选择。

但越来越多人认识到,面向对象和MVC框架更能促进代码的复用和分享,而且程序易于扩展,随着程序复杂性的增加这个趋势越明显。所以OO框架层出不穷。目前PHP框架当中最有前景的是CakePHP、Symphony和Zend Framework,各自拥有活跃的社区和庞大的用户群,都在快速成长当中。PHP的框架都避免走Java框架庞大臃肿的老路,致力于快速开发,而且主动模仿和吸收RoR这些优秀框架的新特性。随着PHP5的普及和这些框架的成熟,加上PHP原本开发社区的庞大人数,将来也许又会再产生出一些行业性的标准。

这种选择适合于中大型项目,特别是需要较大的团队合作和需要长期维护和二次开发情况。个人认为这是将来PHP开发的趋势。

而对于基于组件和事件驱动的开发方式大多数PHP程序员都不感兴趣。但是也有不少人在做这方面的努力,例如Codegear的Delphi for PHP,就吸引了很多人的关注。如果有强大的商业支持,也许将来在开发市场也会占一席之地。

我会在下一篇文章介绍D4P的新特性并作评测。

WEB开发的未来展望:

随着更贴近HTTP的REST的流行,我觉得像.NET和Java中的抽象组件的方式会受到冲击。因为这些组件并不如它们所承诺的那么方便。未来MVC+REST+RIA的模式应该会比较流行。

AJAX是一把双刃剑,尽管事件驱动的架构看起来非常适合于处理异步的请求(可以想像页面中存在几个组件,每个组件都可以触发异步请求,对应对服务器端的某个事件处理器,看起来是很理想的一个处理方式),但要为客户端自动生成良好的JavaScript代码是很不容易的,要满足各种浏览器的兼容性要求,还要能够自己进行扩展,以满足项目中千奇百怪的需求。 很多时候我更倾向于使用一些JS框架如Prototype来自己开发各种效果,而不是在服务器端生成。在服务器端生成JS的两个结果,一是对生成的代码不信任,二是人变傻,因为你并不知道真正发生了什么。

(一点牢骚也贴上来)
关于WEB开发的个人疑惑:

l 为了让开发更简单,我们不得不学习使用复杂的开发工具和框架,这到底是一个进步,还是退步?

l IDE让程序员变聪明还是变傻? 当我们在服务器代码里面就可以设计客户端界面,这是一个进步还是退步?

举个例子说,微软的ASP.NET AJAX,让我们可以在服务器端设计各种异步的控件。那么程序员甚至可以不会Javascript,不懂AJAX就设计出各种客户端效果。要是哪一天项目需要设计稍复杂的效果,靠IDE和框架无法自动完成,你要怎么办? 到这个时候再来学JS,也许就迟了。更可怕的是,技术在更新和淘汰,可能十年之后,你会发现自己除了各种IDE之后,真正精通的技术很少,脱离了IDE你写一个小程序都要查半天API手册,因为你平时都是依赖“自动补齐”来写代码的! 这样的情景,我想没有人愿意发生。

也许对于短期开发的项目来说,是一个进步,但对于程序员个人的成长来说,这并不是好事。对工具的依赖,导致了我们对于底层和核心技术的不求甚解,限制了个人的成长。




关于三种主流WEB架构的思考
Haohappy  haohappy AT msn.com
转载请注明来源:http://blog.youkuaiyun.com/haohappy2004

做WEB好几年了,各种语言和技术都稍有涉猎。今天心血来潮,突然想总结一下。其实不论什么技术,什么需求,通常WEB开发就是通过WEB前端管理一个或大或小或独立或分布式的关系型数据库,很多东西都是相通的。这里说的WEB架构,是指WEB应用开发中每种技术独有的资源组织形式(包括文件,数据库,HTTP请求处理等。注意并非OO的开发方式才有架构一说),也许说开发方式更容易让人理解一些。

以下想法主要以PHP实现为示例,但很多体会我想Java,.NET,Ruby开发者应该也很容易理解。最后是我对于刚面世就引起无数人关注的Delphi fo PHP的评测

WEB程序的架构基本上可以分成以下三类:

(一) 基于“WEB页面/文件”,例如CGI和PHP/ASP程序。程序的文件分别存储在不同的目录里,与URL相对应。当HTTP请求提交至服务器时,URL直接指向某个文件,然后由该文件来处理请求,并返回响应结果。

比如http://www.website.conm/news/readnews.php?id=1234

可以想像,我们在站点根目录的news目录下放置一个readnews.php文件。

这种开发方式最自然,最易理解,也是PHP最常用的方式。要注意产生的URL对搜索引擎不友好,不过你可以用服务器提供的URL重写方案来处理,例如Apache的mod_rewrite。

(二) 基于“动作”(Action)。这是MVC架构的WEB程序所采用的最常见的方式。目前主流的WEB框架像Struts、Webwork(Java),Ruby on Rails(Ruby),Zend Framework(PHP)等都采用这种设计。URL映射到控制器(controller)和控制器中的动作(action),由action来处理请求并输出响应结果。这种设计和上面的基于文件的方式一样,都是请求/响应驱动的方案,离不开HTTP。

比如 http://www.website.com/news/read/id/1234

可以想像在实际代码中,我们会有一个控制器newsController,其中有一个readAction。不同框架可能默认实现方式稍有不同,有的是一个Controller一个文件,其中有多个Action,有的是每个Action一个文件。当然这些你都可以自己控制,题外话。

这种方式的URL通常都很漂亮,对搜索引擎友好,因为很多框架都自带有URL重写功能。可以自由规定URL中controller、action及参数出现的位置。

另外,还有更直接的基于URL的设计方案,那就是REST。通过人为规定URL的构成形式(比如Action限制成只有几种)来促进网站之间的互相访问,降低开发的复杂性,提高系统的可伸缩性。REST对于Web Services来说是一个创新。

虽然本文讨论的是单个项目所采用的架构,而REST是为了解决网站之间的通讯问题,但REST的出现,会对单个项目的架构造成影响(很显然你在开发时就要构造规范的URL)。将来混用REST和MVC应该也是一种趋势。RoR提供很好的REST支持,Zend Framework也提供了Zend_Rest来支持REST,包括Server和Client。

(三) 基于“组件”(Component ,GUI设计也常称控件)、事件驱动的架构,最常见的是微软的.NET。基本思想是把程序分成很多组件,每个组件都可以触发事件,调用特定的事件处理器来处理(比如在一个HTML按钮上设置onClick事件链接到一个PHP函数)。这种设计远离HTTP,HTTP请求完全抽象,映射到一个事件。

事实上这种设计原本最常应用于传统桌面GUI程序的开发,例如Delphi,Java Swing等。所有表现层的组件比如窗口,或者HTML表单都可以由IDE来提供,我们只需要在IDE里点击或拖动鼠标就能够自动添加一个组件,并且添加一个相应的事件处理器。

这种开发方式有几个优点:

· 复用性 -代码高度可重用。

· 易于使用 -通常只需要配置控件的属性,编写相关的事件处理函数。

我个人也挺喜欢这种方式,PEAR就提供了相当强大的HTML_QuickForm,用于在页面添加表单元素及其事件处理函数,还可以与Smarty等模板引擎相结合。这对于项目开发来说是一个补充性的功能,在项目中的某些部份使用QuickForm,有时可以大大加快开发。

而完全基于组件和事件驱动的开发框架对于PHP来说也已经不新鲜,PRADO就是一个这样的框架,曾经得过Zend编程大赛的头奖。但目前来说很显然Prado所提倡的这种开发方式仍然没有被大部份PHP程序员所接受。为什么呢?

我觉得主要有以下两个问题:

(1)效率问题

这里指的不是开发效率,而是代码的执行效率。众所周知,正常情况下,PHP的执行是相当高效的。但是目前这种基于控件的框架效率都成问题。Prado本身提供了一个缓存机制来缓解这个问题。如果不采用缓存,可以说很多站点根本不能使用Prado这样的框架,比如门户网站,大型论坛等。

但ASP .NET不太一样,因为它是编译型的框架,最后生成的代码是编译生成的,不需要再次进行中间过程的诸多处理,所以在第一次执行之后速度会很快,执行效率还是很高的。 这是语言层次的功能,Prado无法通过代码层次的努力完全弥补。

(2)没有强大的IDE支持

设置控件的属性,添加其对应的事件处理器,看似简单,但控件多了,这也是个繁重的工作。.NET的强大就在于它把程序员从重复的工作中解放了出来,设置属性很方便,事件处理器也会自动添加。Prado目前没有这样的IDE支持。

总之,这种基于控件的框架比较适合于用户交互较多的,需要对页面中的很多组件设置不同处理操作,但对于性能要求不高的应用。另外,带有组件支持的框架通常对AJAX的支持都较好,比如.NET和Ruby on Rails。

综上,三种架构基本上可以代表目前的所有主流WEB开发方式,包括PHP,JavaEE,.NET,Ruby/RoR。

目前PHP开发的状况和未来的趋势:

平时做PHP比较多,特别总结一下PHP开发的趋势。目前在PHP开发中,我们最常用的是基于“文件”的架构,其实也就是一种“面向过程”的开发方式。通常我们写PHP程序的目的就是“快点上线,让程序跑起来”。而且大多数PHP程序员还要和HTML、CSS做近身搏斗,所以如果程序太抽象,调整视觉效果就比较困难。所以对于小项目,这是一个最好的选择。

但越来越多人认识到,面向对象和MVC框架更能促进代码的复用和分享,而且程序易于扩展,随着程序复杂性的增加这个趋势越明显。所以OO框架层出不穷。目前PHP框架当中最有前景的是CakePHP、Symphony和Zend Framework,各自拥有活跃的社区和庞大的用户群,都在快速成长当中。PHP的框架都避免走Java框架庞大臃肿的老路,致力于快速开发,而且主动模仿和吸收RoR这些优秀框架的新特性。随着PHP5的普及和这些框架的成熟,加上PHP原本开发社区的庞大人数,将来也许又会再产生出一些行业性的标准。

这种选择适合于中大型项目,特别是需要较大的团队合作和需要长期维护和二次开发情况。个人认为这是将来PHP开发的趋势。

而对于基于组件和事件驱动的开发方式大多数PHP程序员都不感兴趣。但是也有不少人在做这方面的努力,例如Codegear的Delphi for PHP,就吸引了很多人的关注。如果有强大的商业支持,也许将来在开发市场也会占一席之地。

我会在下一篇文章介绍D4P的新特性并作评测。

WEB开发的未来展望:

随着更贴近HTTP的REST的流行,我觉得像.NET和Java中的抽象组件的方式会受到冲击。因为这些组件并不如它们所承诺的那么方便。未来MVC+REST+RIA的模式应该会比较流行。

AJAX是一把双刃剑,尽管事件驱动的架构看起来非常适合于处理异步的请求(可以想像页面中存在几个组件,每个组件都可以触发异步请求,对应对服务器端的某个事件处理器,看起来是很理想的一个处理方式),但要为客户端自动生成良好的JavaScript代码是很不容易的,要满足各种浏览器的兼容性要求,还要能够自己进行扩展,以满足项目中千奇百怪的需求。 很多时候我更倾向于使用一些JS框架如Prototype来自己开发各种效果,而不是在服务器端生成。在服务器端生成JS的两个结果,一是对生成的代码不信任,二是人变傻,因为你并不知道真正发生了什么。

(一点牢骚也贴上来)
关于WEB开发的个人疑惑:

l 为了让开发更简单,我们不得不学习使用复杂的开发工具和框架,这到底是一个进步,还是退步?

l IDE让程序员变聪明还是变傻? 当我们在服务器代码里面就可以设计客户端界面,这是一个进步还是退步?

举个例子说,微软的ASP.NET AJAX,让我们可以在服务器端设计各种异步的控件。那么程序员甚至可以不会Javascript,不懂AJAX就设计出各种客户端效果。要是哪一天项目需要设计稍复杂的效果,靠IDE和框架无法自动完成,你要怎么办? 到这个时候再来学JS,也许就迟了。更可怕的是,技术在更新和淘汰,可能十年之后,你会发现自己除了各种IDE之后,真正精通的技术很少,脱离了IDE你写一个小程序都要查半天API手册,因为你平时都是依赖“自动补齐”来写代码的! 这样的情景,我想没有人愿意发生。

也许对于短期开发的项目来说,是一个进步,但对于程序员个人的成长来说,这并不是好事。对工具的依赖,导致了我们对于底层和核心技术的不求甚解,限制了个人的成长。




关于三种主流WEB架构的思考
Haohappy  haohappy AT msn.com
转载请注明来源:http://blog.youkuaiyun.com/haohappy2004

做WEB好几年了,各种语言和技术都稍有涉猎。今天心血来潮,突然想总结一下。其实不论什么技术,什么需求,通常WEB开发就是通过WEB前端管理一个或大或小或独立或分布式的关系型数据库,很多东西都是相通的。这里说的WEB架构,是指WEB应用开发中每种技术独有的资源组织形式(包括文件,数据库,HTTP请求处理等。注意并非OO的开发方式才有架构一说),也许说开发方式更容易让人理解一些。

以下想法主要以PHP实现为示例,但很多体会我想Java,.NET,Ruby开发者应该也很容易理解。最后是我对于刚面世就引起无数人关注的Delphi fo PHP的评测

WEB程序的架构基本上可以分成以下三类:

(一) 基于“WEB页面/文件”,例如CGI和PHP/ASP程序。程序的文件分别存储在不同的目录里,与URL相对应。当HTTP请求提交至服务器时,URL直接指向某个文件,然后由该文件来处理请求,并返回响应结果。

比如http://www.website.conm/news/readnews.php?id=1234

可以想像,我们在站点根目录的news目录下放置一个readnews.php文件。

这种开发方式最自然,最易理解,也是PHP最常用的方式。要注意产生的URL对搜索引擎不友好,不过你可以用服务器提供的URL重写方案来处理,例如Apache的mod_rewrite。

(二) 基于“动作”(Action)。这是MVC架构的WEB程序所采用的最常见的方式。目前主流的WEB框架像Struts、Webwork(Java),Ruby on Rails(Ruby),Zend Framework(PHP)等都采用这种设计。URL映射到控制器(controller)和控制器中的动作(action),由action来处理请求并输出响应结果。这种设计和上面的基于文件的方式一样,都是请求/响应驱动的方案,离不开HTTP。

比如 http://www.website.com/news/read/id/1234

可以想像在实际代码中,我们会有一个控制器newsController,其中有一个readAction。不同框架可能默认实现方式稍有不同,有的是一个Controller一个文件,其中有多个Action,有的是每个Action一个文件。当然这些你都可以自己控制,题外话。

这种方式的URL通常都很漂亮,对搜索引擎友好,因为很多框架都自带有URL重写功能。可以自由规定URL中controller、action及参数出现的位置。

另外,还有更直接的基于URL的设计方案,那就是REST。通过人为规定URL的构成形式(比如Action限制成只有几种)来促进网站之间的互相访问,降低开发的复杂性,提高系统的可伸缩性。REST对于Web Services来说是一个创新。

虽然本文讨论的是单个项目所采用的架构,而REST是为了解决网站之间的通讯问题,但REST的出现,会对单个项目的架构造成影响(很显然你在开发时就要构造规范的URL)。将来混用REST和MVC应该也是一种趋势。RoR提供很好的REST支持,Zend Framework也提供了Zend_Rest来支持REST,包括Server和Client。

(三) 基于“组件”(Component ,GUI设计也常称控件)、事件驱动的架构,最常见的是微软的.NET。基本思想是把程序分成很多组件,每个组件都可以触发事件,调用特定的事件处理器来处理(比如在一个HTML按钮上设置onClick事件链接到一个PHP函数)。这种设计远离HTTP,HTTP请求完全抽象,映射到一个事件。

事实上这种设计原本最常应用于传统桌面GUI程序的开发,例如Delphi,Java Swing等。所有表现层的组件比如窗口,或者HTML表单都可以由IDE来提供,我们只需要在IDE里点击或拖动鼠标就能够自动添加一个组件,并且添加一个相应的事件处理器。

这种开发方式有几个优点:

· 复用性 -代码高度可重用。

· 易于使用 -通常只需要配置控件的属性,编写相关的事件处理函数。

我个人也挺喜欢这种方式,PEAR就提供了相当强大的HTML_QuickForm,用于在页面添加表单元素及其事件处理函数,还可以与Smarty等模板引擎相结合。这对于项目开发来说是一个补充性的功能,在项目中的某些部份使用QuickForm,有时可以大大加快开发。

而完全基于组件和事件驱动的开发框架对于PHP来说也已经不新鲜,PRADO就是一个这样的框架,曾经得过Zend编程大赛的头奖。但目前来说很显然Prado所提倡的这种开发方式仍然没有被大部份PHP程序员所接受。为什么呢?

我觉得主要有以下两个问题:

(1)效率问题

这里指的不是开发效率,而是代码的执行效率。众所周知,正常情况下,PHP的执行是相当高效的。但是目前这种基于控件的框架效率都成问题。Prado本身提供了一个缓存机制来缓解这个问题。如果不采用缓存,可以说很多站点根本不能使用Prado这样的框架,比如门户网站,大型论坛等。

但ASP .NET不太一样,因为它是编译型的框架,最后生成的代码是编译生成的,不需要再次进行中间过程的诸多处理,所以在第一次执行之后速度会很快,执行效率还是很高的。 这是语言层次的功能,Prado无法通过代码层次的努力完全弥补。

(2)没有强大的IDE支持

设置控件的属性,添加其对应的事件处理器,看似简单,但控件多了,这也是个繁重的工作。.NET的强大就在于它把程序员从重复的工作中解放了出来,设置属性很方便,事件处理器也会自动添加。Prado目前没有这样的IDE支持。

总之,这种基于控件的框架比较适合于用户交互较多的,需要对页面中的很多组件设置不同处理操作,但对于性能要求不高的应用。另外,带有组件支持的框架通常对AJAX的支持都较好,比如.NET和Ruby on Rails。

综上,三种架构基本上可以代表目前的所有主流WEB开发方式,包括PHP,JavaEE,.NET,Ruby/RoR。

目前PHP开发的状况和未来的趋势:

平时做PHP比较多,特别总结一下PHP开发的趋势。目前在PHP开发中,我们最常用的是基于“文件”的架构,其实也就是一种“面向过程”的开发方式。通常我们写PHP程序的目的就是“快点上线,让程序跑起来”。而且大多数PHP程序员还要和HTML、CSS做近身搏斗,所以如果程序太抽象,调整视觉效果就比较困难。所以对于小项目,这是一个最好的选择。

但越来越多人认识到,面向对象和MVC框架更能促进代码的复用和分享,而且程序易于扩展,随着程序复杂性的增加这个趋势越明显。所以OO框架层出不穷。目前PHP框架当中最有前景的是CakePHP、Symphony和Zend Framework,各自拥有活跃的社区和庞大的用户群,都在快速成长当中。PHP的框架都避免走Java框架庞大臃肿的老路,致力于快速开发,而且主动模仿和吸收RoR这些优秀框架的新特性。随着PHP5的普及和这些框架的成熟,加上PHP原本开发社区的庞大人数,将来也许又会再产生出一些行业性的标准。

这种选择适合于中大型项目,特别是需要较大的团队合作和需要长期维护和二次开发情况。个人认为这是将来PHP开发的趋势。

而对于基于组件和事件驱动的开发方式大多数PHP程序员都不感兴趣。但是也有不少人在做这方面的努力,例如Codegear的Delphi for PHP,就吸引了很多人的关注。如果有强大的商业支持,也许将来在开发市场也会占一席之地。

我会在下一篇文章介绍D4P的新特性并作评测。

WEB开发的未来展望:

随着更贴近HTTP的REST的流行,我觉得像.NET和Java中的抽象组件的方式会受到冲击。因为这些组件并不如它们所承诺的那么方便。未来MVC+REST+RIA的模式应该会比较流行。

AJAX是一把双刃剑,尽管事件驱动的架构看起来非常适合于处理异步的请求(可以想像页面中存在几个组件,每个组件都可以触发异步请求,对应对服务器端的某个事件处理器,看起来是很理想的一个处理方式),但要为客户端自动生成良好的JavaScript代码是很不容易的,要满足各种浏览器的兼容性要求,还要能够自己进行扩展,以满足项目中千奇百怪的需求。 很多时候我更倾向于使用一些JS框架如Prototype来自己开发各种效果,而不是在服务器端生成。在服务器端生成JS的两个结果,一是对生成的代码不信任,二是人变傻,因为你并不知道真正发生了什么。

(一点牢骚也贴上来)
关于WEB开发的个人疑惑:

l 为了让开发更简单,我们不得不学习使用复杂的开发工具和框架,这到底是一个进步,还是退步?

l IDE让程序员变聪明还是变傻? 当我们在服务器代码里面就可以设计客户端界面,这是一个进步还是退步?

举个例子说,微软的ASP.NET AJAX,让我们可以在服务器端设计各种异步的控件。那么程序员甚至可以不会Javascript,不懂AJAX就设计出各种客户端效果。要是哪一天项目需要设计稍复杂的效果,靠IDE和框架无法自动完成,你要怎么办? 到这个时候再来学JS,也许就迟了。更可怕的是,技术在更新和淘汰,可能十年之后,你会发现自己除了各种IDE之后,真正精通的技术很少,脱离了IDE你写一个小程序都要查半天API手册,因为你平时都是依赖“自动补齐”来写代码的! 这样的情景,我想没有人愿意发生。

也许对于短期开发的项目来说,是一个进步,但对于程序员个人的成长来说,这并不是好事。对工具的依赖,导致了我们对于底层和核心技术的不求甚解,限制了个人的成长。




关于三种主流WEB架构的思考
Haohappy  haohappy AT msn.com
转载请注明来源:http://blog.youkuaiyun.com/haohappy2004

做WEB好几年了,各种语言和技术都稍有涉猎。今天心血来潮,突然想总结一下。其实不论什么技术,什么需求,通常WEB开发就是通过WEB前端管理一个或大或小或独立或分布式的关系型数据库,很多东西都是相通的。这里说的WEB架构,是指WEB应用开发中每种技术独有的资源组织形式(包括文件,数据库,HTTP请求处理等。注意并非OO的开发方式才有架构一说),也许说开发方式更容易让人理解一些。

以下想法主要以PHP实现为示例,但很多体会我想Java,.NET,Ruby开发者应该也很容易理解。最后是我对于刚面世就引起无数人关注的Delphi fo PHP的评测

WEB程序的架构基本上可以分成以下三类:

(一) 基于“WEB页面/文件”,例如CGI和PHP/ASP程序。程序的文件分别存储在不同的目录里,与URL相对应。当HTTP请求提交至服务器时,URL直接指向某个文件,然后由该文件来处理请求,并返回响应结果。

比如http://www.website.conm/news/readnews.php?id=1234

可以想像,我们在站点根目录的news目录下放置一个readnews.php文件。

这种开发方式最自然,最易理解,也是PHP最常用的方式。要注意产生的URL对搜索引擎不友好,不过你可以用服务器提供的URL重写方案来处理,例如Apache的mod_rewrite。

(二) 基于“动作”(Action)。这是MVC架构的WEB程序所采用的最常见的方式。目前主流的WEB框架像Struts、Webwork(Java),Ruby on Rails(Ruby),Zend Framework(PHP)等都采用这种设计。URL映射到控制器(controller)和控制器中的动作(action),由action来处理请求并输出响应结果。这种设计和上面的基于文件的方式一样,都是请求/响应驱动的方案,离不开HTTP。

比如 http://www.website.com/news/read/id/1234

可以想像在实际代码中,我们会有一个控制器newsController,其中有一个readAction。不同框架可能默认实现方式稍有不同,有的是一个Controller一个文件,其中有多个Action,有的是每个Action一个文件。当然这些你都可以自己控制,题外话。

这种方式的URL通常都很漂亮,对搜索引擎友好,因为很多框架都自带有URL重写功能。可以自由规定URL中controller、action及参数出现的位置。

另外,还有更直接的基于URL的设计方案,那就是REST。通过人为规定URL的构成形式(比如Action限制成只有几种)来促进网站之间的互相访问,降低开发的复杂性,提高系统的可伸缩性。REST对于Web Services来说是一个创新。

虽然本文讨论的是单个项目所采用的架构,而REST是为了解决网站之间的通讯问题,但REST的出现,会对单个项目的架构造成影响(很显然你在开发时就要构造规范的URL)。将来混用REST和MVC应该也是一种趋势。RoR提供很好的REST支持,Zend Framework也提供了Zend_Rest来支持REST,包括Server和Client。

(三) 基于“组件”(Component ,GUI设计也常称控件)、事件驱动的架构,最常见的是微软的.NET。基本思想是把程序分成很多组件,每个组件都可以触发事件,调用特定的事件处理器来处理(比如在一个HTML按钮上设置onClick事件链接到一个PHP函数)。这种设计远离HTTP,HTTP请求完全抽象,映射到一个事件。

事实上这种设计原本最常应用于传统桌面GUI程序的开发,例如Delphi,Java Swing等。所有表现层的组件比如窗口,或者HTML表单都可以由IDE来提供,我们只需要在IDE里点击或拖动鼠标就能够自动添加一个组件,并且添加一个相应的事件处理器。

这种开发方式有几个优点:

· 复用性 -代码高度可重用。

· 易于使用 -通常只需要配置控件的属性,编写相关的事件处理函数。

我个人也挺喜欢这种方式,PEAR就提供了相当强大的HTML_QuickForm,用于在页面添加表单元素及其事件处理函数,还可以与Smarty等模板引擎相结合。这对于项目开发来说是一个补充性的功能,在项目中的某些部份使用QuickForm,有时可以大大加快开发。

而完全基于组件和事件驱动的开发框架对于PHP来说也已经不新鲜,PRADO就是一个这样的框架,曾经得过Zend编程大赛的头奖。但目前来说很显然Prado所提倡的这种开发方式仍然没有被大部份PHP程序员所接受。为什么呢?

我觉得主要有以下两个问题:

(1)效率问题

这里指的不是开发效率,而是代码的执行效率。众所周知,正常情况下,PHP的执行是相当高效的。但是目前这种基于控件的框架效率都成问题。Prado本身提供了一个缓存机制来缓解这个问题。如果不采用缓存,可以说很多站点根本不能使用Prado这样的框架,比如门户网站,大型论坛等。

但ASP .NET不太一样,因为它是编译型的框架,最后生成的代码是编译生成的,不需要再次进行中间过程的诸多处理,所以在第一次执行之后速度会很快,执行效率还是很高的。 这是语言层次的功能,Prado无法通过代码层次的努力完全弥补。

(2)没有强大的IDE支持

设置控件的属性,添加其对应的事件处理器,看似简单,但控件多了,这也是个繁重的工作。.NET的强大就在于它把程序员从重复的工作中解放了出来,设置属性很方便,事件处理器也会自动添加。Prado目前没有这样的IDE支持。

总之,这种基于控件的框架比较适合于用户交互较多的,需要对页面中的很多组件设置不同处理操作,但对于性能要求不高的应用。另外,带有组件支持的框架通常对AJAX的支持都较好,比如.NET和Ruby on Rails。

综上,三种架构基本上可以代表目前的所有主流WEB开发方式,包括PHP,JavaEE,.NET,Ruby/RoR。

目前PHP开发的状况和未来的趋势:

平时做PHP比较多,特别总结一下PHP开发的趋势。目前在PHP开发中,我们最常用的是基于“文件”的架构,其实也就是一种“面向过程”的开发方式。通常我们写PHP程序的目的就是“快点上线,让程序跑起来”。而且大多数PHP程序员还要和HTML、CSS做近身搏斗,所以如果程序太抽象,调整视觉效果就比较困难。所以对于小项目,这是一个最好的选择。

但越来越多人认识到,面向对象和MVC框架更能促进代码的复用和分享,而且程序易于扩展,随着程序复杂性的增加这个趋势越明显。所以OO框架层出不穷。目前PHP框架当中最有前景的是CakePHP、Symphony和Zend Framework,各自拥有活跃的社区和庞大的用户群,都在快速成长当中。PHP的框架都避免走Java框架庞大臃肿的老路,致力于快速开发,而且主动模仿和吸收RoR这些优秀框架的新特性。随着PHP5的普及和这些框架的成熟,加上PHP原本开发社区的庞大人数,将来也许又会再产生出一些行业性的标准。

这种选择适合于中大型项目,特别是需要较大的团队合作和需要长期维护和二次开发情况。个人认为这是将来PHP开发的趋势。

而对于基于组件和事件驱动的开发方式大多数PHP程序员都不感兴趣。但是也有不少人在做这方面的努力,例如Codegear的Delphi for PHP,就吸引了很多人的关注。如果有强大的商业支持,也许将来在开发市场也会占一席之地。

我会在下一篇文章介绍D4P的新特性并作评测。

WEB开发的未来展望:

随着更贴近HTTP的REST的流行,我觉得像.NET和Java中的抽象组件的方式会受到冲击。因为这些组件并不如它们所承诺的那么方便。未来MVC+REST+RIA的模式应该会比较流行。

AJAX是一把双刃剑,尽管事件驱动的架构看起来非常适合于处理异步的请求(可以想像页面中存在几个组件,每个组件都可以触发异步请求,对应对服务器端的某个事件处理器,看起来是很理想的一个处理方式),但要为客户端自动生成良好的JavaScript代码是很不容易的,要满足各种浏览器的兼容性要求,还要能够自己进行扩展,以满足项目中千奇百怪的需求。 很多时候我更倾向于使用一些JS框架如Prototype来自己开发各种效果,而不是在服务器端生成。在服务器端生成JS的两个结果,一是对生成的代码不信任,二是人变傻,因为你并不知道真正发生了什么。

(一点牢骚也贴上来)
关于WEB开发的个人疑惑:

l 为了让开发更简单,我们不得不学习使用复杂的开发工具和框架,这到底是一个进步,还是退步?

l IDE让程序员变聪明还是变傻? 当我们在服务器代码里面就可以设计客户端界面,这是一个进步还是退步?

举个例子说,微软的ASP.NET AJAX,让我们可以在服务器端设计各种异步的控件。那么程序员甚至可以不会Javascript,不懂AJAX就设计出各种客户端效果。要是哪一天项目需要设计稍复杂的效果,靠IDE和框架无法自动完成,你要怎么办? 到这个时候再来学JS,也许就迟了。更可怕的是,技术在更新和淘汰,可能十年之后,你会发现自己除了各种IDE之后,真正精通的技术很少,脱离了IDE你写一个小程序都要查半天API手册,因为你平时都是依赖“自动补齐”来写代码的! 这样的情景,我想没有人愿意发生。

也许对于短期开发的项目来说,是一个进步,但对于程序员个人的成长来说,这并不是好事。对工具的依赖,导致了我们对于底层和核心技术的不求甚解,限制了个人的成长。




关于三种主流WEB架构的思考
Haohappy  haohappy AT msn.com
转载请注明来源:http://blog.youkuaiyun.com/haohappy2004

做WEB好几年了,各种语言和技术都稍有涉猎。今天心血来潮,突然想总结一下。其实不论什么技术,什么需求,通常WEB开发就是通过WEB前端管理一个或大或小或独立或分布式的关系型数据库,很多东西都是相通的。这里说的WEB架构,是指WEB应用开发中每种技术独有的资源组织形式(包括文件,数据库,HTTP请求处理等。注意并非OO的开发方式才有架构一说),也许说开发方式更容易让人理解一些。

以下想法主要以PHP实现为示例,但很多体会我想Java,.NET,Ruby开发者应该也很容易理解。最后是我对于刚面世就引起无数人关注的Delphi fo PHP的评测

WEB程序的架构基本上可以分成以下三类:

(一) 基于“WEB页面/文件”,例如CGI和PHP/ASP程序。程序的文件分别存储在不同的目录里,与URL相对应。当HTTP请求提交至服务器时,URL直接指向某个文件,然后由该文件来处理请求,并返回响应结果。

比如http://www.website.conm/news/readnews.php?id=1234

可以想像,我们在站点根目录的news目录下放置一个readnews.php文件。

这种开发方式最自然,最易理解,也是PHP最常用的方式。要注意产生的URL对搜索引擎不友好,不过你可以用服务器提供的URL重写方案来处理,例如Apache的mod_rewrite。

(二) 基于“动作”(Action)。这是MVC架构的WEB程序所采用的最常见的方式。目前主流的WEB框架像Struts、Webwork(Java),Ruby on Rails(Ruby),Zend Framework(PHP)等都采用这种设计。URL映射到控制器(controller)和控制器中的动作(action),由action来处理请求并输出响应结果。这种设计和上面的基于文件的方式一样,都是请求/响应驱动的方案,离不开HTTP。

比如 http://www.website.com/news/read/id/1234

可以想像在实际代码中,我们会有一个控制器newsController,其中有一个readAction。不同框架可能默认实现方式稍有不同,有的是一个Controller一个文件,其中有多个Action,有的是每个Action一个文件。当然这些你都可以自己控制,题外话。

这种方式的URL通常都很漂亮,对搜索引擎友好,因为很多框架都自带有URL重写功能。可以自由规定URL中controller、action及参数出现的位置。

另外,还有更直接的基于URL的设计方案,那就是REST。通过人为规定URL的构成形式(比如Action限制成只有几种)来促进网站之间的互相访问,降低开发的复杂性,提高系统的可伸缩性。REST对于Web Services来说是一个创新。

虽然本文讨论的是单个项目所采用的架构,而REST是为了解决网站之间的通讯问题,但REST的出现,会对单个项目的架构造成影响(很显然你在开发时就要构造规范的URL)。将来混用REST和MVC应该也是一种趋势。RoR提供很好的REST支持,Zend Framework也提供了Zend_Rest来支持REST,包括Server和Client。

(三) 基于“组件”(Component ,GUI设计也常称控件)、事件驱动的架构,最常见的是微软的.NET。基本思想是把程序分成很多组件,每个组件都可以触发事件,调用特定的事件处理器来处理(比如在一个HTML按钮上设置onClick事件链接到一个PHP函数)。这种设计远离HTTP,HTTP请求完全抽象,映射到一个事件。

事实上这种设计原本最常应用于传统桌面GUI程序的开发,例如Delphi,Java Swing等。所有表现层的组件比如窗口,或者HTML表单都可以由IDE来提供,我们只需要在IDE里点击或拖动鼠标就能够自动添加一个组件,并且添加一个相应的事件处理器。

这种开发方式有几个优点:

· 复用性 -代码高度可重用。

· 易于使用 -通常只需要配置控件的属性,编写相关的事件处理函数。

我个人也挺喜欢这种方式,PEAR就提供了相当强大的HTML_QuickForm,用于在页面添加表单元素及其事件处理函数,还可以与Smarty等模板引擎相结合。这对于项目开发来说是一个补充性的功能,在项目中的某些部份使用QuickForm,有时可以大大加快开发。

而完全基于组件和事件驱动的开发框架对于PHP来说也已经不新鲜,PRADO就是一个这样的框架,曾经得过Zend编程大赛的头奖。但目前来说很显然Prado所提倡的这种开发方式仍然没有被大部份PHP程序员所接受。为什么呢?

我觉得主要有以下两个问题:

(1)效率问题

这里指的不是开发效率,而是代码的执行效率。众所周知,正常情况下,PHP的执行是相当高效的。但是目前这种基于控件的框架效率都成问题。Prado本身提供了一个缓存机制来缓解这个问题。如果不采用缓存,可以说很多站点根本不能使用Prado这样的框架,比如门户网站,大型论坛等。

但ASP .NET不太一样,因为它是编译型的框架,最后生成的代码是编译生成的,不需要再次进行中间过程的诸多处理,所以在第一次执行之后速度会很快,执行效率还是很高的。 这是语言层次的功能,Prado无法通过代码层次的努力完全弥补。

(2)没有强大的IDE支持

设置控件的属性,添加其对应的事件处理器,看似简单,但控件多了,这也是个繁重的工作。.NET的强大就在于它把程序员从重复的工作中解放了出来,设置属性很方便,事件处理器也会自动添加。Prado目前没有这样的IDE支持。

总之,这种基于控件的框架比较适合于用户交互较多的,需要对页面中的很多组件设置不同处理操作,但对于性能要求不高的应用。另外,带有组件支持的框架通常对AJAX的支持都较好,比如.NET和Ruby on Rails。

综上,三种架构基本上可以代表目前的所有主流WEB开发方式,包括PHP,JavaEE,.NET,Ruby/RoR。

目前PHP开发的状况和未来的趋势:

平时做PHP比较多,特别总结一下PHP开发的趋势。目前在PHP开发中,我们最常用的是基于“文件”的架构,其实也就是一种“面向过程”的开发方式。通常我们写PHP程序的目的就是“快点上线,让程序跑起来”。而且大多数PHP程序员还要和HTML、CSS做近身搏斗,所以如果程序太抽象,调整视觉效果就比较困难。所以对于小项目,这是一个最好的选择。

但越来越多人认识到,面向对象和MVC框架更能促进代码的复用和分享,而且程序易于扩展,随着程序复杂性的增加这个趋势越明显。所以OO框架层出不穷。目前PHP框架当中最有前景的是CakePHP、Symphony和Zend Framework,各自拥有活跃的社区和庞大的用户群,都在快速成长当中。PHP的框架都避免走Java框架庞大臃肿的老路,致力于快速开发,而且主动模仿和吸收RoR这些优秀框架的新特性。随着PHP5的普及和这些框架的成熟,加上PHP原本开发社区的庞大人数,将来也许又会再产生出一些行业性的标准。

这种选择适合于中大型项目,特别是需要较大的团队合作和需要长期维护和二次开发情况。个人认为这是将来PHP开发的趋势。

而对于基于组件和事件驱动的开发方式大多数PHP程序员都不感兴趣。但是也有不少人在做这方面的努力,例如Codegear的Delphi for PHP,就吸引了很多人的关注。如果有强大的商业支持,也许将来在开发市场也会占一席之地。

我会在下一篇文章介绍D4P的新特性并作评测。

WEB开发的未来展望:

随着更贴近HTTP的REST的流行,我觉得像.NET和Java中的抽象组件的方式会受到冲击。因为这些组件并不如它们所承诺的那么方便。未来MVC+REST+RIA的模式应该会比较流行。

AJAX是一把双刃剑,尽管事件驱动的架构看起来非常适合于处理异步的请求(可以想像页面中存在几个组件,每个组件都可以触发异步请求,对应对服务器端的某个事件处理器,看起来是很理想的一个处理方式),但要为客户端自动生成良好的JavaScript代码是很不容易的,要满足各种浏览器的兼容性要求,还要能够自己进行扩展,以满足项目中千奇百怪的需求。 很多时候我更倾向于使用一些JS框架如Prototype来自己开发各种效果,而不是在服务器端生成。在服务器端生成JS的两个结果,一是对生成的代码不信任,二是人变傻,因为你并不知道真正发生了什么。

(一点牢骚也贴上来)
关于WEB开发的个人疑惑:

l 为了让开发更简单,我们不得不学习使用复杂的开发工具和框架,这到底是一个进步,还是退步?

l IDE让程序员变聪明还是变傻? 当我们在服务器代码里面就可以设计客户端界面,这是一个进步还是退步?

举个例子说,微软的ASP.NET AJAX,让我们可以在服务器端设计各种异步的控件。那么程序员甚至可以不会Javascript,不懂AJAX就设计出各种客户端效果。要是哪一天项目需要设计稍复杂的效果,靠IDE和框架无法自动完成,你要怎么办? 到这个时候再来学JS,也许就迟了。更可怕的是,技术在更新和淘汰,可能十年之后,你会发现自己除了各种IDE之后,真正精通的技术很少,脱离了IDE你写一个小程序都要查半天API手册,因为你平时都是依赖“自动补齐”来写代码的! 这样的情景,我想没有人愿意发生。

也许对于短期开发的项目来说,是一个进步,但对于程序员个人的成长来说,这并不是好事。对工具的依赖,导致了我们对于底层和核心技术的不求甚解,限制了个人的成长。




关于三种主流WEB架构的思考
Haohappy  haohappy AT msn.com
转载请注明来源:http://blog.youkuaiyun.com/haohappy2004

做WEB好几年了,各种语言和技术都稍有涉猎。今天心血来潮,突然想总结一下。其实不论什么技术,什么需求,通常WEB开发就是通过WEB前端管理一个或大或小或独立或分布式的关系型数据库,很多东西都是相通的。这里说的WEB架构,是指WEB应用开发中每种技术独有的资源组织形式(包括文件,数据库,HTTP请求处理等。注意并非OO的开发方式才有架构一说),也许说开发方式更容易让人理解一些。

以下想法主要以PHP实现为示例,但很多体会我想Java,.NET,Ruby开发者应该也很容易理解。最后是我对于刚面世就引起无数人关注的Delphi fo PHP的评测

WEB程序的架构基本上可以分成以下三类:

(一) 基于“WEB页面/文件”,例如CGI和PHP/ASP程序。程序的文件分别存储在不同的目录里,与URL相对应。当HTTP请求提交至服务器时,URL直接指向某个文件,然后由该文件来处理请求,并返回响应结果。

比如http://www.website.conm/news/readnews.php?id=1234

可以想像,我们在站点根目录的news目录下放置一个readnews.php文件。

这种开发方式最自然,最易理解,也是PHP最常用的方式。要注意产生的URL对搜索引擎不友好,不过你可以用服务器提供的URL重写方案来处理,例如Apache的mod_rewrite。

(二) 基于“动作”(Action)。这是MVC架构的WEB程序所采用的最常见的方式。目前主流的WEB框架像Struts、Webwork(Java),Ruby on Rails(Ruby),Zend Framework(PHP)等都采用这种设计。URL映射到控制器(controller)和控制器中的动作(action),由action来处理请求并输出响应结果。这种设计和上面的基于文件的方式一样,都是请求/响应驱动的方案,离不开HTTP。

比如 http://www.website.com/news/read/id/1234

可以想像在实际代码中,我们会有一个控制器newsController,其中有一个readAction。不同框架可能默认实现方式稍有不同,有的是一个Controller一个文件,其中有多个Action,有的是每个Action一个文件。当然这些你都可以自己控制,题外话。

这种方式的URL通常都很漂亮,对搜索引擎友好,因为很多框架都自带有URL重写功能。可以自由规定URL中controller、action及参数出现的位置。

另外,还有更直接的基于URL的设计方案,那就是REST。通过人为规定URL的构成形式(比如Action限制成只有几种)来促进网站之间的互相访问,降低开发的复杂性,提高系统的可伸缩性。REST对于Web Services来说是一个创新。

虽然本文讨论的是单个项目所采用的架构,而REST是为了解决网站之间的通讯问题,但REST的出现,会对单个项目的架构造成影响(很显然你在开发时就要构造规范的URL)。将来混用REST和MVC应该也是一种趋势。RoR提供很好的REST支持,Zend Framework也提供了Zend_Rest来支持REST,包括Server和Client。

(三) 基于“组件”(Component ,GUI设计也常称控件)、事件驱动的架构,最常见的是微软的.NET。基本思想是把程序分成很多组件,每个组件都可以触发事件,调用特定的事件处理器来处理(比如在一个HTML按钮上设置onClick事件链接到一个PHP函数)。这种设计远离HTTP,HTTP请求完全抽象,映射到一个事件。

事实上这种设计原本最常应用于传统桌面GUI程序的开发,例如Delphi,Java Swing等。所有表现层的组件比如窗口,或者HTML表单都可以由IDE来提供,我们只需要在IDE里点击或拖动鼠标就能够自动添加一个组件,并且添加一个相应的事件处理器。

这种开发方式有几个优点:

· 复用性 -代码高度可重用。

· 易于使用 -通常只需要配置控件的属性,编写相关的事件处理函数。

我个人也挺喜欢这种方式,PEAR就提供了相当强大的HTML_QuickForm,用于在页面添加表单元素及其事件处理函数,还可以与Smarty等模板引擎相结合。这对于项目开发来说是一个补充性的功能,在项目中的某些部份使用QuickForm,有时可以大大加快开发。

而完全基于组件和事件驱动的开发框架对于PHP来说也已经不新鲜,PRADO就是一个这样的框架,曾经得过Zend编程大赛的头奖。但目前来说很显然Prado所提倡的这种开发方式仍然没有被大部份PHP程序员所接受。为什么呢?

我觉得主要有以下两个问题:

(1)效率问题

这里指的不是开发效率,而是代码的执行效率。众所周知,正常情况下,PHP的执行是相当高效的。但是目前这种基于控件的框架效率都成问题。Prado本身提供了一个缓存机制来缓解这个问题。如果不采用缓存,可以说很多站点根本不能使用Prado这样的框架,比如门户网站,大型论坛等。

但ASP .NET不太一样,因为它是编译型的框架,最后生成的代码是编译生成的,不需要再次进行中间过程的诸多处理,所以在第一次执行之后速度会很快,执行效率还是很高的。 这是语言层次的功能,Prado无法通过代码层次的努力完全弥补。

(2)没有强大的IDE支持

设置控件的属性,添加其对应的事件处理器,看似简单,但控件多了,这也是个繁重的工作。.NET的强大就在于它把程序员从重复的工作中解放了出来,设置属性很方便,事件处理器也会自动添加。Prado目前没有这样的IDE支持。

总之,这种基于控件的框架比较适合于用户交互较多的,需要对页面中的很多组件设置不同处理操作,但对于性能要求不高的应用。另外,带有组件支持的框架通常对AJAX的支持都较好,比如.NET和Ruby on Rails。

综上,三种架构基本上可以代表目前的所有主流WEB开发方式,包括PHP,JavaEE,.NET,Ruby/RoR。

目前PHP开发的状况和未来的趋势:

平时做PHP比较多,特别总结一下PHP开发的趋势。目前在PHP开发中,我们最常用的是基于“文件”的架构,其实也就是一种“面向过程”的开发方式。通常我们写PHP程序的目的就是“快点上线,让程序跑起来”。而且大多数PHP程序员还要和HTML、CSS做近身搏斗,所以如果程序太抽象,调整视觉效果就比较困难。所以对于小项目,这是一个最好的选择。

但越来越多人认识到,面向对象和MVC框架更能促进代码的复用和分享,而且程序易于扩展,随着程序复杂性的增加这个趋势越明显。所以OO框架层出不穷。目前PHP框架当中最有前景的是CakePHP、Symphony和Zend Framework,各自拥有活跃的社区和庞大的用户群,都在快速成长当中。PHP的框架都避免走Java框架庞大臃肿的老路,致力于快速开发,而且主动模仿和吸收RoR这些优秀框架的新特性。随着PHP5的普及和这些框架的成熟,加上PHP原本开发社区的庞大人数,将来也许又会再产生出一些行业性的标准。

这种选择适合于中大型项目,特别是需要较大的团队合作和需要长期维护和二次开发情况。个人认为这是将来PHP开发的趋势。

而对于基于组件和事件驱动的开发方式大多数PHP程序员都不感兴趣。但是也有不少人在做这方面的努力,例如Codegear的Delphi for PHP,就吸引了很多人的关注。如果有强大的商业支持,也许将来在开发市场也会占一席之地。

我会在下一篇文章介绍D4P的新特性并作评测。

WEB开发的未来展望:

随着更贴近HTTP的REST的流行,我觉得像.NET和Java中的抽象组件的方式会受到冲击。因为这些组件并不如它们所承诺的那么方便。未来MVC+REST+RIA的模式应该会比较流行。

AJAX是一把双刃剑,尽管事件驱动的架构看起来非常适合于处理异步的请求(可以想像页面中存在几个组件,每个组件都可以触发异步请求,对应对服务器端的某个事件处理器,看起来是很理想的一个处理方式),但要为客户端自动生成良好的JavaScript代码是很不容易的,要满足各种浏览器的兼容性要求,还要能够自己进行扩展,以满足项目中千奇百怪的需求。 很多时候我更倾向于使用一些JS框架如Prototype来自己开发各种效果,而不是在服务器端生成。在服务器端生成JS的两个结果,一是对生成的代码不信任,二是人变傻,因为你并不知道真正发生了什么。

(一点牢骚也贴上来)
关于WEB开发的个人疑惑:

l 为了让开发更简单,我们不得不学习使用复杂的开发工具和框架,这到底是一个进步,还是退步?

l IDE让程序员变聪明还是变傻? 当我们在服务器代码里面就可以设计客户端界面,这是一个进步还是退步?

举个例子说,微软的ASP.NET AJAX,让我们可以在服务器端设计各种异步的控件。那么程序员甚至可以不会Javascript,不懂AJAX就设计出各种客户端效果。要是哪一天项目需要设计稍复杂的效果,靠IDE和框架无法自动完成,你要怎么办? 到这个时候再来学JS,也许就迟了。更可怕的是,技术在更新和淘汰,可能十年之后,你会发现自己除了各种IDE之后,真正精通的技术很少,脱离了IDE你写一个小程序都要查半天API手册,因为你平时都是依赖“自动补齐”来写代码的! 这样的情景,我想没有人愿意发生。

也许对于短期开发的项目来说,是一个进步,但对于程序员个人的成长来说,这并不是好事。对工具的依赖,导致了我们对于底层和核心技术的不求甚解,限制了个人的成长。




关于三种主流WEB架构的思考
Haohappy  haohappy AT msn.com
转载请注明来源:http://blog.youkuaiyun.com/haohappy2004

做WEB好几年了,各种语言和技术都稍有涉猎。今天心血来潮,突然想总结一下。其实不论什么技术,什么需求,通常WEB开发就是通过WEB前端管理一个或大或小或独立或分布式的关系型数据库,很多东西都是相通的。这里说的WEB架构,是指WEB应用开发中每种技术独有的资源组织形式(包括文件,数据库,HTTP请求处理等。注意并非OO的开发方式才有架构一说),也许说开发方式更容易让人理解一些。

以下想法主要以PHP实现为示例,但很多体会我想Java,.NET,Ruby开发者应该也很容易理解。最后是我对于刚面世就引起无数人关注的Delphi fo PHP的评测

WEB程序的架构基本上可以分成以下三类:

(一) 基于“WEB页面/文件”,例如CGI和PHP/ASP程序。程序的文件分别存储在不同的目录里,与URL相对应。当HTTP请求提交至服务器时,URL直接指向某个文件,然后由该文件来处理请求,并返回响应结果。

比如http://www.website.conm/news/readnews.php?id=1234

可以想像,我们在站点根目录的news目录下放置一个readnews.php文件。

这种开发方式最自然,最易理解,也是PHP最常用的方式。要注意产生的URL对搜索引擎不友好,不过你可以用服务器提供的URL重写方案来处理,例如Apache的mod_rewrite。

(二) 基于“动作”(Action)。这是MVC架构的WEB程序所采用的最常见的方式。目前主流的WEB框架像Struts、Webwork(Java),Ruby on Rails(Ruby),Zend Framework(PHP)等都采用这种设计。URL映射到控制器(controller)和控制器中的动作(action),由action来处理请求并输出响应结果。这种设计和上面的基于文件的方式一样,都是请求/响应驱动的方案,离不开HTTP。

比如 http://www.website.com/news/read/id/1234

可以想像在实际代码中,我们会有一个控制器newsController,其中有一个readAction。不同框架可能默认实现方式稍有不同,有的是一个Controller一个文件,其中有多个Action,有的是每个Action一个文件。当然这些你都可以自己控制,题外话。

这种方式的URL通常都很漂亮,对搜索引擎友好,因为很多框架都自带有URL重写功能。可以自由规定URL中controller、action及参数出现的位置。

另外,还有更直接的基于URL的设计方案,那就是REST。通过人为规定URL的构成形式(比如Action限制成只有几种)来促进网站之间的互相访问,降低开发的复杂性,提高系统的可伸缩性。REST对于Web Services来说是一个创新。

虽然本文讨论的是单个项目所采用的架构,而REST是为了解决网站之间的通讯问题,但REST的出现,会对单个项目的架构造成影响(很显然你在开发时就要构造规范的URL)。将来混用REST和MVC应该也是一种趋势。RoR提供很好的REST支持,Zend Framework也提供了Zend_Rest来支持REST,包括Server和Client。

(三) 基于“组件”(Component ,GUI设计也常称控件)、事件驱动的架构,最常见的是微软的.NET。基本思想是把程序分成很多组件,每个组件都可以触发事件,调用特定的事件处理器来处理(比如在一个HTML按钮上设置onClick事件链接到一个PHP函数)。这种设计远离HTTP,HTTP请求完全抽象,映射到一个事件。

事实上这种设计原本最常应用于传统桌面GUI程序的开发,例如Delphi,Java Swing等。所有表现层的组件比如窗口,或者HTML表单都可以由IDE来提供,我们只需要在IDE里点击或拖动鼠标就能够自动添加一个组件,并且添加一个相应的事件处理器。

这种开发方式有几个优点:

· 复用性 -代码高度可重用。

· 易于使用 -通常只需要配置控件的属性,编写相关的事件处理函数。

我个人也挺喜欢这种方式,PEAR就提供了相当强大的HTML_QuickForm,用于在页面添加表单元素及其事件处理函数,还可以与Smarty等模板引擎相结合。这对于项目开发来说是一个补充性的功能,在项目中的某些部份使用QuickForm,有时可以大大加快开发。

而完全基于组件和事件驱动的开发框架对于PHP来说也已经不新鲜,PRADO就是一个这样的框架,曾经得过Zend编程大赛的头奖。但目前来说很显然Prado所提倡的这种开发方式仍然没有被大部份PHP程序员所接受。为什么呢?

我觉得主要有以下两个问题:

(1)效率问题

这里指的不是开发效率,而是代码的执行效率。众所周知,正常情况下,PHP的执行是相当高效的。但是目前这种基于控件的框架效率都成问题。Prado本身提供了一个缓存机制来缓解这个问题。如果不采用缓存,可以说很多站点根本不能使用Prado这样的框架,比如门户网站,大型论坛等。

但ASP .NET不太一样,因为它是编译型的框架,最后生成的代码是编译生成的,不需要再次进行中间过程的诸多处理,所以在第一次执行之后速度会很快,执行效率还是很高的。 这是语言层次的功能,Prado无法通过代码层次的努力完全弥补。

(2)没有强大的IDE支持

设置控件的属性,添加其对应的事件处理器,看似简单,但控件多了,这也是个繁重的工作。.NET的强大就在于它把程序员从重复的工作中解放了出来,设置属性很方便,事件处理器也会自动添加。Prado目前没有这样的IDE支持。

总之,这种基于控件的框架比较适合于用户交互较多的,需要对页面中的很多组件设置不同处理操作,但对于性能要求不高的应用。另外,带有组件支持的框架通常对AJAX的支持都较好,比如.NET和Ruby on Rails。

综上,三种架构基本上可以代表目前的所有主流WEB开发方式,包括PHP,JavaEE,.NET,Ruby/RoR。

目前PHP开发的状况和未来的趋势:

平时做PHP比较多,特别总结一下PHP开发的趋势。目前在PHP开发中,我们最常用的是基于“文件”的架构,其实也就是一种“面向过程”的开发方式。通常我们写PHP程序的目的就是“快点上线,让程序跑起来”。而且大多数PHP程序员还要和HTML、CSS做近身搏斗,所以如果程序太抽象,调整视觉效果就比较困难。所以对于小项目,这是一个最好的选择。

但越来越多人认识到,面向对象和MVC框架更能促进代码的复用和分享,而且程序易于扩展,随着程序复杂性的增加这个趋势越明显。所以OO框架层出不穷。目前PHP框架当中最有前景的是CakePHP、Symphony和Zend Framework,各自拥有活跃的社区和庞大的用户群,都在快速成长当中。PHP的框架都避免走Java框架庞大臃肿的老路,致力于快速开发,而且主动模仿和吸收RoR这些优秀框架的新特性。随着PHP5的普及和这些框架的成熟,加上PHP原本开发社区的庞大人数,将来也许又会再产生出一些行业性的标准。

这种选择适合于中大型项目,特别是需要较大的团队合作和需要长期维护和二次开发情况。个人认为这是将来PHP开发的趋势。

而对于基于组件和事件驱动的开发方式大多数PHP程序员都不感兴趣。但是也有不少人在做这方面的努力,例如Codegear的Delphi for PHP,就吸引了很多人的关注。如果有强大的商业支持,也许将来在开发市场也会占一席之地。

我会在下一篇文章介绍D4P的新特性并作评测。

WEB开发的未来展望:

随着更贴近HTTP的REST的流行,我觉得像.NET和Java中的抽象组件的方式会受到冲击。因为这些组件并不如它们所承诺的那么方便。未来MVC+REST+RIA的模式应该会比较流行。

AJAX是一把双刃剑,尽管事件驱动的架构看起来非常适合于处理异步的请求(可以想像页面中存在几个组件,每个组件都可以触发异步请求,对应对服务器端的某个事件处理器,看起来是很理想的一个处理方式),但要为客户端自动生成良好的JavaScript代码是很不容易的,要满足各种浏览器的兼容性要求,还要能够自己进行扩展,以满足项目中千奇百怪的需求。 很多时候我更倾向于使用一些JS框架如Prototype来自己开发各种效果,而不是在服务器端生成。在服务器端生成JS的两个结果,一是对生成的代码不信任,二是人变傻,因为你并不知道真正发生了什么。

(一点牢骚也贴上来)
关于WEB开发的个人疑惑:

l 为了让开发更简单,我们不得不学习使用复杂的开发工具和框架,这到底是一个进步,还是退步?

l IDE让程序员变聪明还是变傻? 当我们在服务器代码里面就可以设计客户端界面,这是一个进步还是退步?

举个例子说,微软的ASP.NET AJAX,让我们可以在服务器端设计各种异步的控件。那么程序员甚至可以不会Javascript,不懂AJAX就设计出各种客户端效果。要是哪一天项目需要设计稍复杂的效果,靠IDE和框架无法自动完成,你要怎么办? 到这个时候再来学JS,也许就迟了。更可怕的是,技术在更新和淘汰,可能十年之后,你会发现自己除了各种IDE之后,真正精通的技术很少,脱离了IDE你写一个小程序都要查半天API手册,因为你平时都是依赖“自动补齐”来写代码的! 这样的情景,我想没有人愿意发生。

也许对于短期开发的项目来说,是一个进步,但对于程序员个人的成长来说,这并不是好事。对工具的依赖,导致了我们对于底层和核心技术的不求甚解,限制了个人的成长。




关于三种主流WEB架构的思考
Haohappy  haohappy AT msn.com
转载请注明来源:http://blog.youkuaiyun.com/haohappy2004

做WEB好几年了,各种语言和技术都稍有涉猎。今天心血来潮,突然想总结一下。其实不论什么技术,什么需求,通常WEB开发就是通过WEB前端管理一个或大或小或独立或分布式的关系型数据库,很多东西都是相通的。这里说的WEB架构,是指WEB应用开发中每种技术独有的资源组织形式(包括文件,数据库,HTTP请求处理等。注意并非OO的开发方式才有架构一说),也许说开发方式更容易让人理解一些。

以下想法主要以PHP实现为示例,但很多体会我想Java,.NET,Ruby开发者应该也很容易理解。最后是我对于刚面世就引起无数人关注的Delphi fo PHP的评测

WEB程序的架构基本上可以分成以下三类:

(一) 基于“WEB页面/文件”,例如CGI和PHP/ASP程序。程序的文件分别存储在不同的目录里,与URL相对应。当HTTP请求提交至服务器时,URL直接指向某个文件,然后由该文件来处理请求,并返回响应结果。

比如http://www.website.conm/news/readnews.php?id=1234

可以想像,我们在站点根目录的news目录下放置一个readnews.php文件。

这种开发方式最自然,最易理解,也是PHP最常用的方式。要注意产生的URL对搜索引擎不友好,不过你可以用服务器提供的URL重写方案来处理,例如Apache的mod_rewrite。

(二) 基于“动作”(Action)。这是MVC架构的WEB程序所采用的最常见的方式。目前主流的WEB框架像Struts、Webwork(Java),Ruby on Rails(Ruby),Zend Framework(PHP)等都采用这种设计。URL映射到控制器(controller)和控制器中的动作(action),由action来处理请求并输出响应结果。这种设计和上面的基于文件的方式一样,都是请求/响应驱动的方案,离不开HTTP。

比如 http://www.website.com/news/read/id/1234

可以想像在实际代码中,我们会有一个控制器newsController,其中有一个readAction。不同框架可能默认实现方式稍有不同,有的是一个Controller一个文件,其中有多个Action,有的是每个Action一个文件。当然这些你都可以自己控制,题外话。

这种方式的URL通常都很漂亮,对搜索引擎友好,因为很多框架都自带有URL重写功能。可以自由规定URL中controller、action及参数出现的位置。

另外,还有更直接的基于URL的设计方案,那就是REST。通过人为规定URL的构成形式(比如Action限制成只有几种)来促进网站之间的互相访问,降低开发的复杂性,提高系统的可伸缩性。REST对于Web Services来说是一个创新。

虽然本文讨论的是单个项目所采用的架构,而REST是为了解决网站之间的通讯问题,但REST的出现,会对单个项目的架构造成影响(很显然你在开发时就要构造规范的URL)。将来混用REST和MVC应该也是一种趋势。RoR提供很好的REST支持,Zend Framework也提供了Zend_Rest来支持REST,包括Server和Client。

(三) 基于“组件”(Component ,GUI设计也常称控件)、事件驱动的架构,最常见的是微软的.NET。基本思想是把程序分成很多组件,每个组件都可以触发事件,调用特定的事件处理器来处理(比如在一个HTML按钮上设置onClick事件链接到一个PHP函数)。这种设计远离HTTP,HTTP请求完全抽象,映射到一个事件。

事实上这种设计原本最常应用于传统桌面GUI程序的开发,例如Delphi,Java Swing等。所有表现层的组件比如窗口,或者HTML表单都可以由IDE来提供,我们只需要在IDE里点击或拖动鼠标就能够自动添加一个组件,并且添加一个相应的事件处理器。

这种开发方式有几个优点:

· 复用性 -代码高度可重用。

· 易于使用 -通常只需要配置控件的属性,编写相关的事件处理函数。

我个人也挺喜欢这种方式,PEAR就提供了相当强大的HTML_QuickForm,用于在页面添加表单元素及其事件处理函数,还可以与Smarty等模板引擎相结合。这对于项目开发来说是一个补充性的功能,在项目中的某些部份使用QuickForm,有时可以大大加快开发。

而完全基于组件和事件驱动的开发框架对于PHP来说也已经不新鲜,PRADO就是一个这样的框架,曾经得过Zend编程大赛的头奖。但目前来说很显然Prado所提倡的这种开发方式仍然没有被大部份PHP程序员所接受。为什么呢?

我觉得主要有以下两个问题:

(1)效率问题

这里指的不是开发效率,而是代码的执行效率。众所周知,正常情况下,PHP的执行是相当高效的。但是目前这种基于控件的框架效率都成问题。Prado本身提供了一个缓存机制来缓解这个问题。如果不采用缓存,可以说很多站点根本不能使用Prado这样的框架,比如门户网站,大型论坛等。

但ASP .NET不太一样,因为它是编译型的框架,最后生成的代码是编译生成的,不需要再次进行中间过程的诸多处理,所以在第一次执行之后速度会很快,执行效率还是很高的。 这是语言层次的功能,Prado无法通过代码层次的努力完全弥补。

(2)没有强大的IDE支持

设置控件的属性,添加其对应的事件处理器,看似简单,但控件多了,这也是个繁重的工作。.NET的强大就在于它把程序员从重复的工作中解放了出来,设置属性很方便,事件处理器也会自动添加。Prado目前没有这样的IDE支持。

总之,这种基于控件的框架比较适合于用户交互较多的,需要对页面中的很多组件设置不同处理操作,但对于性能要求不高的应用。另外,带有组件支持的框架通常对AJAX的支持都较好,比如.NET和Ruby on Rails。

综上,三种架构基本上可以代表目前的所有主流WEB开发方式,包括PHP,JavaEE,.NET,Ruby/RoR。

目前PHP开发的状况和未来的趋势:

平时做PHP比较多,特别总结一下PHP开发的趋势。目前在PHP开发中,我们最常用的是基于“文件”的架构,其实也就是一种“面向过程”的开发方式。通常我们写PHP程序的目的就是“快点上线,让程序跑起来”。而且大多数PHP程序员还要和HTML、CSS做近身搏斗,所以如果程序太抽象,调整视觉效果就比较困难。所以对于小项目,这是一个最好的选择。

但越来越多人认识到,面向对象和MVC框架更能促进代码的复用和分享,而且程序易于扩展,随着程序复杂性的增加这个趋势越明显。所以OO框架层出不穷。目前PHP框架当中最有前景的是CakePHP、Symphony和Zend Framework,各自拥有活跃的社区和庞大的用户群,都在快速成长当中。PHP的框架都避免走Java框架庞大臃肿的老路,致力于快速开发,而且主动模仿和吸收RoR这些优秀框架的新特性。随着PHP5的普及和这些框架的成熟,加上PHP原本开发社区的庞大人数,将来也许又会再产生出一些行业性的标准。

这种选择适合于中大型项目,特别是需要较大的团队合作和需要长期维护和二次开发情况。个人认为这是将来PHP开发的趋势。

而对于基于组件和事件驱动的开发方式大多数PHP程序员都不感兴趣。但是也有不少人在做这方面的努力,例如Codegear的Delphi for PHP,就吸引了很多人的关注。如果有强大的商业支持,也许将来在开发市场也会占一席之地。

我会在下一篇文章介绍D4P的新特性并作评测。

WEB开发的未来展望:

随着更贴近HTTP的REST的流行,我觉得像.NET和Java中的抽象组件的方式会受到冲击。因为这些组件并不如它们所承诺的那么方便。未来MVC+REST+RIA的模式应该会比较流行。

AJAX是一把双刃剑,尽管事件驱动的架构看起来非常适合于处理异步的请求(可以想像页面中存在几个组件,每个组件都可以触发异步请求,对应对服务器端的某个事件处理器,看起来是很理想的一个处理方式),但要为客户端自动生成良好的JavaScript代码是很不容易的,要满足各种浏览器的兼容性要求,还要能够自己进行扩展,以满足项目中千奇百怪的需求。 很多时候我更倾向于使用一些JS框架如Prototype来自己开发各种效果,而不是在服务器端生成。在服务器端生成JS的两个结果,一是对生成的代码不信任,二是人变傻,因为你并不知道真正发生了什么。

(一点牢骚也贴上来)
关于WEB开发的个人疑惑:

l 为了让开发更简单,我们不得不学习使用复杂的开发工具和框架,这到底是一个进步,还是退步?

l IDE让程序员变聪明还是变傻? 当我们在服务器代码里面就可以设计客户端界面,这是一个进步还是退步?

举个例子说,微软的ASP.NET AJAX,让我们可以在服务器端设计各种异步的控件。那么程序员甚至可以不会Javascript,不懂AJAX就设计出各种客户端效果。要是哪一天项目需要设计稍复杂的效果,靠IDE和框架无法自动完成,你要怎么办? 到这个时候再来学JS,也许就迟了。更可怕的是,技术在更新和淘汰,可能十年之后,你会发现自己除了各种IDE之后,真正精通的技术很少,脱离了IDE你写一个小程序都要查半天API手册,因为你平时都是依赖“自动补齐”来写代码的! 这样的情景,我想没有人愿意发生。

也许对于短期开发的项目来说,是一个进步,但对于程序员个人的成长来说,这并不是好事。对工具的依赖,导致了我们对于底层和核心技术的不求甚解,限制了个人的成长。




关于三种主流WEB架构的思考
Haohappy  haohappy AT msn.com
转载请注明来源:http://blog.youkuaiyun.com/haohappy2004

做WEB好几年了,各种语言和技术都稍有涉猎。今天心血来潮,突然想总结一下。其实不论什么技术,什么需求,通常WEB开发就是通过WEB前端管理一个或大或小或独立或分布式的关系型数据库,很多东西都是相通的。这里说的WEB架构,是指WEB应用开发中每种技术独有的资源组织形式(包括文件,数据库,HTTP请求处理等。注意并非OO的开发方式才有架构一说),也许说开发方式更容易让人理解一些。

以下想法主要以PHP实现为示例,但很多体会我想Java,.NET,Ruby开发者应该也很容易理解。最后是我对于刚面世就引起无数人关注的Delphi fo PHP的评测

WEB程序的架构基本上可以分成以下三类:

(一) 基于“WEB页面/文件”,例如CGI和PHP/ASP程序。程序的文件分别存储在不同的目录里,与URL相对应。当HTTP请求提交至服务器时,URL直接指向某个文件,然后由该文件来处理请求,并返回响应结果。

比如http://www.website.conm/news/readnews.php?id=1234

可以想像,我们在站点根目录的news目录下放置一个readnews.php文件。

这种开发方式最自然,最易理解,也是PHP最常用的方式。要注意产生的URL对搜索引擎不友好,不过你可以用服务器提供的URL重写方案来处理,例如Apache的mod_rewrite。

(二) 基于“动作”(Action)。这是MVC架构的WEB程序所采用的最常见的方式。目前主流的WEB框架像Struts、Webwork(Java),Ruby on Rails(Ruby),Zend Framework(PHP)等都采用这种设计。URL映射到控制器(controller)和控制器中的动作(action),由action来处理请求并输出响应结果。这种设计和上面的基于文件的方式一样,都是请求/响应驱动的方案,离不开HTTP。

比如 http://www.website.com/news/read/id/1234

可以想像在实际代码中,我们会有一个控制器newsController,其中有一个readAction。不同框架可能默认实现方式稍有不同,有的是一个Controller一个文件,其中有多个Action,有的是每个Action一个文件。当然这些你都可以自己控制,题外话。

这种方式的URL通常都很漂亮,对搜索引擎友好,因为很多框架都自带有URL重写功能。可以自由规定URL中controller、action及参数出现的位置。

另外,还有更直接的基于URL的设计方案,那就是REST。通过人为规定URL的构成形式(比如Action限制成只有几种)来促进网站之间的互相访问,降低开发的复杂性,提高系统的可伸缩性。REST对于Web Services来说是一个创新。

虽然本文讨论的是单个项目所采用的架构,而REST是为了解决网站之间的通讯问题,但REST的出现,会对单个项目的架构造成影响(很显然你在开发时就要构造规范的URL)。将来混用REST和MVC应该也是一种趋势。RoR提供很好的REST支持,Zend Framework也提供了Zend_Rest来支持REST,包括Server和Client。

(三) 基于“组件”(Component ,GUI设计也常称控件)、事件驱动的架构,最常见的是微软的.NET。基本思想是把程序分成很多组件,每个组件都可以触发事件,调用特定的事件处理器来处理(比如在一个HTML按钮上设置onClick事件链接到一个PHP函数)。这种设计远离HTTP,HTTP请求完全抽象,映射到一个事件。

事实上这种设计原本最常应用于传统桌面GUI程序的开发,例如Delphi,Java Swing等。所有表现层的组件比如窗口,或者HTML表单都可以由IDE来提供,我们只需要在IDE里点击或拖动鼠标就能够自动添加一个组件,并且添加一个相应的事件处理器。

这种开发方式有几个优点:

· 复用性 -代码高度可重用。

· 易于使用 -通常只需要配置控件的属性,编写相关的事件处理函数。

我个人也挺喜欢这种方式,PEAR就提供了相当强大的HTML_QuickForm,用于在页面添加表单元素及其事件处理函数,还可以与Smarty等模板引擎相结合。这对于项目开发来说是一个补充性的功能,在项目中的某些部份使用QuickForm,有时可以大大加快开发。

而完全基于组件和事件驱动的开发框架对于PHP来说也已经不新鲜,PRADO就是一个这样的框架,曾经得过Zend编程大赛的头奖。但目前来说很显然Prado所提倡的这种开发方式仍然没有被大部份PHP程序员所接受。为什么呢?

我觉得主要有以下两个问题:

(1)效率问题

这里指的不是开发效率,而是代码的执行效率。众所周知,正常情况下,PHP的执行是相当高效的。但是目前这种基于控件的框架效率都成问题。Prado本身提供了一个缓存机制来缓解这个问题。如果不采用缓存,可以说很多站点根本不能使用Prado这样的框架,比如门户网站,大型论坛等。

但ASP .NET不太一样,因为它是编译型的框架,最后生成的代码是编译生成的,不需要再次进行中间过程的诸多处理,所以在第一次执行之后速度会很快,执行效率还是很高的。 这是语言层次的功能,Prado无法通过代码层次的努力完全弥补。

(2)没有强大的IDE支持

设置控件的属性,添加其对应的事件处理器,看似简单,但控件多了,这也是个繁重的工作。.NET的强大就在于它把程序员从重复的工作中解放了出来,设置属性很方便,事件处理器也会自动添加。Prado目前没有这样的IDE支持。

总之,这种基于控件的框架比较适合于用户交互较多的,需要对页面中的很多组件设置不同处理操作,但对于性能要求不高的应用。另外,带有组件支持的框架通常对AJAX的支持都较好,比如.NET和Ruby on Rails。

综上,三种架构基本上可以代表目前的所有主流WEB开发方式,包括PHP,JavaEE,.NET,Ruby/RoR。

目前PHP开发的状况和未来的趋势:

平时做PHP比较多,特别总结一下PHP开发的趋势。目前在PHP开发中,我们最常用的是基于“文件”的架构,其实也就是一种“面向过程”的开发方式。通常我们写PHP程序的目的就是“快点上线,让程序跑起来”。而且大多数PHP程序员还要和HTML、CSS做近身搏斗,所以如果程序太抽象,调整视觉效果就比较困难。所以对于小项目,这是一个最好的选择。

但越来越多人认识到,面向对象和MVC框架更能促进代码的复用和分享,而且程序易于扩展,随着程序复杂性的增加这个趋势越明显。所以OO框架层出不穷。目前PHP框架当中最有前景的是CakePHP、Symphony和Zend Framework,各自拥有活跃的社区和庞大的用户群,都在快速成长当中。PHP的框架都避免走Java框架庞大臃肿的老路,致力于快速开发,而且主动模仿和吸收RoR这些优秀框架的新特性。随着PHP5的普及和这些框架的成熟,加上PHP原本开发社区的庞大人数,将来也许又会再产生出一些行业性的标准。

这种选择适合于中大型项目,特别是需要较大的团队合作和需要长期维护和二次开发情况。个人认为这是将来PHP开发的趋势。

而对于基于组件和事件驱动的开发方式大多数PHP程序员都不感兴趣。但是也有不少人在做这方面的努力,例如Codegear的Delphi for PHP,就吸引了很多人的关注。如果有强大的商业支持,也许将来在开发市场也会占一席之地。

我会在下一篇文章介绍D4P的新特性并作评测。

WEB开发的未来展望:

随着更贴近HTTP的REST的流行,我觉得像.NET和Java中的抽象组件的方式会受到冲击。因为这些组件并不如它们所承诺的那么方便。未来MVC+REST+RIA的模式应该会比较流行。

AJAX是一把双刃剑,尽管事件驱动的架构看起来非常适合于处理异步的请求(可以想像页面中存在几个组件,每个组件都可以触发异步请求,对应对服务器端的某个事件处理器,看起来是很理想的一个处理方式),但要为客户端自动生成良好的JavaScript代码是很不容易的,要满足各种浏览器的兼容性要求,还要能够自己进行扩展,以满足项目中千奇百怪的需求。 很多时候我更倾向于使用一些JS框架如Prototype来自己开发各种效果,而不是在服务器端生成。在服务器端生成JS的两个结果,一是对生成的代码不信任,二是人变傻,因为你并不知道真正发生了什么。

(一点牢骚也贴上来)
关于WEB开发的个人疑惑:

l 为了让开发更简单,我们不得不学习使用复杂的开发工具和框架,这到底是一个进步,还是退步?

l IDE让程序员变聪明还是变傻? 当我们在服务器代码里面就可以设计客户端界面,这是一个进步还是退步?

举个例子说,微软的ASP.NET AJAX,让我们可以在服务器端设计各种异步的控件。那么程序员甚至可以不会Javascript,不懂AJAX就设计出各种客户端效果。要是哪一天项目需要设计稍复杂的效果,靠IDE和框架无法自动完成,你要怎么办? 到这个时候再来学JS,也许就迟了。更可怕的是,技术在更新和淘汰,可能十年之后,你会发现自己除了各种IDE之后,真正精通的技术很少,脱离了IDE你写一个小程序都要查半天API手册,因为你平时都是依赖“自动补齐”来写代码的! 这样的情景,我想没有人愿意发生。

也许对于短期开发的项目来说,是一个进步,但对于程序员个人的成长来说,这并不是好事。对工具的依赖,导致了我们对于底层和核心技术的不求甚解,限制了个人的成长。




关于三种主流WEB架构的思考
Haohappy  haohappy AT msn.com
转载请注明来源:http://blog.youkuaiyun.com/haohappy2004

做WEB好几年了,各种语言和技术都稍有涉猎。今天心血来潮,突然想总结一下。其实不论什么技术,什么需求,通常WEB开发就是通过WEB前端管理一个或大或小或独立或分布式的关系型数据库,很多东西都是相通的。这里说的WEB架构,是指WEB应用开发中每种技术独有的资源组织形式(包括文件,数据库,HTTP请求处理等。注意并非OO的开发方式才有架构一说),也许说开发方式更容易让人理解一些。

以下想法主要以PHP实现为示例,但很多体会我想Java,.NET,Ruby开发者应该也很容易理解。最后是我对于刚面世就引起无数人关注的Delphi fo PHP的评测

WEB程序的架构基本上可以分成以下三类:

(一) 基于“WEB页面/文件”,例如CGI和PHP/ASP程序。程序的文件分别存储在不同的目录里,与URL相对应。当HTTP请求提交至服务器时,URL直接指向某个文件,然后由该文件来处理请求,并返回响应结果。

比如http://www.website.conm/news/readnews.php?id=1234

可以想像,我们在站点根目录的news目录下放置一个readnews.php文件。

这种开发方式最自然,最易理解,也是PHP最常用的方式。要注意产生的URL对搜索引擎不友好,不过你可以用服务器提供的URL重写方案来处理,例如Apache的mod_rewrite。

(二) 基于“动作”(Action)。这是MVC架构的WEB程序所采用的最常见的方式。目前主流的WEB框架像Struts、Webwork(Java),Ruby on Rails(Ruby),Zend Framework(PHP)等都采用这种设计。URL映射到控制器(controller)和控制器中的动作(action),由action来处理请求并输出响应结果。这种设计和上面的基于文件的方式一样,都是请求/响应驱动的方案,离不开HTTP。

比如 http://www.website.com/news/read/id/1234

可以想像在实际代码中,我们会有一个控制器newsController,其中有一个readAction。不同框架可能默认实现方式稍有不同,有的是一个Controller一个文件,其中有多个Action,有的是每个Action一个文件。当然这些你都可以自己控制,题外话。

这种方式的URL通常都很漂亮,对搜索引擎友好,因为很多框架都自带有URL重写功能。可以自由规定URL中controller、action及参数出现的位置。

另外,还有更直接的基于URL的设计方案,那就是REST。通过人为规定URL的构成形式(比如Action限制成只有几种)来促进网站之间的互相访问,降低开发的复杂性,提高系统的可伸缩性。REST对于Web Services来说是一个创新。

虽然本文讨论的是单个项目所采用的架构,而REST是为了解决网站之间的通讯问题,但REST的出现,会对单个项目的架构造成影响(很显然你在开发时就要构造规范的URL)。将来混用REST和MVC应该也是一种趋势。RoR提供很好的REST支持,Zend Framework也提供了Zend_Rest来支持REST,包括Server和Client。

(三) 基于“组件”(Component ,GUI设计也常称控件)、事件驱动的架构,最常见的是微软的.NET。基本思想是把程序分成很多组件,每个组件都可以触发事件,调用特定的事件处理器来处理(比如在一个HTML按钮上设置onClick事件链接到一个PHP函数)。这种设计远离HTTP,HTTP请求完全抽象,映射到一个事件。

事实上这种设计原本最常应用于传统桌面GUI程序的开发,例如Delphi,Java Swing等。所有表现层的组件比如窗口,或者HTML表单都可以由IDE来提供,我们只需要在IDE里点击或拖动鼠标就能够自动添加一个组件,并且添加一个相应的事件处理器。

这种开发方式有几个优点:

· 复用性 -代码高度可重用。

· 易于使用 -通常只需要配置控件的属性,编写相关的事件处理函数。

我个人也挺喜欢这种方式,PEAR就提供了相当强大的HTML_QuickForm,用于在页面添加表单元素及其事件处理函数,还可以与Smarty等模板引擎相结合。这对于项目开发来说是一个补充性的功能,在项目中的某些部份使用QuickForm,有时可以大大加快开发。

而完全基于组件和事件驱动的开发框架对于PHP来说也已经不新鲜,PRADO就是一个这样的框架,曾经得过Zend编程大赛的头奖。但目前来说很显然Prado所提倡的这种开发方式仍然没有被大部份PHP程序员所接受。为什么呢?

我觉得主要有以下两个问题:

(1)效率问题

这里指的不是开发效率,而是代码的执行效率。众所周知,正常情况下,PHP的执行是相当高效的。但是目前这种基于控件的框架效率都成问题。Prado本身提供了一个缓存机制来缓解这个问题。如果不采用缓存,可以说很多站点根本不能使用Prado这样的框架,比如门户网站,大型论坛等。

但ASP .NET不太一样,因为它是编译型的框架,最后生成的代码是编译生成的,不需要再次进行中间过程的诸多处理,所以在第一次执行之后速度会很快,执行效率还是很高的。 这是语言层次的功能,Prado无法通过代码层次的努力完全弥补。

(2)没有强大的IDE支持

设置控件的属性,添加其对应的事件处理器,看似简单,但控件多了,这也是个繁重的工作。.NET的强大就在于它把程序员从重复的工作中解放了出来,设置属性很方便,事件处理器也会自动添加。Prado目前没有这样的IDE支持。

总之,这种基于控件的框架比较适合于用户交互较多的,需要对页面中的很多组件设置不同处理操作,但对于性能要求不高的应用。另外,带有组件支持的框架通常对AJAX的支持都较好,比如.NET和Ruby on Rails。

综上,三种架构基本上可以代表目前的所有主流WEB开发方式,包括PHP,JavaEE,.NET,Ruby/RoR。

目前PHP开发的状况和未来的趋势:

平时做PHP比较多,特别总结一下PHP开发的趋势。目前在PHP开发中,我们最常用的是基于“文件”的架构,其实也就是一种“面向过程”的开发方式。通常我们写PHP程序的目的就是“快点上线,让程序跑起来”。而且大多数PHP程序员还要和HTML、CSS做近身搏斗,所以如果程序太抽象,调整视觉效果就比较困难。所以对于小项目,这是一个最好的选择。

但越来越多人认识到,面向对象和MVC框架更能促进代码的复用和分享,而且程序易于扩展,随着程序复杂性的增加这个趋势越明显。所以OO框架层出不穷。目前PHP框架当中最有前景的是CakePHP、Symphony和Zend Framework,各自拥有活跃的社区和庞大的用户群,都在快速成长当中。PHP的框架都避免走Java框架庞大臃肿的老路,致力于快速开发,而且主动模仿和吸收RoR这些优秀框架的新特性。随着PHP5的普及和这些框架的成熟,加上PHP原本开发社区的庞大人数,将来也许又会再产生出一些行业性的标准。

这种选择适合于中大型项目,特别是需要较大的团队合作和需要长期维护和二次开发情况。个人认为这是将来PHP开发的趋势。

而对于基于组件和事件驱动的开发方式大多数PHP程序员都不感兴趣。但是也有不少人在做这方面的努力,例如Codegear的Delphi for PHP,就吸引了很多人的关注。如果有强大的商业支持,也许将来在开发市场也会占一席之地。

我会在下一篇文章介绍D4P的新特性并作评测。

WEB开发的未来展望:

随着更贴近HTTP的REST的流行,我觉得像.NET和Java中的抽象组件的方式会受到冲击。因为这些组件并不如它们所承诺的那么方便。未来MVC+REST+RIA的模式应该会比较流行。

AJAX是一把双刃剑,尽管事件驱动的架构看起来非常适合于处理异步的请求(可以想像页面中存在几个组件,每个组件都可以触发异步请求,对应对服务器端的某个事件处理器,看起来是很理想的一个处理方式),但要为客户端自动生成良好的JavaScript代码是很不容易的,要满足各种浏览器的兼容性要求,还要能够自己进行扩展,以满足项目中千奇百怪的需求。 很多时候我更倾向于使用一些JS框架如Prototype来自己开发各种效果,而不是在服务器端生成。在服务器端生成JS的两个结果,一是对生成的代码不信任,二是人变傻,因为你并不知道真正发生了什么。

(一点牢骚也贴上来)
关于WEB开发的个人疑惑:

l 为了让开发更简单,我们不得不学习使用复杂的开发工具和框架,这到底是一个进步,还是退步?

l IDE让程序员变聪明还是变傻? 当我们在服务器代码里面就可以设计客户端界面,这是一个进步还是退步?

举个例子说,微软的ASP.NET AJAX,让我们可以在服务器端设计各种异步的控件。那么程序员甚至可以不会Javascript,不懂AJAX就设计出各种客户端效果。要是哪一天项目需要设计稍复杂的效果,靠IDE和框架无法自动完成,你要怎么办? 到这个时候再来学JS,也许就迟了。更可怕的是,技术在更新和淘汰,可能十年之后,你会发现自己除了各种IDE之后,真正精通的技术很少,脱离了IDE你写一个小程序都要查半天API手册,因为你平时都是依赖“自动补齐”来写代码的! 这样的情景,我想没有人愿意发生。

也许对于短期开发的项目来说,是一个进步,但对于程序员个人的成长来说,这并不是好事。对工具的依赖,导致了我们对于底层和核心技术的不求甚解,限制了个人的成长。




关于三种主流WEB架构的思考
Haohappy  haohappy AT msn.com
转载请注明来源:http://blog.youkuaiyun.com/haohappy2004

做WEB好几年了,各种语言和技术都稍有涉猎。今天心血来潮,突然想总结一下。其实不论什么技术,什么需求,通常WEB开发就是通过WEB前端管理一个或大或小或独立或分布式的关系型数据库,很多东西都是相通的。这里说的WEB架构,是指WEB应用开发中每种技术独有的资源组织形式(包括文件,数据库,HTTP请求处理等。注意并非OO的开发方式才有架构一说),也许说开发方式更容易让人理解一些。

以下想法主要以PHP实现为示例,但很多体会我想Java,.NET,Ruby开发者应该也很容易理解。最后是我对于刚面世就引起无数人关注的Delphi fo PHP的评测

WEB程序的架构基本上可以分成以下三类:

(一) 基于“WEB页面/文件”,例如CGI和PHP/ASP程序。程序的文件分别存储在不同的目录里,与URL相对应。当HTTP请求提交至服务器时,URL直接指向某个文件,然后由该文件来处理请求,并返回响应结果。

比如http://www.website.conm/news/readnews.php?id=1234

可以想像,我们在站点根目录的news目录下放置一个readnews.php文件。

这种开发方式最自然,最易理解,也是PHP最常用的方式。要注意产生的URL对搜索引擎不友好,不过你可以用服务器提供的URL重写方案来处理,例如Apache的mod_rewrite。

(二) 基于“动作”(Action)。这是MVC架构的WEB程序所采用的最常见的方式。目前主流的WEB框架像Struts、Webwork(Java),Ruby on Rails(Ruby),Zend Framework(PHP)等都采用这种设计。URL映射到控制器(controller)和控制器中的动作(action),由action来处理请求并输出响应结果。这种设计和上面的基于文件的方式一样,都是请求/响应驱动的方案,离不开HTTP。

比如 http://www.website.com/news/read/id/1234

可以想像在实际代码中,我们会有一个控制器newsController,其中有一个readAction。不同框架可能默认实现方式稍有不同,有的是一个Controller一个文件,其中有多个Action,有的是每个Action一个文件。当然这些你都可以自己控制,题外话。

这种方式的URL通常都很漂亮,对搜索引擎友好,因为很多框架都自带有URL重写功能。可以自由规定URL中controller、action及参数出现的位置。

另外,还有更直接的基于URL的设计方案,那就是REST。通过人为规定URL的构成形式(比如Action限制成只有几种)来促进网站之间的互相访问,降低开发的复杂性,提高系统的可伸缩性。REST对于Web Services来说是一个创新。

虽然本文讨论的是单个项目所采用的架构,而REST是为了解决网站之间的通讯问题,但REST的出现,会对单个项目的架构造成影响(很显然你在开发时就要构造规范的URL)。将来混用REST和MVC应该也是一种趋势。RoR提供很好的REST支持,Zend Framework也提供了Zend_Rest来支持REST,包括Server和Client。

(三) 基于“组件”(Component ,GUI设计也常称控件)、事件驱动的架构,最常见的是微软的.NET。基本思想是把程序分成很多组件,每个组件都可以触发事件,调用特定的事件处理器来处理(比如在一个HTML按钮上设置onClick事件链接到一个PHP函数)。这种设计远离HTTP,HTTP请求完全抽象,映射到一个事件。

事实上这种设计原本最常应用于传统桌面GUI程序的开发,例如Delphi,Java Swing等。所有表现层的组件比如窗口,或者HTML表单都可以由IDE来提供,我们只需要在IDE里点击或拖动鼠标就能够自动添加一个组件,并且添加一个相应的事件处理器。

这种开发方式有几个优点:

· 复用性 -代码高度可重用。

· 易于使用 -通常只需要配置控件的属性,编写相关的事件处理函数。

我个人也挺喜欢这种方式,PEAR就提供了相当强大的HTML_QuickForm,用于在页面添加表单元素及其事件处理函数,还可以与Smarty等模板引擎相结合。这对于项目开发来说是一个补充性的功能,在项目中的某些部份使用QuickForm,有时可以大大加快开发。

而完全基于组件和事件驱动的开发框架对于PHP来说也已经不新鲜,PRADO就是一个这样的框架,曾经得过Zend编程大赛的头奖。但目前来说很显然Prado所提倡的这种开发方式仍然没有被大部份PHP程序员所接受。为什么呢?

我觉得主要有以下两个问题:

(1)效率问题

这里指的不是开发效率,而是代码的执行效率。众所周知,正常情况下,PHP的执行是相当高效的。但是目前这种基于控件的框架效率都成问题。Prado本身提供了一个缓存机制来缓解这个问题。如果不采用缓存,可以说很多站点根本不能使用Prado这样的框架,比如门户网站,大型论坛等。

但ASP .NET不太一样,因为它是编译型的框架,最后生成的代码是编译生成的,不需要再次进行中间过程的诸多处理,所以在第一次执行之后速度会很快,执行效率还是很高的。 这是语言层次的功能,Prado无法通过代码层次的努力完全弥补。

(2)没有强大的IDE支持

设置控件的属性,添加其对应的事件处理器,看似简单,但控件多了,这也是个繁重的工作。.NET的强大就在于它把程序员从重复的工作中解放了出来,设置属性很方便,事件处理器也会自动添加。Prado目前没有这样的IDE支持。

总之,这种基于控件的框架比较适合于用户交互较多的,需要对页面中的很多组件设置不同处理操作,但对于性能要求不高的应用。另外,带有组件支持的框架通常对AJAX的支持都较好,比如.NET和Ruby on Rails。

综上,三种架构基本上可以代表目前的所有主流WEB开发方式,包括PHP,JavaEE,.NET,Ruby/RoR。

目前PHP开发的状况和未来的趋势:

平时做PHP比较多,特别总结一下PHP开发的趋势。目前在PHP开发中,我们最常用的是基于“文件”的架构,其实也就是一种“面向过程”的开发方式。通常我们写PHP程序的目的就是“快点上线,让程序跑起来”。而且大多数PHP程序员还要和HTML、CSS做近身搏斗,所以如果程序太抽象,调整视觉效果就比较困难。所以对于小项目,这是一个最好的选择。

但越来越多人认识到,面向对象和MVC框架更能促进代码的复用和分享,而且程序易于扩展,随着程序复杂性的增加这个趋势越明显。所以OO框架层出不穷。目前PHP框架当中最有前景的是CakePHP、Symphony和Zend Framework,各自拥有活跃的社区和庞大的用户群,都在快速成长当中。PHP的框架都避免走Java框架庞大臃肿的老路,致力于快速开发,而且主动模仿和吸收RoR这些优秀框架的新特性。随着PHP5的普及和这些框架的成熟,加上PHP原本开发社区的庞大人数,将来也许又会再产生出一些行业性的标准。

这种选择适合于中大型项目,特别是需要较大的团队合作和需要长期维护和二次开发情况。个人认为这是将来PHP开发的趋势。

而对于基于组件和事件驱动的开发方式大多数PHP程序员都不感兴趣。但是也有不少人在做这方面的努力,例如Codegear的Delphi for PHP,就吸引了很多人的关注。如果有强大的商业支持,也许将来在开发市场也会占一席之地。

我会在下一篇文章介绍D4P的新特性并作评测。

WEB开发的未来展望:

随着更贴近HTTP的REST的流行,我觉得像.NET和Java中的抽象组件的方式会受到冲击。因为这些组件并不如它们所承诺的那么方便。未来MVC+REST+RIA的模式应该会比较流行。

AJAX是一把双刃剑,尽管事件驱动的架构看起来非常适合于处理异步的请求(可以想像页面中存在几个组件,每个组件都可以触发异步请求,对应对服务器端的某个事件处理器,看起来是很理想的一个处理方式),但要为客户端自动生成良好的JavaScript代码是很不容易的,要满足各种浏览器的兼容性要求,还要能够自己进行扩展,以满足项目中千奇百怪的需求。 很多时候我更倾向于使用一些JS框架如Prototype来自己开发各种效果,而不是在服务器端生成。在服务器端生成JS的两个结果,一是对生成的代码不信任,二是人变傻,因为你并不知道真正发生了什么。

(一点牢骚也贴上来)
关于WEB开发的个人疑惑:

l 为了让开发更简单,我们不得不学习使用复杂的开发工具和框架,这到底是一个进步,还是退步?

l IDE让程序员变聪明还是变傻? 当我们在服务器代码里面就可以设计客户端界面,这是一个进步还是退步?

举个例子说,微软的ASP.NET AJAX,让我们可以在服务器端设计各种异步的控件。那么程序员甚至可以不会Javascript,不懂AJAX就设计出各种客户端效果。要是哪一天项目需要设计稍复杂的效果,靠IDE和框架无法自动完成,你要怎么办? 到这个时候再来学JS,也许就迟了。更可怕的是,技术在更新和淘汰,可能十年之后,你会发现自己除了各种IDE之后,真正精通的技术很少,脱离了IDE你写一个小程序都要查半天API手册,因为你平时都是依赖“自动补齐”来写代码的! 这样的情景,我想没有人愿意发生。

也许对于短期开发的项目来说,是一个进步,但对于程序员个人的成长来说,这并不是好事。对工具的依赖,导致了我们对于底层和核心技术的不求甚解,限制了个人的成长。




关于三种主流WEB架构的思考
Haohappy  haohappy AT msn.com
转载请注明来源:http://blog.youkuaiyun.com/haohappy2004

做WEB好几年了,各种语言和技术都稍有涉猎。今天心血来潮,突然想总结一下。其实不论什么技术,什么需求,通常WEB开发就是通过WEB前端管理一个或大或小或独立或分布式的关系型数据库,很多东西都是相通的。这里说的WEB架构,是指WEB应用开发中每种技术独有的资源组织形式(包括文件,数据库,HTTP请求处理等。注意并非OO的开发方式才有架构一说),也许说开发方式更容易让人理解一些。

以下想法主要以PHP实现为示例,但很多体会我想Java,.NET,Ruby开发者应该也很容易理解。最后是我对于刚面世就引起无数人关注的Delphi fo PHP的评测

WEB程序的架构基本上可以分成以下三类:

(一) 基于“WEB页面/文件”,例如CGI和PHP/ASP程序。程序的文件分别存储在不同的目录里,与URL相对应。当HTTP请求提交至服务器时,URL直接指向某个文件,然后由该文件来处理请求,并返回响应结果。

比如http://www.website.conm/news/readnews.php?id=1234

可以想像,我们在站点根目录的news目录下放置一个readnews.php文件。

这种开发方式最自然,最易理解,也是PHP最常用的方式。要注意产生的URL对搜索引擎不友好,不过你可以用服务器提供的URL重写方案来处理,例如Apache的mod_rewrite。

(二) 基于“动作”(Action)。这是MVC架构的WEB程序所采用的最常见的方式。目前主流的WEB框架像Struts、Webwork(Java),Ruby on Rails(Ruby),Zend Framework(PHP)等都采用这种设计。URL映射到控制器(controller)和控制器中的动作(action),由action来处理请求并输出响应结果。这种设计和上面的基于文件的方式一样,都是请求/响应驱动的方案,离不开HTTP。

比如 http://www.website.com/news/read/id/1234

可以想像在实际代码中,我们会有一个控制器newsController,其中有一个readAction。不同框架可能默认实现方式稍有不同,有的是一个Controller一个文件,其中有多个Action,有的是每个Action一个文件。当然这些你都可以自己控制,题外话。

这种方式的URL通常都很漂亮,对搜索引擎友好,因为很多框架都自带有URL重写功能。可以自由规定URL中controller、action及参数出现的位置。

另外,还有更直接的基于URL的设计方案,那就是REST。通过人为规定URL的构成形式(比如Action限制成只有几种)来促进网站之间的互相访问,降低开发的复杂性,提高系统的可伸缩性。REST对于Web Services来说是一个创新。

虽然本文讨论的是单个项目所采用的架构,而REST是为了解决网站之间的通讯问题,但REST的出现,会对单个项目的架构造成影响(很显然你在开发时就要构造规范的URL)。将来混用REST和MVC应该也是一种趋势。RoR提供很好的REST支持,Zend Framework也提供了Zend_Rest来支持REST,包括Server和Client。

(三) 基于“组件”(Component ,GUI设计也常称控件)、事件驱动的架构,最常见的是微软的.NET。基本思想是把程序分成很多组件,每个组件都可以触发事件,调用特定的事件处理器来处理(比如在一个HTML按钮上设置onClick事件链接到一个PHP函数)。这种设计远离HTTP,HTTP请求完全抽象,映射到一个事件。

事实上这种设计原本最常应用于传统桌面GUI程序的开发,例如Delphi,Java Swing等。所有表现层的组件比如窗口,或者HTML表单都可以由IDE来提供,我们只需要在IDE里点击或拖动鼠标就能够自动添加一个组件,并且添加一个相应的事件处理器。

这种开发方式有几个优点:

· 复用性 -代码高度可重用。

· 易于使用 -通常只需要配置控件的属性,编写相关的事件处理函数。

我个人也挺喜欢这种方式,PEAR就提供了相当强大的HTML_QuickForm,用于在页面添加表单元素及其事件处理函数,还可以与Smarty等模板引擎相结合。这对于项目开发来说是一个补充性的功能,在项目中的某些部份使用QuickForm,有时可以大大加快开发。

而完全基于组件和事件驱动的开发框架对于PHP来说也已经不新鲜,PRADO就是一个这样的框架,曾经得过Zend编程大赛的头奖。但目前来说很显然Prado所提倡的这种开发方式仍然没有被大部份PHP程序员所接受。为什么呢?

我觉得主要有以下两个问题:

(1)效率问题

这里指的不是开发效率,而是代码的执行效率。众所周知,正常情况下,PHP的执行是相当高效的。但是目前这种基于控件的框架效率都成问题。Prado本身提供了一个缓存机制来缓解这个问题。如果不采用缓存,可以说很多站点根本不能使用Prado这样的框架,比如门户网站,大型论坛等。

但ASP .NET不太一样,因为它是编译型的框架,最后生成的代码是编译生成的,不需要再次进行中间过程的诸多处理,所以在第一次执行之后速度会很快,执行效率还是很高的。 这是语言层次的功能,Prado无法通过代码层次的努力完全弥补。

(2)没有强大的IDE支持

设置控件的属性,添加其对应的事件处理器,看似简单,但控件多了,这也是个繁重的工作。.NET的强大就在于它把程序员从重复的工作中解放了出来,设置属性很方便,事件处理器也会自动添加。Prado目前没有这样的IDE支持。

总之,这种基于控件的框架比较适合于用户交互较多的,需要对页面中的很多组件设置不同处理操作,但对于性能要求不高的应用。另外,带有组件支持的框架通常对AJAX的支持都较好,比如.NET和Ruby on Rails。

综上,三种架构基本上可以代表目前的所有主流WEB开发方式,包括PHP,JavaEE,.NET,Ruby/RoR。

目前PHP开发的状况和未来的趋势:

平时做PHP比较多,特别总结一下PHP开发的趋势。目前在PHP开发中,我们最常用的是基于“文件”的架构,其实也就是一种“面向过程”的开发方式。通常我们写PHP程序的目的就是“快点上线,让程序跑起来”。而且大多数PHP程序员还要和HTML、CSS做近身搏斗,所以如果程序太抽象,调整视觉效果就比较困难。所以对于小项目,这是一个最好的选择。

但越来越多人认识到,面向对象和MVC框架更能促进代码的复用和分享,而且程序易于扩展,随着程序复杂性的增加这个趋势越明显。所以OO框架层出不穷。目前PHP框架当中最有前景的是CakePHP、Symphony和Zend Framework,各自拥有活跃的社区和庞大的用户群,都在快速成长当中。PHP的框架都避免走Java框架庞大臃肿的老路,致力于快速开发,而且主动模仿和吸收RoR这些优秀框架的新特性。随着PHP5的普及和这些框架的成熟,加上PHP原本开发社区的庞大人数,将来也许又会再产生出一些行业性的标准。

这种选择适合于中大型项目,特别是需要较大的团队合作和需要长期维护和二次开发情况。个人认为这是将来PHP开发的趋势。

而对于基于组件和事件驱动的开发方式大多数PHP程序员都不感兴趣。但是也有不少人在做这方面的努力,例如Codegear的Delphi for PHP,就吸引了很多人的关注。如果有强大的商业支持,也许将来在开发市场也会占一席之地。

我会在下一篇文章介绍D4P的新特性并作评测。

WEB开发的未来展望:

随着更贴近HTTP的REST的流行,我觉得像.NET和Java中的抽象组件的方式会受到冲击。因为这些组件并不如它们所承诺的那么方便。未来MVC+REST+RIA的模式应该会比较流行。

AJAX是一把双刃剑,尽管事件驱动的架构看起来非常适合于处理异步的请求(可以想像页面中存在几个组件,每个组件都可以触发异步请求,对应对服务器端的某个事件处理器,看起来是很理想的一个处理方式),但要为客户端自动生成良好的JavaScript代码是很不容易的,要满足各种浏览器的兼容性要求,还要能够自己进行扩展,以满足项目中千奇百怪的需求。 很多时候我更倾向于使用一些JS框架如Prototype来自己开发各种效果,而不是在服务器端生成。在服务器端生成JS的两个结果,一是对生成的代码不信任,二是人变傻,因为你并不知道真正发生了什么。

(一点牢骚也贴上来)
关于WEB开发的个人疑惑:

l 为了让开发更简单,我们不得不学习使用复杂的开发工具和框架,这到底是一个进步,还是退步?

l IDE让程序员变聪明还是变傻? 当我们在服务器代码里面就可以设计客户端界面,这是一个进步还是退步?

举个例子说,微软的ASP.NET AJAX,让我们可以在服务器端设计各种异步的控件。那么程序员甚至可以不会Javascript,不懂AJAX就设计出各种客户端效果。要是哪一天项目需要设计稍复杂的效果,靠IDE和框架无法自动完成,你要怎么办? 到这个时候再来学JS,也许就迟了。更可怕的是,技术在更新和淘汰,可能十年之后,你会发现自己除了各种IDE之后,真正精通的技术很少,脱离了IDE你写一个小程序都要查半天API手册,因为你平时都是依赖“自动补齐”来写代码的! 这样的情景,我想没有人愿意发生。

也许对于短期开发的项目来说,是一个进步,但对于程序员个人的成长来说,这并不是好事。对工具的依赖,导致了我们对于底层和核心技术的不求甚解,限制了个人的成长。




关于三种主流WEB架构的思考
Haohappy  haohappy AT msn.com
转载请注明来源:http://blog.youkuaiyun.com/haohappy2004

做WEB好几年了,各种语言和技术都稍有涉猎。今天心血来潮,突然想总结一下。其实不论什么技术,什么需求,通常WEB开发就是通过WEB前端管理一个或大或小或独立或分布式的关系型数据库,很多东西都是相通的。这里说的WEB架构,是指WEB应用开发中每种技术独有的资源组织形式(包括文件,数据库,HTTP请求处理等。注意并非OO的开发方式才有架构一说),也许说开发方式更容易让人理解一些。

以下想法主要以PHP实现为示例,但很多体会我想Java,.NET,Ruby开发者应该也很容易理解。最后是我对于刚面世就引起无数人关注的Delphi fo PHP的评测

WEB程序的架构基本上可以分成以下三类:

(一) 基于“WEB页面/文件”,例如CGI和PHP/ASP程序。程序的文件分别存储在不同的目录里,与URL相对应。当HTTP请求提交至服务器时,URL直接指向某个文件,然后由该文件来处理请求,并返回响应结果。

比如http://www.website.conm/news/readnews.php?id=1234

可以想像,我们在站点根目录的news目录下放置一个readnews.php文件。

这种开发方式最自然,最易理解,也是PHP最常用的方式。要注意产生的URL对搜索引擎不友好,不过你可以用服务器提供的URL重写方案来处理,例如Apache的mod_rewrite。

(二) 基于“动作”(Action)。这是MVC架构的WEB程序所采用的最常见的方式。目前主流的WEB框架像Struts、Webwork(Java),Ruby on Rails(Ruby),Zend Framework(PHP)等都采用这种设计。URL映射到控制器(controller)和控制器中的动作(action),由action来处理请求并输出响应结果。这种设计和上面的基于文件的方式一样,都是请求/响应驱动的方案,离不开HTTP。

比如 http://www.website.com/news/read/id/1234

可以想像在实际代码中,我们会有一个控制器newsController,其中有一个readAction。不同框架可能默认实现方式稍有不同,有的是一个Controller一个文件,其中有多个Action,有的是每个Action一个文件。当然这些你都可以自己控制,题外话。

这种方式的URL通常都很漂亮,对搜索引擎友好,因为很多框架都自带有URL重写功能。可以自由规定URL中controller、action及参数出现的位置。

另外,还有更直接的基于URL的设计方案,那就是REST。通过人为规定URL的构成形式(比如Action限制成只有几种)来促进网站之间的互相访问,降低开发的复杂性,提高系统的可伸缩性。REST对于Web Services来说是一个创新。

虽然本文讨论的是单个项目所采用的架构,而REST是为了解决网站之间的通讯问题,但REST的出现,会对单个项目的架构造成影响(很显然你在开发时就要构造规范的URL)。将来混用REST和MVC应该也是一种趋势。RoR提供很好的REST支持,Zend Framework也提供了Zend_Rest来支持REST,包括Server和Client。

(三) 基于“组件”(Component ,GUI设计也常称控件)、事件驱动的架构,最常见的是微软的.NET。基本思想是把程序分成很多组件,每个组件都可以触发事件,调用特定的事件处理器来处理(比如在一个HTML按钮上设置onClick事件链接到一个PHP函数)。这种设计远离HTTP,HTTP请求完全抽象,映射到一个事件。

事实上这种设计原本最常应用于传统桌面GUI程序的开发,例如Delphi,Java Swing等。所有表现层的组件比如窗口,或者HTML表单都可以由IDE来提供,我们只需要在IDE里点击或拖动鼠标就能够自动添加一个组件,并且添加一个相应的事件处理器。

这种开发方式有几个优点:

· 复用性 -代码高度可重用。

· 易于使用 -通常只需要配置控件的属性,编写相关的事件处理函数。

我个人也挺喜欢这种方式,PEAR就提供了相当强大的HTML_QuickForm,用于在页面添加表单元素及其事件处理函数,还可以与Smarty等模板引擎相结合。这对于项目开发来说是一个补充性的功能,在项目中的某些部份使用QuickForm,有时可以大大加快开发。

而完全基于组件和事件驱动的开发框架对于PHP来说也已经不新鲜,PRADO就是一个这样的框架,曾经得过Zend编程大赛的头奖。但目前来说很显然Prado所提倡的这种开发方式仍然没有被大部份PHP程序员所接受。为什么呢?

我觉得主要有以下两个问题:

(1)效率问题

这里指的不是开发效率,而是代码的执行效率。众所周知,正常情况下,PHP的执行是相当高效的。但是目前这种基于控件的框架效率都成问题。Prado本身提供了一个缓存机制来缓解这个问题。如果不采用缓存,可以说很多站点根本不能使用Prado这样的框架,比如门户网站,大型论坛等。

但ASP .NET不太一样,因为它是编译型的框架,最后生成的代码是编译生成的,不需要再次进行中间过程的诸多处理,所以在第一次执行之后速度会很快,执行效率还是很高的。 这是语言层次的功能,Prado无法通过代码层次的努力完全弥补。

(2)没有强大的IDE支持

设置控件的属性,添加其对应的事件处理器,看似简单,但控件多了,这也是个繁重的工作。.NET的强大就在于它把程序员从重复的工作中解放了出来,设置属性很方便,事件处理器也会自动添加。Prado目前没有这样的IDE支持。

总之,这种基于控件的框架比较适合于用户交互较多的,需要对页面中的很多组件设置不同处理操作,但对于性能要求不高的应用。另外,带有组件支持的框架通常对AJAX的支持都较好,比如.NET和Ruby on Rails。

综上,三种架构基本上可以代表目前的所有主流WEB开发方式,包括PHP,JavaEE,.NET,Ruby/RoR。

目前PHP开发的状况和未来的趋势:

平时做PHP比较多,特别总结一下PHP开发的趋势。目前在PHP开发中,我们最常用的是基于“文件”的架构,其实也就是一种“面向过程”的开发方式。通常我们写PHP程序的目的就是“快点上线,让程序跑起来”。而且大多数PHP程序员还要和HTML、CSS做近身搏斗,所以如果程序太抽象,调整视觉效果就比较困难。所以对于小项目,这是一个最好的选择。

但越来越多人认识到,面向对象和MVC框架更能促进代码的复用和分享,而且程序易于扩展,随着程序复杂性的增加这个趋势越明显。所以OO框架层出不穷。目前PHP框架当中最有前景的是CakePHP、Symphony和Zend Framework,各自拥有活跃的社区和庞大的用户群,都在快速成长当中。PHP的框架都避免走Java框架庞大臃肿的老路,致力于快速开发,而且主动模仿和吸收RoR这些优秀框架的新特性。随着PHP5的普及和这些框架的成熟,加上PHP原本开发社区的庞大人数,将来也许又会再产生出一些行业性的标准。

这种选择适合于中大型项目,特别是需要较大的团队合作和需要长期维护和二次开发情况。个人认为这是将来PHP开发的趋势。

而对于基于组件和事件驱动的开发方式大多数PHP程序员都不感兴趣。但是也有不少人在做这方面的努力,例如Codegear的Delphi for PHP,就吸引了很多人的关注。如果有强大的商业支持,也许将来在开发市场也会占一席之地。

我会在下一篇文章介绍D4P的新特性并作评测。

WEB开发的未来展望:

随着更贴近HTTP的REST的流行,我觉得像.NET和Java中的抽象组件的方式会受到冲击。因为这些组件并不如它们所承诺的那么方便。未来MVC+REST+RIA的模式应该会比较流行。

AJAX是一把双刃剑,尽管事件驱动的架构看起来非常适合于处理异步的请求(可以想像页面中存在几个组件,每个组件都可以触发异步请求,对应对服务器端的某个事件处理器,看起来是很理想的一个处理方式),但要为客户端自动生成良好的JavaScript代码是很不容易的,要满足各种浏览器的兼容性要求,还要能够自己进行扩展,以满足项目中千奇百怪的需求。 很多时候我更倾向于使用一些JS框架如Prototype来自己开发各种效果,而不是在服务器端生成。在服务器端生成JS的两个结果,一是对生成的代码不信任,二是人变傻,因为你并不知道真正发生了什么。

(一点牢骚也贴上来)
关于WEB开发的个人疑惑:

l 为了让开发更简单,我们不得不学习使用复杂的开发工具和框架,这到底是一个进步,还是退步?

l IDE让程序员变聪明还是变傻? 当我们在服务器代码里面就可以设计客户端界面,这是一个进步还是退步?

举个例子说,微软的ASP.NET AJAX,让我们可以在服务器端设计各种异步的控件。那么程序员甚至可以不会Javascript,不懂AJAX就设计出各种客户端效果。要是哪一天项目需要设计稍复杂的效果,靠IDE和框架无法自动完成,你要怎么办? 到这个时候再来学JS,也许就迟了。更可怕的是,技术在更新和淘汰,可能十年之后,你会发现自己除了各种IDE之后,真正精通的技术很少,脱离了IDE你写一个小程序都要查半天API手册,因为你平时都是依赖“自动补齐”来写代码的! 这样的情景,我想没有人愿意发生。

也许对于短期开发的项目来说,是一个进步,但对于程序员个人的成长来说,这并不是好事。对工具的依赖,导致了我们对于底层和核心技术的不求甚解,限制了个人的成长。




关于三种主流WEB架构的思考
Haohappy  haohappy AT msn.com
转载请注明来源:http://blog.youkuaiyun.com/haohappy2004

做WEB好几年了,各种语言和技术都稍有涉猎。今天心血来潮,突然想总结一下。其实不论什么技术,什么需求,通常WEB开发就是通过WEB前端管理一个或大或小或独立或分布式的关系型数据库,很多东西都是相通的。这里说的WEB架构,是指WEB应用开发中每种技术独有的资源组织形式(包括文件,数据库,HTTP请求处理等。注意并非OO的开发方式才有架构一说),也许说开发方式更容易让人理解一些。

以下想法主要以PHP实现为示例,但很多体会我想Java,.NET,Ruby开发者应该也很容易理解。最后是我对于刚面世就引起无数人关注的Delphi fo PHP的评测

WEB程序的架构基本上可以分成以下三类:

(一) 基于“WEB页面/文件”,例如CGI和PHP/ASP程序。程序的文件分别存储在不同的目录里,与URL相对应。当HTTP请求提交至服务器时,URL直接指向某个文件,然后由该文件来处理请求,并返回响应结果。

比如http://www.website.conm/news/readnews.php?id=1234

可以想像,我们在站点根目录的news目录下放置一个readnews.php文件。

这种开发方式最自然,最易理解,也是PHP最常用的方式。要注意产生的URL对搜索引擎不友好,不过你可以用服务器提供的URL重写方案来处理,例如Apache的mod_rewrite。

(二) 基于“动作”(Action)。这是MVC架构的WEB程序所采用的最常见的方式。目前主流的WEB框架像Struts、Webwork(Java),Ruby on Rails(Ruby),Zend Framework(PHP)等都采用这种设计。URL映射到控制器(controller)和控制器中的动作(action),由action来处理请求并输出响应结果。这种设计和上面的基于文件的方式一样,都是请求/响应驱动的方案,离不开HTTP。

比如 http://www.website.com/news/read/id/1234

可以想像在实际代码中,我们会有一个控制器newsController,其中有一个readAction。不同框架可能默认实现方式稍有不同,有的是一个Controller一个文件,其中有多个Action,有的是每个Action一个文件。当然这些你都可以自己控制,题外话。

这种方式的URL通常都很漂亮,对搜索引擎友好,因为很多框架都自带有URL重写功能。可以自由规定URL中controller、action及参数出现的位置。

另外,还有更直接的基于URL的设计方案,那就是REST。通过人为规定URL的构成形式(比如Action限制成只有几种)来促进网站之间的互相访问,降低开发的复杂性,提高系统的可伸缩性。REST对于Web Services来说是一个创新。

虽然本文讨论的是单个项目所采用的架构,而REST是为了解决网站之间的通讯问题,但REST的出现,会对单个项目的架构造成影响(很显然你在开发时就要构造规范的URL)。将来混用REST和MVC应该也是一种趋势。RoR提供很好的REST支持,Zend Framework也提供了Zend_Rest来支持REST,包括Server和Client。

(三) 基于“组件”(Component ,GUI设计也常称控件)、事件驱动的架构,最常见的是微软的.NET。基本思想是把程序分成很多组件,每个组件都可以触发事件,调用特定的事件处理器来处理(比如在一个HTML按钮上设置onClick事件链接到一个PHP函数)。这种设计远离HTTP,HTTP请求完全抽象,映射到一个事件。

事实上这种设计原本最常应用于传统桌面GUI程序的开发,例如Delphi,Java Swing等。所有表现层的组件比如窗口,或者HTML表单都可以由IDE来提供,我们只需要在IDE里点击或拖动鼠标就能够自动添加一个组件,并且添加一个相应的事件处理器。

这种开发方式有几个优点:

· 复用性 -代码高度可重用。

· 易于使用 -通常只需要配置控件的属性,编写相关的事件处理函数。

我个人也挺喜欢这种方式,PEAR就提供了相当强大的HTML_QuickForm,用于在页面添加表单元素及其事件处理函数,还可以与Smarty等模板引擎相结合。这对于项目开发来说是一个补充性的功能,在项目中的某些部份使用QuickForm,有时可以大大加快开发。

而完全基于组件和事件驱动的开发框架对于PHP来说也已经不新鲜,PRADO就是一个这样的框架,曾经得过Zend编程大赛的头奖。但目前来说很显然Prado所提倡的这种开发方式仍然没有被大部份PHP程序员所接受。为什么呢?

我觉得主要有以下两个问题:

(1)效率问题

这里指的不是开发效率,而是代码的执行效率。众所周知,正常情况下,PHP的执行是相当高效的。但是目前这种基于控件的框架效率都成问题。Prado本身提供了一个缓存机制来缓解这个问题。如果不采用缓存,可以说很多站点根本不能使用Prado这样的框架,比如门户网站,大型论坛等。

但ASP .NET不太一样,因为它是编译型的框架,最后生成的代码是编译生成的,不需要再次进行中间过程的诸多处理,所以在第一次执行之后速度会很快,执行效率还是很高的。 这是语言层次的功能,Prado无法通过代码层次的努力完全弥补。

(2)没有强大的IDE支持

设置控件的属性,添加其对应的事件处理器,看似简单,但控件多了,这也是个繁重的工作。.NET的强大就在于它把程序员从重复的工作中解放了出来,设置属性很方便,事件处理器也会自动添加。Prado目前没有这样的IDE支持。

总之,这种基于控件的框架比较适合于用户交互较多的,需要对页面中的很多组件设置不同处理操作,但对于性能要求不高的应用。另外,带有组件支持的框架通常对AJAX的支持都较好,比如.NET和Ruby on Rails。

综上,三种架构基本上可以代表目前的所有主流WEB开发方式,包括PHP,JavaEE,.NET,Ruby/RoR。

目前PHP开发的状况和未来的趋势:

平时做PHP比较多,特别总结一下PHP开发的趋势。目前在PHP开发中,我们最常用的是基于“文件”的架构,其实也就是一种“面向过程”的开发方式。通常我们写PHP程序的目的就是“快点上线,让程序跑起来”。而且大多数PHP程序员还要和HTML、CSS做近身搏斗,所以如果程序太抽象,调整视觉效果就比较困难。所以对于小项目,这是一个最好的选择。

但越来越多人认识到,面向对象和MVC框架更能促进代码的复用和分享,而且程序易于扩展,随着程序复杂性的增加这个趋势越明显。所以OO框架层出不穷。目前PHP框架当中最有前景的是CakePHP、Symphony和Zend Framework,各自拥有活跃的社区和庞大的用户群,都在快速成长当中。PHP的框架都避免走Java框架庞大臃肿的老路,致力于快速开发,而且主动模仿和吸收RoR这些优秀框架的新特性。随着PHP5的普及和这些框架的成熟,加上PHP原本开发社区的庞大人数,将来也许又会再产生出一些行业性的标准。

这种选择适合于中大型项目,特别是需要较大的团队合作和需要长期维护和二次开发情况。个人认为这是将来PHP开发的趋势。

而对于基于组件和事件驱动的开发方式大多数PHP程序员都不感兴趣。但是也有不少人在做这方面的努力,例如Codegear的Delphi for PHP,就吸引了很多人的关注。如果有强大的商业支持,也许将来在开发市场也会占一席之地。

我会在下一篇文章介绍D4P的新特性并作评测。

WEB开发的未来展望:

随着更贴近HTTP的REST的流行,我觉得像.NET和Java中的抽象组件的方式会受到冲击。因为这些组件并不如它们所承诺的那么方便。未来MVC+REST+RIA的模式应该会比较流行。

AJAX是一把双刃剑,尽管事件驱动的架构看起来非常适合于处理异步的请求(可以想像页面中存在几个组件,每个组件都可以触发异步请求,对应对服务器端的某个事件处理器,看起来是很理想的一个处理方式),但要为客户端自动生成良好的JavaScript代码是很不容易的,要满足各种浏览器的兼容性要求,还要能够自己进行扩展,以满足项目中千奇百怪的需求。 很多时候我更倾向于使用一些JS框架如Prototype来自己开发各种效果,而不是在服务器端生成。在服务器端生成JS的两个结果,一是对生成的代码不信任,二是人变傻,因为你并不知道真正发生了什么。

(一点牢骚也贴上来)
关于WEB开发的个人疑惑:

l 为了让开发更简单,我们不得不学习使用复杂的开发工具和框架,这到底是一个进步,还是退步?

l IDE让程序员变聪明还是变傻? 当我们在服务器代码里面就可以设计客户端界面,这是一个进步还是退步?

举个例子说,微软的ASP.NET AJAX,让我们可以在服务器端设计各种异步的控件。那么程序员甚至可以不会Javascript,不懂AJAX就设计出各种客户端效果。要是哪一天项目需要设计稍复杂的效果,靠IDE和框架无法自动完成,你要怎么办? 到这个时候再来学JS,也许就迟了。更可怕的是,技术在更新和淘汰,可能十年之后,你会发现自己除了各种IDE之后,真正精通的技术很少,脱离了IDE你写一个小程序都要查半天API手册,因为你平时都是依赖“自动补齐”来写代码的! 这样的情景,我想没有人愿意发生。

也许对于短期开发的项目来说,是一个进步,但对于程序员个人的成长来说,这并不是好事。对工具的依赖,导致了我们对于底层和核心技术的不求甚解,限制了个人的成长。




关于三种主流WEB架构的思考
Haohappy  haohappy AT msn.com
转载请注明来源:http://blog.youkuaiyun.com/haohappy2004

做WEB好几年了,各种语言和技术都稍有涉猎。今天心血来潮,突然想总结一下。其实不论什么技术,什么需求,通常WEB开发就是通过WEB前端管理一个或大或小或独立或分布式的关系型数据库,很多东西都是相通的。这里说的WEB架构,是指WEB应用开发中每种技术独有的资源组织形式(包括文件,数据库,HTTP请求处理等。注意并非OO的开发方式才有架构一说),也许说开发方式更容易让人理解一些。

以下想法主要以PHP实现为示例,但很多体会我想Java,.NET,Ruby开发者应该也很容易理解。最后是我对于刚面世就引起无数人关注的Delphi fo PHP的评测

WEB程序的架构基本上可以分成以下三类:

(一) 基于“WEB页面/文件”,例如CGI和PHP/ASP程序。程序的文件分别存储在不同的目录里,与URL相对应。当HTTP请求提交至服务器时,URL直接指向某个文件,然后由该文件来处理请求,并返回响应结果。

比如http://www.website.conm/news/readnews.php?id=1234

可以想像,我们在站点根目录的news目录下放置一个readnews.php文件。

这种开发方式最自然,最易理解,也是PHP最常用的方式。要注意产生的URL对搜索引擎不友好,不过你可以用服务器提供的URL重写方案来处理,例如Apache的mod_rewrite。

(二) 基于“动作”(Action)。这是MVC架构的WEB程序所采用的最常见的方式。目前主流的WEB框架像Struts、Webwork(Java),Ruby on Rails(Ruby),Zend Framework(PHP)等都采用这种设计。URL映射到控制器(controller)和控制器中的动作(action),由action来处理请求并输出响应结果。这种设计和上面的基于文件的方式一样,都是请求/响应驱动的方案,离不开HTTP。

比如 http://www.website.com/news/read/id/1234

可以想像在实际代码中,我们会有一个控制器newsController,其中有一个readAction。不同框架可能默认实现方式稍有不同,有的是一个Controller一个文件,其中有多个Action,有的是每个Action一个文件。当然这些你都可以自己控制,题外话。

这种方式的URL通常都很漂亮,对搜索引擎友好,因为很多框架都自带有URL重写功能。可以自由规定URL中controller、action及参数出现的位置。

另外,还有更直接的基于URL的设计方案,那就是REST。通过人为规定URL的构成形式(比如Action限制成只有几种)来促进网站之间的互相访问,降低开发的复杂性,提高系统的可伸缩性。REST对于Web Services来说是一个创新。

虽然本文讨论的是单个项目所采用的架构,而REST是为了解决网站之间的通讯问题,但REST的出现,会对单个项目的架构造成影响(很显然你在开发时就要构造规范的URL)。将来混用REST和MVC应该也是一种趋势。RoR提供很好的REST支持,Zend Framework也提供了Zend_Rest来支持REST,包括Server和Client。

(三) 基于“组件”(Component ,GUI设计也常称控件)、事件驱动的架构,最常见的是微软的.NET。基本思想是把程序分成很多组件,每个组件都可以触发事件,调用特定的事件处理器来处理(比如在一个HTML按钮上设置onClick事件链接到一个PHP函数)。这种设计远离HTTP,HTTP请求完全抽象,映射到一个事件。

事实上这种设计原本最常应用于传统桌面GUI程序的开发,例如Delphi,Java Swing等。所有表现层的组件比如窗口,或者HTML表单都可以由IDE来提供,我们只需要在IDE里点击或拖动鼠标就能够自动添加一个组件,并且添加一个相应的事件处理器。

这种开发方式有几个优点:

· 复用性 -代码高度可重用。

· 易于使用 -通常只需要配置控件的属性,编写相关的事件处理函数。

我个人也挺喜欢这种方式,PEAR就提供了相当强大的HTML_QuickForm,用于在页面添加表单元素及其事件处理函数,还可以与Smarty等模板引擎相结合。这对于项目开发来说是一个补充性的功能,在项目中的某些部份使用QuickForm,有时可以大大加快开发。

而完全基于组件和事件驱动的开发框架对于PHP来说也已经不新鲜,PRADO就是一个这样的框架,曾经得过Zend编程大赛的头奖。但目前来说很显然Prado所提倡的这种开发方式仍然没有被大部份PHP程序员所接受。为什么呢?

我觉得主要有以下两个问题:

(1)效率问题

这里指的不是开发效率,而是代码的执行效率。众所周知,正常情况下,PHP的执行是相当高效的。但是目前这种基于控件的框架效率都成问题。Prado本身提供了一个缓存机制来缓解这个问题。如果不采用缓存,可以说很多站点根本不能使用Prado这样的框架,比如门户网站,大型论坛等。

但ASP .NET不太一样,因为它是编译型的框架,最后生成的代码是编译生成的,不需要再次进行中间过程的诸多处理,所以在第一次执行之后速度会很快,执行效率还是很高的。 这是语言层次的功能,Prado无法通过代码层次的努力完全弥补。

(2)没有强大的IDE支持

设置控件的属性,添加其对应的事件处理器,看似简单,但控件多了,这也是个繁重的工作。.NET的强大就在于它把程序员从重复的工作中解放了出来,设置属性很方便,事件处理器也会自动添加。Prado目前没有这样的IDE支持。

总之,这种基于控件的框架比较适合于用户交互较多的,需要对页面中的很多组件设置不同处理操作,但对于性能要求不高的应用。另外,带有组件支持的框架通常对AJAX的支持都较好,比如.NET和Ruby on Rails。

综上,三种架构基本上可以代表目前的所有主流WEB开发方式,包括PHP,JavaEE,.NET,Ruby/RoR。

目前PHP开发的状况和未来的趋势:

平时做PHP比较多,特别总结一下PHP开发的趋势。目前在PHP开发中,我们最常用的是基于“文件”的架构,其实也就是一种“面向过程”的开发方式。通常我们写PHP程序的目的就是“快点上线,让程序跑起来”。而且大多数PHP程序员还要和HTML、CSS做近身搏斗,所以如果程序太抽象,调整视觉效果就比较困难。所以对于小项目,这是一个最好的选择。

但越来越多人认识到,面向对象和MVC框架更能促进代码的复用和分享,而且程序易于扩展,随着程序复杂性的增加这个趋势越明显。所以OO框架层出不穷。目前PHP框架当中最有前景的是CakePHP、Symphony和Zend Framework,各自拥有活跃的社区和庞大的用户群,都在快速成长当中。PHP的框架都避免走Java框架庞大臃肿的老路,致力于快速开发,而且主动模仿和吸收RoR这些优秀框架的新特性。随着PHP5的普及和这些框架的成熟,加上PHP原本开发社区的庞大人数,将来也许又会再产生出一些行业性的标准。

这种选择适合于中大型项目,特别是需要较大的团队合作和需要长期维护和二次开发情况。个人认为这是将来PHP开发的趋势。

而对于基于组件和事件驱动的开发方式大多数PHP程序员都不感兴趣。但是也有不少人在做这方面的努力,例如Codegear的Delphi for PHP,就吸引了很多人的关注。如果有强大的商业支持,也许将来在开发市场也会占一席之地。

我会在下一篇文章介绍D4P的新特性并作评测。

WEB开发的未来展望:

随着更贴近HTTP的REST的流行,我觉得像.NET和Java中的抽象组件的方式会受到冲击。因为这些组件并不如它们所承诺的那么方便。未来MVC+REST+RIA的模式应该会比较流行。

AJAX是一把双刃剑,尽管事件驱动的架构看起来非常适合于处理异步的请求(可以想像页面中存在几个组件,每个组件都可以触发异步请求,对应对服务器端的某个事件处理器,看起来是很理想的一个处理方式),但要为客户端自动生成良好的JavaScript代码是很不容易的,要满足各种浏览器的兼容性要求,还要能够自己进行扩展,以满足项目中千奇百怪的需求。 很多时候我更倾向于使用一些JS框架如Prototype来自己开发各种效果,而不是在服务器端生成。在服务器端生成JS的两个结果,一是对生成的代码不信任,二是人变傻,因为你并不知道真正发生了什么。

(一点牢骚也贴上来)
关于WEB开发的个人疑惑:

l 为了让开发更简单,我们不得不学习使用复杂的开发工具和框架,这到底是一个进步,还是退步?

l IDE让程序员变聪明还是变傻? 当我们在服务器代码里面就可以设计客户端界面,这是一个进步还是退步?

举个例子说,微软的ASP.NET AJAX,让我们可以在服务器端设计各种异步的控件。那么程序员甚至可以不会Javascript,不懂AJAX就设计出各种客户端效果。要是哪一天项目需要设计稍复杂的效果,靠IDE和框架无法自动完成,你要怎么办? 到这个时候再来学JS,也许就迟了。更可怕的是,技术在更新和淘汰,可能十年之后,你会发现自己除了各种IDE之后,真正精通的技术很少,脱离了IDE你写一个小程序都要查半天API手册,因为你平时都是依赖“自动补齐”来写代码的! 这样的情景,我想没有人愿意发生。

也许对于短期开发的项目来说,是一个进步,但对于程序员个人的成长来说,这并不是好事。对工具的依赖,导致了我们对于底层和核心技术的不求甚解,限制了个人的成长。




关于三种主流WEB架构的思考
Haohappy  haohappy AT msn.com
转载请注明来源:http://blog.youkuaiyun.com/haohappy2004

做WEB好几年了,各种语言和技术都稍有涉猎。今天心血来潮,突然想总结一下。其实不论什么技术,什么需求,通常WEB开发就是通过WEB前端管理一个或大或小或独立或分布式的关系型数据库,很多东西都是相通的。这里说的WEB架构,是指WEB应用开发中每种技术独有的资源组织形式(包括文件,数据库,HTTP请求处理等。注意并非OO的开发方式才有架构一说),也许说开发方式更容易让人理解一些。

以下想法主要以PHP实现为示例,但很多体会我想Java,.NET,Ruby开发者应该也很容易理解。最后是我对于刚面世就引起无数人关注的Delphi fo PHP的评测

WEB程序的架构基本上可以分成以下三类:

(一) 基于“WEB页面/文件”,例如CGI和PHP/ASP程序。程序的文件分别存储在不同的目录里,与URL相对应。当HTTP请求提交至服务器时,URL直接指向某个文件,然后由该文件来处理请求,并返回响应结果。

比如http://www.website.conm/news/readnews.php?id=1234

可以想像,我们在站点根目录的news目录下放置一个readnews.php文件。

这种开发方式最自然,最易理解,也是PHP最常用的方式。要注意产生的URL对搜索引擎不友好,不过你可以用服务器提供的URL重写方案来处理,例如Apache的mod_rewrite。

(二) 基于“动作”(Action)。这是MVC架构的WEB程序所采用的最常见的方式。目前主流的WEB框架像Struts、Webwork(Java),Ruby on Rails(Ruby),Zend Framework(PHP)等都采用这种设计。URL映射到控制器(controller)和控制器中的动作(action),由action来处理请求并输出响应结果。这种设计和上面的基于文件的方式一样,都是请求/响应驱动的方案,离不开HTTP。

比如 http://www.website.com/news/read/id/1234

可以想像在实际代码中,我们会有一个控制器newsController,其中有一个readAction。不同框架可能默认实现方式稍有不同,有的是一个Controller一个文件,其中有多个Action,有的是每个Action一个文件。当然这些你都可以自己控制,题外话。

这种方式的URL通常都很漂亮,对搜索引擎友好,因为很多框架都自带有URL重写功能。可以自由规定URL中controller、action及参数出现的位置。

另外,还有更直接的基于URL的设计方案,那就是REST。通过人为规定URL的构成形式(比如Action限制成只有几种)来促进网站之间的互相访问,降低开发的复杂性,提高系统的可伸缩性。REST对于Web Services来说是一个创新。

虽然本文讨论的是单个项目所采用的架构,而REST是为了解决网站之间的通讯问题,但REST的出现,会对单个项目的架构造成影响(很显然你在开发时就要构造规范的URL)。将来混用REST和MVC应该也是一种趋势。RoR提供很好的REST支持,Zend Framework也提供了Zend_Rest来支持REST,包括Server和Client。

(三) 基于“组件”(Component ,GUI设计也常称控件)、事件驱动的架构,最常见的是微软的.NET。基本思想是把程序分成很多组件,每个组件都可以触发事件,调用特定的事件处理器来处理(比如在一个HTML按钮上设置onClick事件链接到一个PHP函数)。这种设计远离HTTP,HTTP请求完全抽象,映射到一个事件。

事实上这种设计原本最常应用于传统桌面GUI程序的开发,例如Delphi,Java Swing等。所有表现层的组件比如窗口,或者HTML表单都可以由IDE来提供,我们只需要在IDE里点击或拖动鼠标就能够自动添加一个组件,并且添加一个相应的事件处理器。

这种开发方式有几个优点:

· 复用性 -代码高度可重用。

· 易于使用 -通常只需要配置控件的属性,编写相关的事件处理函数。

我个人也挺喜欢这种方式,PEAR就提供了相当强大的HTML_QuickForm,用于在页面添加表单元素及其事件处理函数,还可以与Smarty等模板引擎相结合。这对于项目开发来说是一个补充性的功能,在项目中的某些部份使用QuickForm,有时可以大大加快开发。

而完全基于组件和事件驱动的开发框架对于PHP来说也已经不新鲜,PRADO就是一个这样的框架,曾经得过Zend编程大赛的头奖。但目前来说很显然Prado所提倡的这种开发方式仍然没有被大部份PHP程序员所接受。为什么呢?

我觉得主要有以下两个问题:

(1)效率问题

这里指的不是开发效率,而是代码的执行效率。众所周知,正常情况下,PHP的执行是相当高效的。但是目前这种基于控件的框架效率都成问题。Prado本身提供了一个缓存机制来缓解这个问题。如果不采用缓存,可以说很多站点根本不能使用Prado这样的框架,比如门户网站,大型论坛等。

但ASP .NET不太一样,因为它是编译型的框架,最后生成的代码是编译生成的,不需要再次进行中间过程的诸多处理,所以在第一次执行之后速度会很快,执行效率还是很高的。 这是语言层次的功能,Prado无法通过代码层次的努力完全弥补。

(2)没有强大的IDE支持

设置控件的属性,添加其对应的事件处理器,看似简单,但控件多了,这也是个繁重的工作。.NET的强大就在于它把程序员从重复的工作中解放了出来,设置属性很方便,事件处理器也会自动添加。Prado目前没有这样的IDE支持。

总之,这种基于控件的框架比较适合于用户交互较多的,需要对页面中的很多组件设置不同处理操作,但对于性能要求不高的应用。另外,带有组件支持的框架通常对AJAX的支持都较好,比如.NET和Ruby on Rails。

综上,三种架构基本上可以代表目前的所有主流WEB开发方式,包括PHP,JavaEE,.NET,Ruby/RoR。

目前PHP开发的状况和未来的趋势:

平时做PHP比较多,特别总结一下PHP开发的趋势。目前在PHP开发中,我们最常用的是基于“文件”的架构,其实也就是一种“面向过程”的开发方式。通常我们写PHP程序的目的就是“快点上线,让程序跑起来”。而且大多数PHP程序员还要和HTML、CSS做近身搏斗,所以如果程序太抽象,调整视觉效果就比较困难。所以对于小项目,这是一个最好的选择。

但越来越多人认识到,面向对象和MVC框架更能促进代码的复用和分享,而且程序易于扩展,随着程序复杂性的增加这个趋势越明显。所以OO框架层出不穷。目前PHP框架当中最有前景的是CakePHP、Symphony和Zend Framework,各自拥有活跃的社区和庞大的用户群,都在快速成长当中。PHP的框架都避免走Java框架庞大臃肿的老路,致力于快速开发,而且主动模仿和吸收RoR这些优秀框架的新特性。随着PHP5的普及和这些框架的成熟,加上PHP原本开发社区的庞大人数,将来也许又会再产生出一些行业性的标准。

这种选择适合于中大型项目,特别是需要较大的团队合作和需要长期维护和二次开发情况。个人认为这是将来PHP开发的趋势。

而对于基于组件和事件驱动的开发方式大多数PHP程序员都不感兴趣。但是也有不少人在做这方面的努力,例如Codegear的Delphi for PHP,就吸引了很多人的关注。如果有强大的商业支持,也许将来在开发市场也会占一席之地。

我会在下一篇文章介绍D4P的新特性并作评测。

WEB开发的未来展望:

随着更贴近HTTP的REST的流行,我觉得像.NET和Java中的抽象组件的方式会受到冲击。因为这些组件并不如它们所承诺的那么方便。未来MVC+REST+RIA的模式应该会比较流行。

AJAX是一把双刃剑,尽管事件驱动的架构看起来非常适合于处理异步的请求(可以想像页面中存在几个组件,每个组件都可以触发异步请求,对应对服务器端的某个事件处理器,看起来是很理想的一个处理方式),但要为客户端自动生成良好的JavaScript代码是很不容易的,要满足各种浏览器的兼容性要求,还要能够自己进行扩展,以满足项目中千奇百怪的需求。 很多时候我更倾向于使用一些JS框架如Prototype来自己开发各种效果,而不是在服务器端生成。在服务器端生成JS的两个结果,一是对生成的代码不信任,二是人变傻,因为你并不知道真正发生了什么。

(一点牢骚也贴上来)
关于WEB开发的个人疑惑:

l 为了让开发更简单,我们不得不学习使用复杂的开发工具和框架,这到底是一个进步,还是退步?

l IDE让程序员变聪明还是变傻? 当我们在服务器代码里面就可以设计客户端界面,这是一个进步还是退步?

举个例子说,微软的ASP.NET AJAX,让我们可以在服务器端设计各种异步的控件。那么程序员甚至可以不会Javascript,不懂AJAX就设计出各种客户端效果。要是哪一天项目需要设计稍复杂的效果,靠IDE和框架无法自动完成,你要怎么办? 到这个时候再来学JS,也许就迟了。更可怕的是,技术在更新和淘汰,可能十年之后,你会发现自己除了各种IDE之后,真正精通的技术很少,脱离了IDE你写一个小程序都要查半天API手册,因为你平时都是依赖“自动补齐”来写代码的! 这样的情景,我想没有人愿意发生。

也许对于短期开发的项目来说,是一个进步,但对于程序员个人的成长来说,这并不是好事。对工具的依赖,导致了我们对于底层和核心技术的不求甚解,限制了个人的成长。




关于三种主流WEB架构的思考
Haohappy  haohappy AT msn.com
转载请注明来源:http://blog.youkuaiyun.com/haohappy2004

做WEB好几年了,各种语言和技术都稍有涉猎。今天心血来潮,突然想总结一下。其实不论什么技术,什么需求,通常WEB开发就是通过WEB前端管理一个或大或小或独立或分布式的关系型数据库,很多东西都是相通的。这里说的WEB架构,是指WEB应用开发中每种技术独有的资源组织形式(包括文件,数据库,HTTP请求处理等。注意并非OO的开发方式才有架构一说),也许说开发方式更容易让人理解一些。

以下想法主要以PHP实现为示例,但很多体会我想Java,.NET,Ruby开发者应该也很容易理解。最后是我对于刚面世就引起无数人关注的Delphi fo PHP的评测

WEB程序的架构基本上可以分成以下三类:

(一) 基于“WEB页面/文件”,例如CGI和PHP/ASP程序。程序的文件分别存储在不同的目录里,与URL相对应。当HTTP请求提交至服务器时,URL直接指向某个文件,然后由该文件来处理请求,并返回响应结果。

比如http://www.website.conm/news/readnews.php?id=1234

可以想像,我们在站点根目录的news目录下放置一个readnews.php文件。

这种开发方式最自然,最易理解,也是PHP最常用的方式。要注意产生的URL对搜索引擎不友好,不过你可以用服务器提供的URL重写方案来处理,例如Apache的mod_rewrite。

(二) 基于“动作”(Action)。这是MVC架构的WEB程序所采用的最常见的方式。目前主流的WEB框架像Struts、Webwork(Java),Ruby on Rails(Ruby),Zend Framework(PHP)等都采用这种设计。URL映射到控制器(controller)和控制器中的动作(action),由action来处理请求并输出响应结果。这种设计和上面的基于文件的方式一样,都是请求/响应驱动的方案,离不开HTTP。

比如 http://www.website.com/news/read/id/1234

可以想像在实际代码中,我们会有一个控制器newsController,其中有一个readAction。不同框架可能默认实现方式稍有不同,有的是一个Controller一个文件,其中有多个Action,有的是每个Action一个文件。当然这些你都可以自己控制,题外话。

这种方式的URL通常都很漂亮,对搜索引擎友好,因为很多框架都自带有URL重写功能。可以自由规定URL中controller、action及参数出现的位置。

另外,还有更直接的基于URL的设计方案,那就是REST。通过人为规定URL的构成形式(比如Action限制成只有几种)来促进网站之间的互相访问,降低开发的复杂性,提高系统的可伸缩性。REST对于Web Services来说是一个创新。

虽然本文讨论的是单个项目所采用的架构,而REST是为了解决网站之间的通讯问题,但REST的出现,会对单个项目的架构造成影响(很显然你在开发时就要构造规范的URL)。将来混用REST和MVC应该也是一种趋势。RoR提供很好的REST支持,Zend Framework也提供了Zend_Rest来支持REST,包括Server和Client。

(三) 基于“组件”(Component ,GUI设计也常称控件)、事件驱动的架构,最常见的是微软的.NET。基本思想是把程序分成很多组件,每个组件都可以触发事件,调用特定的事件处理器来处理(比如在一个HTML按钮上设置onClick事件链接到一个PHP函数)。这种设计远离HTTP,HTTP请求完全抽象,映射到一个事件。

事实上这种设计原本最常应用于传统桌面GUI程序的开发,例如Delphi,Java Swing等。所有表现层的组件比如窗口,或者HTML表单都可以由IDE来提供,我们只需要在IDE里点击或拖动鼠标就能够自动添加一个组件,并且添加一个相应的事件处理器。

这种开发方式有几个优点:

· 复用性 -代码高度可重用。

· 易于使用 -通常只需要配置控件的属性,编写相关的事件处理函数。

我个人也挺喜欢这种方式,PEAR就提供了相当强大的HTML_QuickForm,用于在页面添加表单元素及其事件处理函数,还可以与Smarty等模板引擎相结合。这对于项目开发来说是一个补充性的功能,在项目中的某些部份使用QuickForm,有时可以大大加快开发。

而完全基于组件和事件驱动的开发框架对于PHP来说也已经不新鲜,PRADO就是一个这样的框架,曾经得过Zend编程大赛的头奖。但目前来说很显然Prado所提倡的这种开发方式仍然没有被大部份PHP程序员所接受。为什么呢?

我觉得主要有以下两个问题:

(1)效率问题

这里指的不是开发效率,而是代码的执行效率。众所周知,正常情况下,PHP的执行是相当高效的。但是目前这种基于控件的框架效率都成问题。Prado本身提供了一个缓存机制来缓解这个问题。如果不采用缓存,可以说很多站点根本不能使用Prado这样的框架,比如门户网站,大型论坛等。

但ASP .NET不太一样,因为它是编译型的框架,最后生成的代码是编译生成的,不需要再次进行中间过程的诸多处理,所以在第一次执行之后速度会很快,执行效率还是很高的。 这是语言层次的功能,Prado无法通过代码层次的努力完全弥补。

(2)没有强大的IDE支持

设置控件的属性,添加其对应的事件处理器,看似简单,但控件多了,这也是个繁重的工作。.NET的强大就在于它把程序员从重复的工作中解放了出来,设置属性很方便,事件处理器也会自动添加。Prado目前没有这样的IDE支持。

总之,这种基于控件的框架比较适合于用户交互较多的,需要对页面中的很多组件设置不同处理操作,但对于性能要求不高的应用。另外,带有组件支持的框架通常对AJAX的支持都较好,比如.NET和Ruby on Rails。

综上,三种架构基本上可以代表目前的所有主流WEB开发方式,包括PHP,JavaEE,.NET,Ruby/RoR。

目前PHP开发的状况和未来的趋势:

平时做PHP比较多,特别总结一下PHP开发的趋势。目前在PHP开发中,我们最常用的是基于“文件”的架构,其实也就是一种“面向过程”的开发方式。通常我们写PHP程序的目的就是“快点上线,让程序跑起来”。而且大多数PHP程序员还要和HTML、CSS做近身搏斗,所以如果程序太抽象,调整视觉效果就比较困难。所以对于小项目,这是一个最好的选择。

但越来越多人认识到,面向对象和MVC框架更能促进代码的复用和分享,而且程序易于扩展,随着程序复杂性的增加这个趋势越明显。所以OO框架层出不穷。目前PHP框架当中最有前景的是CakePHP、Symphony和Zend Framework,各自拥有活跃的社区和庞大的用户群,都在快速成长当中。PHP的框架都避免走Java框架庞大臃肿的老路,致力于快速开发,而且主动模仿和吸收RoR这些优秀框架的新特性。随着PHP5的普及和这些框架的成熟,加上PHP原本开发社区的庞大人数,将来也许又会再产生出一些行业性的标准。

这种选择适合于中大型项目,特别是需要较大的团队合作和需要长期维护和二次开发情况。个人认为这是将来PHP开发的趋势。

而对于基于组件和事件驱动的开发方式大多数PHP程序员都不感兴趣。但是也有不少人在做这方面的努力,例如Codegear的Delphi for PHP,就吸引了很多人的关注。如果有强大的商业支持,也许将来在开发市场也会占一席之地。

我会在下一篇文章介绍D4P的新特性并作评测。

WEB开发的未来展望:

随着更贴近HTTP的REST的流行,我觉得像.NET和Java中的抽象组件的方式会受到冲击。因为这些组件并不如它们所承诺的那么方便。未来MVC+REST+RIA的模式应该会比较流行。

AJAX是一把双刃剑,尽管事件驱动的架构看起来非常适合于处理异步的请求(可以想像页面中存在几个组件,每个组件都可以触发异步请求,对应对服务器端的某个事件处理器,看起来是很理想的一个处理方式),但要为客户端自动生成良好的JavaScript代码是很不容易的,要满足各种浏览器的兼容性要求,还要能够自己进行扩展,以满足项目中千奇百怪的需求。 很多时候我更倾向于使用一些JS框架如Prototype来自己开发各种效果,而不是在服务器端生成。在服务器端生成JS的两个结果,一是对生成的代码不信任,二是人变傻,因为你并不知道真正发生了什么。

(一点牢骚也贴上来)
关于WEB开发的个人疑惑:

l 为了让开发更简单,我们不得不学习使用复杂的开发工具和框架,这到底是一个进步,还是退步?

l IDE让程序员变聪明还是变傻? 当我们在服务器代码里面就可以设计客户端界面,这是一个进步还是退步?

举个例子说,微软的ASP.NET AJAX,让我们可以在服务器端设计各种异步的控件。那么程序员甚至可以不会Javascript,不懂AJAX就设计出各种客户端效果。要是哪一天项目需要设计稍复杂的效果,靠IDE和框架无法自动完成,你要怎么办? 到这个时候再来学JS,也许就迟了。更可怕的是,技术在更新和淘汰,可能十年之后,你会发现自己除了各种IDE之后,真正精通的技术很少,脱离了IDE你写一个小程序都要查半天API手册,因为你平时都是依赖“自动补齐”来写代码的! 这样的情景,我想没有人愿意发生。

也许对于短期开发的项目来说,是一个进步,但对于程序员个人的成长来说,这并不是好事。对工具的依赖,导致了我们对于底层和核心技术的不求甚解,限制了个人的成长。




关于三种主流WEB架构的思考
Haohappy  haohappy AT msn.com
转载请注明来源:http://blog.youkuaiyun.com/haohappy2004

做WEB好几年了,各种语言和技术都稍有涉猎。今天心血来潮,突然想总结一下。其实不论什么技术,什么需求,通常WEB开发就是通过WEB前端管理一个或大或小或独立或分布式的关系型数据库,很多东西都是相通的。这里说的WEB架构,是指WEB应用开发中每种技术独有的资源组织形式(包括文件,数据库,HTTP请求处理等。注意并非OO的开发方式才有架构一说),也许说开发方式更容易让人理解一些。

以下想法主要以PHP实现为示例,但很多体会我想Java,.NET,Ruby开发者应该也很容易理解。最后是我对于刚面世就引起无数人关注的Delphi fo PHP的评测

WEB程序的架构基本上可以分成以下三类:

(一) 基于“WEB页面/文件”,例如CGI和PHP/ASP程序。程序的文件分别存储在不同的目录里,与URL相对应。当HTTP请求提交至服务器时,URL直接指向某个文件,然后由该文件来处理请求,并返回响应结果。

比如http://www.website.conm/news/readnews.php?id=1234

可以想像,我们在站点根目录的news目录下放置一个readnews.php文件。

这种开发方式最自然,最易理解,也是PHP最常用的方式。要注意产生的URL对搜索引擎不友好,不过你可以用服务器提供的URL重写方案来处理,例如Apache的mod_rewrite。

(二) 基于“动作”(Action)。这是MVC架构的WEB程序所采用的最常见的方式。目前主流的WEB框架像Struts、Webwork(Java),Ruby on Rails(Ruby),Zend Framework(PHP)等都采用这种设计。URL映射到控制器(controller)和控制器中的动作(action),由action来处理请求并输出响应结果。这种设计和上面的基于文件的方式一样,都是请求/响应驱动的方案,离不开HTTP。

比如 http://www.website.com/news/read/id/1234

可以想像在实际代码中,我们会有一个控制器newsController,其中有一个readAction。不同框架可能默认实现方式稍有不同,有的是一个Controller一个文件,其中有多个Action,有的是每个Action一个文件。当然这些你都可以自己控制,题外话。

这种方式的URL通常都很漂亮,对搜索引擎友好,因为很多框架都自带有URL重写功能。可以自由规定URL中controller、action及参数出现的位置。

另外,还有更直接的基于URL的设计方案,那就是REST。通过人为规定URL的构成形式(比如Action限制成只有几种)来促进网站之间的互相访问,降低开发的复杂性,提高系统的可伸缩性。REST对于Web Services来说是一个创新。

虽然本文讨论的是单个项目所采用的架构,而REST是为了解决网站之间的通讯问题,但REST的出现,会对单个项目的架构造成影响(很显然你在开发时就要构造规范的URL)。将来混用REST和MVC应该也是一种趋势。RoR提供很好的REST支持,Zend Framework也提供了Zend_Rest来支持REST,包括Server和Client。

(三) 基于“组件”(Component ,GUI设计也常称控件)、事件驱动的架构,最常见的是微软的.NET。基本思想是把程序分成很多组件,每个组件都可以触发事件,调用特定的事件处理器来处理(比如在一个HTML按钮上设置onClick事件链接到一个PHP函数)。这种设计远离HTTP,HTTP请求完全抽象,映射到一个事件。

事实上这种设计原本最常应用于传统桌面GUI程序的开发,例如Delphi,Java Swing等。所有表现层的组件比如窗口,或者HTML表单都可以由IDE来提供,我们只需要在IDE里点击或拖动鼠标就能够自动添加一个组件,并且添加一个相应的事件处理器。

这种开发方式有几个优点:

· 复用性 -代码高度可重用。

· 易于使用 -通常只需要配置控件的属性,编写相关的事件处理函数。

我个人也挺喜欢这种方式,PEAR就提供了相当强大的HTML_QuickForm,用于在页面添加表单元素及其事件处理函数,还可以与Smarty等模板引擎相结合。这对于项目开发来说是一个补充性的功能,在项目中的某些部份使用QuickForm,有时可以大大加快开发。

而完全基于组件和事件驱动的开发框架对于PHP来说也已经不新鲜,PRADO就是一个这样的框架,曾经得过Zend编程大赛的头奖。但目前来说很显然Prado所提倡的这种开发方式仍然没有被大部份PHP程序员所接受。为什么呢?

我觉得主要有以下两个问题:

(1)效率问题

这里指的不是开发效率,而是代码的执行效率。众所周知,正常情况下,PHP的执行是相当高效的。但是目前这种基于控件的框架效率都成问题。Prado本身提供了一个缓存机制来缓解这个问题。如果不采用缓存,可以说很多站点根本不能使用Prado这样的框架,比如门户网站,大型论坛等。

但ASP .NET不太一样,因为它是编译型的框架,最后生成的代码是编译生成的,不需要再次进行中间过程的诸多处理,所以在第一次执行之后速度会很快,执行效率还是很高的。 这是语言层次的功能,Prado无法通过代码层次的努力完全弥补。

(2)没有强大的IDE支持

设置控件的属性,添加其对应的事件处理器,看似简单,但控件多了,这也是个繁重的工作。.NET的强大就在于它把程序员从重复的工作中解放了出来,设置属性很方便,事件处理器也会自动添加。Prado目前没有这样的IDE支持。

总之,这种基于控件的框架比较适合于用户交互较多的,需要对页面中的很多组件设置不同处理操作,但对于性能要求不高的应用。另外,带有组件支持的框架通常对AJAX的支持都较好,比如.NET和Ruby on Rails。

综上,三种架构基本上可以代表目前的所有主流WEB开发方式,包括PHP,JavaEE,.NET,Ruby/RoR。

目前PHP开发的状况和未来的趋势:

平时做PHP比较多,特别总结一下PHP开发的趋势。目前在PHP开发中,我们最常用的是基于“文件”的架构,其实也就是一种“面向过程”的开发方式。通常我们写PHP程序的目的就是“快点上线,让程序跑起来”。而且大多数PHP程序员还要和HTML、CSS做近身搏斗,所以如果程序太抽象,调整视觉效果就比较困难。所以对于小项目,这是一个最好的选择。

但越来越多人认识到,面向对象和MVC框架更能促进代码的复用和分享,而且程序易于扩展,随着程序复杂性的增加这个趋势越明显。所以OO框架层出不穷。目前PHP框架当中最有前景的是CakePHP、Symphony和Zend Framework,各自拥有活跃的社区和庞大的用户群,都在快速成长当中。PHP的框架都避免走Java框架庞大臃肿的老路,致力于快速开发,而且主动模仿和吸收RoR这些优秀框架的新特性。随着PHP5的普及和这些框架的成熟,加上PHP原本开发社区的庞大人数,将来也许又会再产生出一些行业性的标准。

这种选择适合于中大型项目,特别是需要较大的团队合作和需要长期维护和二次开发情况。个人认为这是将来PHP开发的趋势。

而对于基于组件和事件驱动的开发方式大多数PHP程序员都不感兴趣。但是也有不少人在做这方面的努力,例如Codegear的Delphi for PHP,就吸引了很多人的关注。如果有强大的商业支持,也许将来在开发市场也会占一席之地。

我会在下一篇文章介绍D4P的新特性并作评测。

WEB开发的未来展望:

随着更贴近HTTP的REST的流行,我觉得像.NET和Java中的抽象组件的方式会受到冲击。因为这些组件并不如它们所承诺的那么方便。未来MVC+REST+RIA的模式应该会比较流行。

AJAX是一把双刃剑,尽管事件驱动的架构看起来非常适合于处理异步的请求(可以想像页面中存在几个组件,每个组件都可以触发异步请求,对应对服务器端的某个事件处理器,看起来是很理想的一个处理方式),但要为客户端自动生成良好的JavaScript代码是很不容易的,要满足各种浏览器的兼容性要求,还要能够自己进行扩展,以满足项目中千奇百怪的需求。 很多时候我更倾向于使用一些JS框架如Prototype来自己开发各种效果,而不是在服务器端生成。在服务器端生成JS的两个结果,一是对生成的代码不信任,二是人变傻,因为你并不知道真正发生了什么。

(一点牢骚也贴上来)
关于WEB开发的个人疑惑:

l 为了让开发更简单,我们不得不学习使用复杂的开发工具和框架,这到底是一个进步,还是退步?

l IDE让程序员变聪明还是变傻? 当我们在服务器代码里面就可以设计客户端界面,这是一个进步还是退步?

举个例子说,微软的ASP.NET AJAX,让我们可以在服务器端设计各种异步的控件。那么程序员甚至可以不会Javascript,不懂AJAX就设计出各种客户端效果。要是哪一天项目需要设计稍复杂的效果,靠IDE和框架无法自动完成,你要怎么办? 到这个时候再来学JS,也许就迟了。更可怕的是,技术在更新和淘汰,可能十年之后,你会发现自己除了各种IDE之后,真正精通的技术很少,脱离了IDE你写一个小程序都要查半天API手册,因为你平时都是依赖“自动补齐”来写代码的! 这样的情景,我想没有人愿意发生。

也许对于短期开发的项目来说,是一个进步,但对于程序员个人的成长来说,这并不是好事。对工具的依赖,导致了我们对于底层和核心技术的不求甚解,限制了个人的成长。




关于三种主流WEB架构的思考
Haohappy  haohappy AT msn.com
转载请注明来源:http://blog.youkuaiyun.com/haohappy2004

做WEB好几年了,各种语言和技术都稍有涉猎。今天心血来潮,突然想总结一下。其实不论什么技术,什么需求,通常WEB开发就是通过WEB前端管理一个或大或小或独立或分布式的关系型数据库,很多东西都是相通的。这里说的WEB架构,是指WEB应用开发中每种技术独有的资源组织形式(包括文件,数据库,HTTP请求处理等。注意并非OO的开发方式才有架构一说),也许说开发方式更容易让人理解一些。

以下想法主要以PHP实现为示例,但很多体会我想Java,.NET,Ruby开发者应该也很容易理解。最后是我对于刚面世就引起无数人关注的Delphi fo PHP的评测

WEB程序的架构基本上可以分成以下三类:

(一) 基于“WEB页面/文件”,例如CGI和PHP/ASP程序。程序的文件分别存储在不同的目录里,与URL相对应。当HTTP请求提交至服务器时,URL直接指向某个文件,然后由该文件来处理请求,并返回响应结果。

比如http://www.website.conm/news/readnews.php?id=1234

可以想像,我们在站点根目录的news目录下放置一个readnews.php文件。

这种开发方式最自然,最易理解,也是PHP最常用的方式。要注意产生的URL对搜索引擎不友好,不过你可以用服务器提供的URL重写方案来处理,例如Apache的mod_rewrite。

(二) 基于“动作”(Action)。这是MVC架构的WEB程序所采用的最常见的方式。目前主流的WEB框架像Struts、Webwork(Java),Ruby on Rails(Ruby),Zend Framework(PHP)等都采用这种设计。URL映射到控制器(controller)和控制器中的动作(action),由action来处理请求并输出响应结果。这种设计和上面的基于文件的方式一样,都是请求/响应驱动的方案,离不开HTTP。

比如 http://www.website.com/news/read/id/1234

可以想像在实际代码中,我们会有一个控制器newsController,其中有一个readAction。不同框架可能默认实现方式稍有不同,有的是一个Controller一个文件,其中有多个Action,有的是每个Action一个文件。当然这些你都可以自己控制,题外话。

这种方式的URL通常都很漂亮,对搜索引擎友好,因为很多框架都自带有URL重写功能。可以自由规定URL中controller、action及参数出现的位置。

另外,还有更直接的基于URL的设计方案,那就是REST。通过人为规定URL的构成形式(比如Action限制成只有几种)来促进网站之间的互相访问,降低开发的复杂性,提高系统的可伸缩性。REST对于Web Services来说是一个创新。

虽然本文讨论的是单个项目所采用的架构,而REST是为了解决网站之间的通讯问题,但REST的出现,会对单个项目的架构造成影响(很显然你在开发时就要构造规范的URL)。将来混用REST和MVC应该也是一种趋势。RoR提供很好的REST支持,Zend Framework也提供了Zend_Rest来支持REST,包括Server和Client。

(三) 基于“组件”(Component ,GUI设计也常称控件)、事件驱动的架构,最常见的是微软的.NET。基本思想是把程序分成很多组件,每个组件都可以触发事件,调用特定的事件处理器来处理(比如在一个HTML按钮上设置onClick事件链接到一个PHP函数)。这种设计远离HTTP,HTTP请求完全抽象,映射到一个事件。

事实上这种设计原本最常应用于传统桌面GUI程序的开发,例如Delphi,Java Swing等。所有表现层的组件比如窗口,或者HTML表单都可以由IDE来提供,我们只需要在IDE里点击或拖动鼠标就能够自动添加一个组件,并且添加一个相应的事件处理器。

这种开发方式有几个优点:

· 复用性 -代码高度可重用。

· 易于使用 -通常只需要配置控件的属性,编写相关的事件处理函数。

我个人也挺喜欢这种方式,PEAR就提供了相当强大的HTML_QuickForm,用于在页面添加表单元素及其事件处理函数,还可以与Smarty等模板引擎相结合。这对于项目开发来说是一个补充性的功能,在项目中的某些部份使用QuickForm,有时可以大大加快开发。

而完全基于组件和事件驱动的开发框架对于PHP来说也已经不新鲜,PRADO就是一个这样的框架,曾经得过Zend编程大赛的头奖。但目前来说很显然Prado所提倡的这种开发方式仍然没有被大部份PHP程序员所接受。为什么呢?

我觉得主要有以下两个问题:

(1)效率问题

这里指的不是开发效率,而是代码的执行效率。众所周知,正常情况下,PHP的执行是相当高效的。但是目前这种基于控件的框架效率都成问题。Prado本身提供了一个缓存机制来缓解这个问题。如果不采用缓存,可以说很多站点根本不能使用Prado这样的框架,比如门户网站,大型论坛等。

但ASP .NET不太一样,因为它是编译型的框架,最后生成的代码是编译生成的,不需要再次进行中间过程的诸多处理,所以在第一次执行之后速度会很快,执行效率还是很高的。 这是语言层次的功能,Prado无法通过代码层次的努力完全弥补。

(2)没有强大的IDE支持

设置控件的属性,添加其对应的事件处理器,看似简单,但控件多了,这也是个繁重的工作。.NET的强大就在于它把程序员从重复的工作中解放了出来,设置属性很方便,事件处理器也会自动添加。Prado目前没有这样的IDE支持。

总之,这种基于控件的框架比较适合于用户交互较多的,需要对页面中的很多组件设置不同处理操作,但对于性能要求不高的应用。另外,带有组件支持的框架通常对AJAX的支持都较好,比如.NET和Ruby on Rails。

综上,三种架构基本上可以代表目前的所有主流WEB开发方式,包括PHP,JavaEE,.NET,Ruby/RoR。

目前PHP开发的状况和未来的趋势:

平时做PHP比较多,特别总结一下PHP开发的趋势。目前在PHP开发中,我们最常用的是基于“文件”的架构,其实也就是一种“面向过程”的开发方式。通常我们写PHP程序的目的就是“快点上线,让程序跑起来”。而且大多数PHP程序员还要和HTML、CSS做近身搏斗,所以如果程序太抽象,调整视觉效果就比较困难。所以对于小项目,这是一个最好的选择。

但越来越多人认识到,面向对象和MVC框架更能促进代码的复用和分享,而且程序易于扩展,随着程序复杂性的增加这个趋势越明显。所以OO框架层出不穷。目前PHP框架当中最有前景的是CakePHP、Symphony和Zend Framework,各自拥有活跃的社区和庞大的用户群,都在快速成长当中。PHP的框架都避免走Java框架庞大臃肿的老路,致力于快速开发,而且主动模仿和吸收RoR这些优秀框架的新特性。随着PHP5的普及和这些框架的成熟,加上PHP原本开发社区的庞大人数,将来也许又会再产生出一些行业性的标准。

这种选择适合于中大型项目,特别是需要较大的团队合作和需要长期维护和二次开发情况。个人认为这是将来PHP开发的趋势。

而对于基于组件和事件驱动的开发方式大多数PHP程序员都不感兴趣。但是也有不少人在做这方面的努力,例如Codegear的Delphi for PHP,就吸引了很多人的关注。如果有强大的商业支持,也许将来在开发市场也会占一席之地。

我会在下一篇文章介绍D4P的新特性并作评测。

WEB开发的未来展望:

随着更贴近HTTP的REST的流行,我觉得像.NET和Java中的抽象组件的方式会受到冲击。因为这些组件并不如它们所承诺的那么方便。未来MVC+REST+RIA的模式应该会比较流行。

AJAX是一把双刃剑,尽管事件驱动的架构看起来非常适合于处理异步的请求(可以想像页面中存在几个组件,每个组件都可以触发异步请求,对应对服务器端的某个事件处理器,看起来是很理想的一个处理方式),但要为客户端自动生成良好的JavaScript代码是很不容易的,要满足各种浏览器的兼容性要求,还要能够自己进行扩展,以满足项目中千奇百怪的需求。 很多时候我更倾向于使用一些JS框架如Prototype来自己开发各种效果,而不是在服务器端生成。在服务器端生成JS的两个结果,一是对生成的代码不信任,二是人变傻,因为你并不知道真正发生了什么。

(一点牢骚也贴上来)
关于WEB开发的个人疑惑:

l 为了让开发更简单,我们不得不学习使用复杂的开发工具和框架,这到底是一个进步,还是退步?

l IDE让程序员变聪明还是变傻? 当我们在服务器代码里面就可以设计客户端界面,这是一个进步还是退步?

举个例子说,微软的ASP.NET AJAX,让我们可以在服务器端设计各种异步的控件。那么程序员甚至可以不会Javascript,不懂AJAX就设计出各种客户端效果。要是哪一天项目需要设计稍复杂的效果,靠IDE和框架无法自动完成,你要怎么办? 到这个时候再来学JS,也许就迟了。更可怕的是,技术在更新和淘汰,可能十年之后,你会发现自己除了各种IDE之后,真正精通的技术很少,脱离了IDE你写一个小程序都要查半天API手册,因为你平时都是依赖“自动补齐”来写代码的! 这样的情景,我想没有人愿意发生。

也许对于短期开发的项目来说,是一个进步,但对于程序员个人的成长来说,这并不是好事。对工具的依赖,导致了我们对于底层和核心技术的不求甚解,限制了个人的成长。




关于三种主流WEB架构的思考
Haohappy  haohappy AT msn.com
转载请注明来源:http://blog.youkuaiyun.com/haohappy2004

做WEB好几年了,各种语言和技术都稍有涉猎。今天心血来潮,突然想总结一下。其实不论什么技术,什么需求,通常WEB开发就是通过WEB前端管理一个或大或小或独立或分布式的关系型数据库,很多东西都是相通的。这里说的WEB架构,是指WEB应用开发中每种技术独有的资源组织形式(包括文件,数据库,HTTP请求处理等。注意并非OO的开发方式才有架构一说),也许说开发方式更容易让人理解一些。

以下想法主要以PHP实现为示例,但很多体会我想Java,.NET,Ruby开发者应该也很容易理解。最后是我对于刚面世就引起无数人关注的Delphi fo PHP的评测

WEB程序的架构基本上可以分成以下三类:

(一) 基于“WEB页面/文件”,例如CGI和PHP/ASP程序。程序的文件分别存储在不同的目录里,与URL相对应。当HTTP请求提交至服务器时,URL直接指向某个文件,然后由该文件来处理请求,并返回响应结果。

比如http://www.website.conm/news/readnews.php?id=1234

可以想像,我们在站点根目录的news目录下放置一个readnews.php文件。

这种开发方式最自然,最易理解,也是PHP最常用的方式。要注意产生的URL对搜索引擎不友好,不过你可以用服务器提供的URL重写方案来处理,例如Apache的mod_rewrite。

(二) 基于“动作”(Action)。这是MVC架构的WEB程序所采用的最常见的方式。目前主流的WEB框架像Struts、Webwork(Java),Ruby on Rails(Ruby),Zend Framework(PHP)等都采用这种设计。URL映射到控制器(controller)和控制器中的动作(action),由action来处理请求并输出响应结果。这种设计和上面的基于文件的方式一样,都是请求/响应驱动的方案,离不开HTTP。

比如 http://www.website.com/news/read/id/1234

可以想像在实际代码中,我们会有一个控制器newsController,其中有一个readAction。不同框架可能默认实现方式稍有不同,有的是一个Controller一个文件,其中有多个Action,有的是每个Action一个文件。当然这些你都可以自己控制,题外话。

这种方式的URL通常都很漂亮,对搜索引擎友好,因为很多框架都自带有URL重写功能。可以自由规定URL中controller、action及参数出现的位置。

另外,还有更直接的基于URL的设计方案,那就是REST。通过人为规定URL的构成形式(比如Action限制成只有几种)来促进网站之间的互相访问,降低开发的复杂性,提高系统的可伸缩性。REST对于Web Services来说是一个创新。

虽然本文讨论的是单个项目所采用的架构,而REST是为了解决网站之间的通讯问题,但REST的出现,会对单个项目的架构造成影响(很显然你在开发时就要构造规范的URL)。将来混用REST和MVC应该也是一种趋势。RoR提供很好的REST支持,Zend Framework也提供了Zend_Rest来支持REST,包括Server和Client。

(三) 基于“组件”(Component ,GUI设计也常称控件)、事件驱动的架构,最常见的是微软的.NET。基本思想是把程序分成很多组件,每个组件都可以触发事件,调用特定的事件处理器来处理(比如在一个HTML按钮上设置onClick事件链接到一个PHP函数)。这种设计远离HTTP,HTTP请求完全抽象,映射到一个事件。

事实上这种设计原本最常应用于传统桌面GUI程序的开发,例如Delphi,Java Swing等。所有表现层的组件比如窗口,或者HTML表单都可以由IDE来提供,我们只需要在IDE里点击或拖动鼠标就能够自动添加一个组件,并且添加一个相应的事件处理器。

这种开发方式有几个优点:

· 复用性 -代码高度可重用。

· 易于使用 -通常只需要配置控件的属性,编写相关的事件处理函数。

我个人也挺喜欢这种方式,PEAR就提供了相当强大的HTML_QuickForm,用于在页面添加表单元素及其事件处理函数,还可以与Smarty等模板引擎相结合。这对于项目开发来说是一个补充性的功能,在项目中的某些部份使用QuickForm,有时可以大大加快开发。

而完全基于组件和事件驱动的开发框架对于PHP来说也已经不新鲜,PRADO就是一个这样的框架,曾经得过Zend编程大赛的头奖。但目前来说很显然Prado所提倡的这种开发方式仍然没有被大部份PHP程序员所接受。为什么呢?

我觉得主要有以下两个问题:

(1)效率问题

这里指的不是开发效率,而是代码的执行效率。众所周知,正常情况下,PHP的执行是相当高效的。但是目前这种基于控件的框架效率都成问题。Prado本身提供了一个缓存机制来缓解这个问题。如果不采用缓存,可以说很多站点根本不能使用Prado这样的框架,比如门户网站,大型论坛等。

但ASP .NET不太一样,因为它是编译型的框架,最后生成的代码是编译生成的,不需要再次进行中间过程的诸多处理,所以在第一次执行之后速度会很快,执行效率还是很高的。 这是语言层次的功能,Prado无法通过代码层次的努力完全弥补。

(2)没有强大的IDE支持

设置控件的属性,添加其对应的事件处理器,看似简单,但控件多了,这也是个繁重的工作。.NET的强大就在于它把程序员从重复的工作中解放了出来,设置属性很方便,事件处理器也会自动添加。Prado目前没有这样的IDE支持。

总之,这种基于控件的框架比较适合于用户交互较多的,需要对页面中的很多组件设置不同处理操作,但对于性能要求不高的应用。另外,带有组件支持的框架通常对AJAX的支持都较好,比如.NET和Ruby on Rails。

综上,三种架构基本上可以代表目前的所有主流WEB开发方式,包括PHP,JavaEE,.NET,Ruby/RoR。

目前PHP开发的状况和未来的趋势:

平时做PHP比较多,特别总结一下PHP开发的趋势。目前在PHP开发中,我们最常用的是基于“文件”的架构,其实也就是一种“面向过程”的开发方式。通常我们写PHP程序的目的就是“快点上线,让程序跑起来”。而且大多数PHP程序员还要和HTML、CSS做近身搏斗,所以如果程序太抽象,调整视觉效果就比较困难。所以对于小项目,这是一个最好的选择。

但越来越多人认识到,面向对象和MVC框架更能促进代码的复用和分享,而且程序易于扩展,随着程序复杂性的增加这个趋势越明显。所以OO框架层出不穷。目前PHP框架当中最有前景的是CakePHP、Symphony和Zend Framework,各自拥有活跃的社区和庞大的用户群,都在快速成长当中。PHP的框架都避免走Java框架庞大臃肿的老路,致力于快速开发,而且主动模仿和吸收RoR这些优秀框架的新特性。随着PHP5的普及和这些框架的成熟,加上PHP原本开发社区的庞大人数,将来也许又会再产生出一些行业性的标准。

这种选择适合于中大型项目,特别是需要较大的团队合作和需要长期维护和二次开发情况。个人认为这是将来PHP开发的趋势。

而对于基于组件和事件驱动的开发方式大多数PHP程序员都不感兴趣。但是也有不少人在做这方面的努力,例如Codegear的Delphi for PHP,就吸引了很多人的关注。如果有强大的商业支持,也许将来在开发市场也会占一席之地。

我会在下一篇文章介绍D4P的新特性并作评测。

WEB开发的未来展望:

随着更贴近HTTP的REST的流行,我觉得像.NET和Java中的抽象组件的方式会受到冲击。因为这些组件并不如它们所承诺的那么方便。未来MVC+REST+RIA的模式应该会比较流行。

AJAX是一把双刃剑,尽管事件驱动的架构看起来非常适合于处理异步的请求(可以想像页面中存在几个组件,每个组件都可以触发异步请求,对应对服务器端的某个事件处理器,看起来是很理想的一个处理方式),但要为客户端自动生成良好的JavaScript代码是很不容易的,要满足各种浏览器的兼容性要求,还要能够自己进行扩展,以满足项目中千奇百怪的需求。 很多时候我更倾向于使用一些JS框架如Prototype来自己开发各种效果,而不是在服务器端生成。在服务器端生成JS的两个结果,一是对生成的代码不信任,二是人变傻,因为你并不知道真正发生了什么。

(一点牢骚也贴上来)
关于WEB开发的个人疑惑:

l 为了让开发更简单,我们不得不学习使用复杂的开发工具和框架,这到底是一个进步,还是退步?

l IDE让程序员变聪明还是变傻? 当我们在服务器代码里面就可以设计客户端界面,这是一个进步还是退步?

举个例子说,微软的ASP.NET AJAX,让我们可以在服务器端设计各种异步的控件。那么程序员甚至可以不会Javascript,不懂AJAX就设计出各种客户端效果。要是哪一天项目需要设计稍复杂的效果,靠IDE和框架无法自动完成,你要怎么办? 到这个时候再来学JS,也许就迟了。更可怕的是,技术在更新和淘汰,可能十年之后,你会发现自己除了各种IDE之后,真正精通的技术很少,脱离了IDE你写一个小程序都要查半天API手册,因为你平时都是依赖“自动补齐”来写代码的! 这样的情景,我想没有人愿意发生。

也许对于短期开发的项目来说,是一个进步,但对于程序员个人的成长来说,这并不是好事。对工具的依赖,导致了我们对于底层和核心技术的不求甚解,限制了个人的成长。




关于三种主流WEB架构的思考
Haohappy  haohappy AT msn.com
转载请注明来源:http://blog.youkuaiyun.com/haohappy2004

做WEB好几年了,各种语言和技术都稍有涉猎。今天心血来潮,突然想总结一下。其实不论什么技术,什么需求,通常WEB开发就是通过WEB前端管理一个或大或小或独立或分布式的关系型数据库,很多东西都是相通的。这里说的WEB架构,是指WEB应用开发中每种技术独有的资源组织形式(包括文件,数据库,HTTP请求处理等。注意并非OO的开发方式才有架构一说),也许说开发方式更容易让人理解一些。

以下想法主要以PHP实现为示例,但很多体会我想Java,.NET,Ruby开发者应该也很容易理解。最后是我对于刚面世就引起无数人关注的Delphi fo PHP的评测

WEB程序的架构基本上可以分成以下三类:

(一) 基于“WEB页面/文件”,例如CGI和PHP/ASP程序。程序的文件分别存储在不同的目录里,与URL相对应。当HTTP请求提交至服务器时,URL直接指向某个文件,然后由该文件来处理请求,并返回响应结果。

比如http://www.website.conm/news/readnews.php?id=1234

可以想像,我们在站点根目录的news目录下放置一个readnews.php文件。

这种开发方式最自然,最易理解,也是PHP最常用的方式。要注意产生的URL对搜索引擎不友好,不过你可以用服务器提供的URL重写方案来处理,例如Apache的mod_rewrite。

(二) 基于“动作”(Action)。这是MVC架构的WEB程序所采用的最常见的方式。目前主流的WEB框架像Struts、Webwork(Java),Ruby on Rails(Ruby),Zend Framework(PHP)等都采用这种设计。URL映射到控制器(controller)和控制器中的动作(action),由action来处理请求并输出响应结果。这种设计和上面的基于文件的方式一样,都是请求/响应驱动的方案,离不开HTTP。

比如 http://www.website.com/news/read/id/1234

可以想像在实际代码中,我们会有一个控制器newsController,其中有一个readAction。不同框架可能默认实现方式稍有不同,有的是一个Controller一个文件,其中有多个Action,有的是每个Action一个文件。当然这些你都可以自己控制,题外话。

这种方式的URL通常都很漂亮,对搜索引擎友好,因为很多框架都自带有URL重写功能。可以自由规定URL中controller、action及参数出现的位置。

另外,还有更直接的基于URL的设计方案,那就是REST。通过人为规定URL的构成形式(比如Action限制成只有几种)来促进网站之间的互相访问,降低开发的复杂性,提高系统的可伸缩性。REST对于Web Services来说是一个创新。

虽然本文讨论的是单个项目所采用的架构,而REST是为了解决网站之间的通讯问题,但REST的出现,会对单个项目的架构造成影响(很显然你在开发时就要构造规范的URL)。将来混用REST和MVC应该也是一种趋势。RoR提供很好的REST支持,Zend Framework也提供了Zend_Rest来支持REST,包括Server和Client。

(三) 基于“组件”(Component ,GUI设计也常称控件)、事件驱动的架构,最常见的是微软的.NET。基本思想是把程序分成很多组件,每个组件都可以触发事件,调用特定的事件处理器来处理(比如在一个HTML按钮上设置onClick事件链接到一个PHP函数)。这种设计远离HTTP,HTTP请求完全抽象,映射到一个事件。

事实上这种设计原本最常应用于传统桌面GUI程序的开发,例如Delphi,Java Swing等。所有表现层的组件比如窗口,或者HTML表单都可以由IDE来提供,我们只需要在IDE里点击或拖动鼠标就能够自动添加一个组件,并且添加一个相应的事件处理器。

这种开发方式有几个优点:

· 复用性 -代码高度可重用。

· 易于使用 -通常只需要配置控件的属性,编写相关的事件处理函数。

我个人也挺喜欢这种方式,PEAR就提供了相当强大的HTML_QuickForm,用于在页面添加表单元素及其事件处理函数,还可以与Smarty等模板引擎相结合。这对于项目开发来说是一个补充性的功能,在项目中的某些部份使用QuickForm,有时可以大大加快开发。

而完全基于组件和事件驱动的开发框架对于PHP来说也已经不新鲜,PRADO就是一个这样的框架,曾经得过Zend编程大赛的头奖。但目前来说很显然Prado所提倡的这种开发方式仍然没有被大部份PHP程序员所接受。为什么呢?

我觉得主要有以下两个问题:

(1)效率问题

这里指的不是开发效率,而是代码的执行效率。众所周知,正常情况下,PHP的执行是相当高效的。但是目前这种基于控件的框架效率都成问题。Prado本身提供了一个缓存机制来缓解这个问题。如果不采用缓存,可以说很多站点根本不能使用Prado这样的框架,比如门户网站,大型论坛等。

但ASP .NET不太一样,因为它是编译型的框架,最后生成的代码是编译生成的,不需要再次进行中间过程的诸多处理,所以在第一次执行之后速度会很快,执行效率还是很高的。 这是语言层次的功能,Prado无法通过代码层次的努力完全弥补。

(2)没有强大的IDE支持

设置控件的属性,添加其对应的事件处理器,看似简单,但控件多了,这也是个繁重的工作。.NET的强大就在于它把程序员从重复的工作中解放了出来,设置属性很方便,事件处理器也会自动添加。Prado目前没有这样的IDE支持。

总之,这种基于控件的框架比较适合于用户交互较多的,需要对页面中的很多组件设置不同处理操作,但对于性能要求不高的应用。另外,带有组件支持的框架通常对AJAX的支持都较好,比如.NET和Ruby on Rails。

综上,三种架构基本上可以代表目前的所有主流WEB开发方式,包括PHP,JavaEE,.NET,Ruby/RoR。

目前PHP开发的状况和未来的趋势:

平时做PHP比较多,特别总结一下PHP开发的趋势。目前在PHP开发中,我们最常用的是基于“文件”的架构,其实也就是一种“面向过程”的开发方式。通常我们写PHP程序的目的就是“快点上线,让程序跑起来”。而且大多数PHP程序员还要和HTML、CSS做近身搏斗,所以如果程序太抽象,调整视觉效果就比较困难。所以对于小项目,这是一个最好的选择。

但越来越多人认识到,面向对象和MVC框架更能促进代码的复用和分享,而且程序易于扩展,随着程序复杂性的增加这个趋势越明显。所以OO框架层出不穷。目前PHP框架当中最有前景的是CakePHP、Symphony和Zend Framework,各自拥有活跃的社区和庞大的用户群,都在快速成长当中。PHP的框架都避免走Java框架庞大臃肿的老路,致力于快速开发,而且主动模仿和吸收RoR这些优秀框架的新特性。随着PHP5的普及和这些框架的成熟,加上PHP原本开发社区的庞大人数,将来也许又会再产生出一些行业性的标准。

这种选择适合于中大型项目,特别是需要较大的团队合作和需要长期维护和二次开发情况。个人认为这是将来PHP开发的趋势。

而对于基于组件和事件驱动的开发方式大多数PHP程序员都不感兴趣。但是也有不少人在做这方面的努力,例如Codegear的Delphi for PHP,就吸引了很多人的关注。如果有强大的商业支持,也许将来在开发市场也会占一席之地。

我会在下一篇文章介绍D4P的新特性并作评测。

WEB开发的未来展望:

随着更贴近HTTP的REST的流行,我觉得像.NET和Java中的抽象组件的方式会受到冲击。因为这些组件并不如它们所承诺的那么方便。未来MVC+REST+RIA的模式应该会比较流行。

AJAX是一把双刃剑,尽管事件驱动的架构看起来非常适合于处理异步的请求(可以想像页面中存在几个组件,每个组件都可以触发异步请求,对应对服务器端的某个事件处理器,看起来是很理想的一个处理方式),但要为客户端自动生成良好的JavaScript代码是很不容易的,要满足各种浏览器的兼容性要求,还要能够自己进行扩展,以满足项目中千奇百怪的需求。 很多时候我更倾向于使用一些JS框架如Prototype来自己开发各种效果,而不是在服务器端生成。在服务器端生成JS的两个结果,一是对生成的代码不信任,二是人变傻,因为你并不知道真正发生了什么。

(一点牢骚也贴上来)
关于WEB开发的个人疑惑:

l 为了让开发更简单,我们不得不学习使用复杂的开发工具和框架,这到底是一个进步,还是退步?

l IDE让程序员变聪明还是变傻? 当我们在服务器代码里面就可以设计客户端界面,这是一个进步还是退步?

举个例子说,微软的ASP.NET AJAX,让我们可以在服务器端设计各种异步的控件。那么程序员甚至可以不会Javascript,不懂AJAX就设计出各种客户端效果。要是哪一天项目需要设计稍复杂的效果,靠IDE和框架无法自动完成,你要怎么办? 到这个时候再来学JS,也许就迟了。更可怕的是,技术在更新和淘汰,可能十年之后,你会发现自己除了各种IDE之后,真正精通的技术很少,脱离了IDE你写一个小程序都要查半天API手册,因为你平时都是依赖“自动补齐”来写代码的! 这样的情景,我想没有人愿意发生。

也许对于短期开发的项目来说,是一个进步,但对于程序员个人的成长来说,这并不是好事。对工具的依赖,导致了我们对于底层和核心技术的不求甚解,限制了个人的成长。




关于三种主流WEB架构的思考
Haohappy  haohappy AT msn.com
转载请注明来源:http://blog.youkuaiyun.com/haohappy2004

做WEB好几年了,各种语言和技术都稍有涉猎。今天心血来潮,突然想总结一下。其实不论什么技术,什么需求,通常WEB开发就是通过WEB前端管理一个或大或小或独立或分布式的关系型数据库,很多东西都是相通的。这里说的WEB架构,是指WEB应用开发中每种技术独有的资源组织形式(包括文件,数据库,HTTP请求处理等。注意并非OO的开发方式才有架构一说),也许说开发方式更容易让人理解一些。

以下想法主要以PHP实现为示例,但很多体会我想Java,.NET,Ruby开发者应该也很容易理解。最后是我对于刚面世就引起无数人关注的Delphi fo PHP的评测

WEB程序的架构基本上可以分成以下三类:

(一) 基于“WEB页面/文件”,例如CGI和PHP/ASP程序。程序的文件分别存储在不同的目录里,与URL相对应。当HTTP请求提交至服务器时,URL直接指向某个文件,然后由该文件来处理请求,并返回响应结果。

比如http://www.website.conm/news/readnews.php?id=1234

可以想像,我们在站点根目录的news目录下放置一个readnews.php文件。

这种开发方式最自然,最易理解,也是PHP最常用的方式。要注意产生的URL对搜索引擎不友好,不过你可以用服务器提供的URL重写方案来处理,例如Apache的mod_rewrite。

(二) 基于“动作”(Action)。这是MVC架构的WEB程序所采用的最常见的方式。目前主流的WEB框架像Struts、Webwork(Java),Ruby on Rails(Ruby),Zend Framework(PHP)等都采用这种设计。URL映射到控制器(controller)和控制器中的动作(action),由action来处理请求并输出响应结果。这种设计和上面的基于文件的方式一样,都是请求/响应驱动的方案,离不开HTTP。

比如 http://www.website.com/news/read/id/1234

可以想像在实际代码中,我们会有一个控制器newsController,其中有一个readAction。不同框架可能默认实现方式稍有不同,有的是一个Controller一个文件,其中有多个Action,有的是每个Action一个文件。当然这些你都可以自己控制,题外话。

这种方式的URL通常都很漂亮,对搜索引擎友好,因为很多框架都自带有URL重写功能。可以自由规定URL中controller、action及参数出现的位置。

另外,还有更直接的基于URL的设计方案,那就是REST。通过人为规定URL的构成形式(比如Action限制成只有几种)来促进网站之间的互相访问,降低开发的复杂性,提高系统的可伸缩性。REST对于Web Services来说是一个创新。

虽然本文讨论的是单个项目所采用的架构,而REST是为了解决网站之间的通讯问题,但REST的出现,会对单个项目的架构造成影响(很显然你在开发时就要构造规范的URL)。将来混用REST和MVC应该也是一种趋势。RoR提供很好的REST支持,Zend Framework也提供了Zend_Rest来支持REST,包括Server和Client。

(三) 基于“组件”(Component ,GUI设计也常称控件)、事件驱动的架构,最常见的是微软的.NET。基本思想是把程序分成很多组件,每个组件都可以触发事件,调用特定的事件处理器来处理(比如在一个HTML按钮上设置onClick事件链接到一个PHP函数)。这种设计远离HTTP,HTTP请求完全抽象,映射到一个事件。

事实上这种设计原本最常应用于传统桌面GUI程序的开发,例如Delphi,Java Swing等。所有表现层的组件比如窗口,或者HTML表单都可以由IDE来提供,我们只需要在IDE里点击或拖动鼠标就能够自动添加一个组件,并且添加一个相应的事件处理器。

这种开发方式有几个优点:

· 复用性 -代码高度可重用。

· 易于使用 -通常只需要配置控件的属性,编写相关的事件处理函数。

我个人也挺喜欢这种方式,PEAR就提供了相当强大的HTML_QuickForm,用于在页面添加表单元素及其事件处理函数,还可以与Smarty等模板引擎相结合。这对于项目开发来说是一个补充性的功能,在项目中的某些部份使用QuickForm,有时可以大大加快开发。

而完全基于组件和事件驱动的开发框架对于PHP来说也已经不新鲜,PRADO就是一个这样的框架,曾经得过Zend编程大赛的头奖。但目前来说很显然Prado所提倡的这种开发方式仍然没有被大部份PHP程序员所接受。为什么呢?

我觉得主要有以下两个问题:

(1)效率问题

这里指的不是开发效率,而是代码的执行效率。众所周知,正常情况下,PHP的执行是相当高效的。但是目前这种基于控件的框架效率都成问题。Prado本身提供了一个缓存机制来缓解这个问题。如果不采用缓存,可以说很多站点根本不能使用Prado这样的框架,比如门户网站,大型论坛等。

但ASP .NET不太一样,因为它是编译型的框架,最后生成的代码是编译生成的,不需要再次进行中间过程的诸多处理,所以在第一次执行之后速度会很快,执行效率还是很高的。 这是语言层次的功能,Prado无法通过代码层次的努力完全弥补。

(2)没有强大的IDE支持

设置控件的属性,添加其对应的事件处理器,看似简单,但控件多了,这也是个繁重的工作。.NET的强大就在于它把程序员从重复的工作中解放了出来,设置属性很方便,事件处理器也会自动添加。Prado目前没有这样的IDE支持。

总之,这种基于控件的框架比较适合于用户交互较多的,需要对页面中的很多组件设置不同处理操作,但对于性能要求不高的应用。另外,带有组件支持的框架通常对AJAX的支持都较好,比如.NET和Ruby on Rails。

综上,三种架构基本上可以代表目前的所有主流WEB开发方式,包括PHP,JavaEE,.NET,Ruby/RoR。

目前PHP开发的状况和未来的趋势:

平时做PHP比较多,特别总结一下PHP开发的趋势。目前在PHP开发中,我们最常用的是基于“文件”的架构,其实也就是一种“面向过程”的开发方式。通常我们写PHP程序的目的就是“快点上线,让程序跑起来”。而且大多数PHP程序员还要和HTML、CSS做近身搏斗,所以如果程序太抽象,调整视觉效果就比较困难。所以对于小项目,这是一个最好的选择。

但越来越多人认识到,面向对象和MVC框架更能促进代码的复用和分享,而且程序易于扩展,随着程序复杂性的增加这个趋势越明显。所以OO框架层出不穷。目前PHP框架当中最有前景的是CakePHP、Symphony和Zend Framework,各自拥有活跃的社区和庞大的用户群,都在快速成长当中。PHP的框架都避免走Java框架庞大臃肿的老路,致力于快速开发,而且主动模仿和吸收RoR这些优秀框架的新特性。随着PHP5的普及和这些框架的成熟,加上PHP原本开发社区的庞大人数,将来也许又会再产生出一些行业性的标准。

这种选择适合于中大型项目,特别是需要较大的团队合作和需要长期维护和二次开发情况。个人认为这是将来PHP开发的趋势。

而对于基于组件和事件驱动的开发方式大多数PHP程序员都不感兴趣。但是也有不少人在做这方面的努力,例如Codegear的Delphi for PHP,就吸引了很多人的关注。如果有强大的商业支持,也许将来在开发市场也会占一席之地。

我会在下一篇文章介绍D4P的新特性并作评测。

WEB开发的未来展望:

随着更贴近HTTP的REST的流行,我觉得像.NET和Java中的抽象组件的方式会受到冲击。因为这些组件并不如它们所承诺的那么方便。未来MVC+REST+RIA的模式应该会比较流行。

AJAX是一把双刃剑,尽管事件驱动的架构看起来非常适合于处理异步的请求(可以想像页面中存在几个组件,每个组件都可以触发异步请求,对应对服务器端的某个事件处理器,看起来是很理想的一个处理方式),但要为客户端自动生成良好的JavaScript代码是很不容易的,要满足各种浏览器的兼容性要求,还要能够自己进行扩展,以满足项目中千奇百怪的需求。 很多时候我更倾向于使用一些JS框架如Prototype来自己开发各种效果,而不是在服务器端生成。在服务器端生成JS的两个结果,一是对生成的代码不信任,二是人变傻,因为你并不知道真正发生了什么。

(一点牢骚也贴上来)
关于WEB开发的个人疑惑:

l 为了让开发更简单,我们不得不学习使用复杂的开发工具和框架,这到底是一个进步,还是退步?

l IDE让程序员变聪明还是变傻? 当我们在服务器代码里面就可以设计客户端界面,这是一个进步还是退步?

举个例子说,微软的ASP.NET AJAX,让我们可以在服务器端设计各种异步的控件。那么程序员甚至可以不会Javascript,不懂AJAX就设计出各种客户端效果。要是哪一天项目需要设计稍复杂的效果,靠IDE和框架无法自动完成,你要怎么办? 到这个时候再来学JS,也许就迟了。更可怕的是,技术在更新和淘汰,可能十年之后,你会发现自己除了各种IDE之后,真正精通的技术很少,脱离了IDE你写一个小程序都要查半天API手册,因为你平时都是依赖“自动补齐”来写代码的! 这样的情景,我想没有人愿意发生。

也许对于短期开发的项目来说,是一个进步,但对于程序员个人的成长来说,这并不是好事。对工具的依赖,导致了我们对于底层和核心技术的不求甚解,限制了个人的成长。




关于三种主流WEB架构的思考
Haohappy  haohappy AT msn.com
转载请注明来源:http://blog.youkuaiyun.com/haohappy2004

做WEB好几年了,各种语言和技术都稍有涉猎。今天心血来潮,突然想总结一下。其实不论什么技术,什么需求,通常WEB开发就是通过WEB前端管理一个或大或小或独立或分布式的关系型数据库,很多东西都是相通的。这里说的WEB架构,是指WEB应用开发中每种技术独有的资源组织形式(包括文件,数据库,HTTP请求处理等。注意并非OO的开发方式才有架构一说),也许说开发方式更容易让人理解一些。

以下想法主要以PHP实现为示例,但很多体会我想Java,.NET,Ruby开发者应该也很容易理解。最后是我对于刚面世就引起无数人关注的Delphi fo PHP的评测

WEB程序的架构基本上可以分成以下三类:

(一) 基于“WEB页面/文件”,例如CGI和PHP/ASP程序。程序的文件分别存储在不同的目录里,与URL相对应。当HTTP请求提交至服务器时,URL直接指向某个文件,然后由该文件来处理请求,并返回响应结果。

比如http://www.website.conm/news/readnews.php?id=1234

可以想像,我们在站点根目录的news目录下放置一个readnews.php文件。

这种开发方式最自然,最易理解,也是PHP最常用的方式。要注意产生的URL对搜索引擎不友好,不过你可以用服务器提供的URL重写方案来处理,例如Apache的mod_rewrite。

(二) 基于“动作”(Action)。这是MVC架构的WEB程序所采用的最常见的方式。目前主流的WEB框架像Struts、Webwork(Java),Ruby on Rails(Ruby),Zend Framework(PHP)等都采用这种设计。URL映射到控制器(controller)和控制器中的动作(action),由action来处理请求并输出响应结果。这种设计和上面的基于文件的方式一样,都是请求/响应驱动的方案,离不开HTTP。

比如 http://www.website.com/news/read/id/1234

可以想像在实际代码中,我们会有一个控制器newsController,其中有一个readAction。不同框架可能默认实现方式稍有不同,有的是一个Controller一个文件,其中有多个Action,有的是每个Action一个文件。当然这些你都可以自己控制,题外话。

这种方式的URL通常都很漂亮,对搜索引擎友好,因为很多框架都自带有URL重写功能。可以自由规定URL中controller、action及参数出现的位置。

另外,还有更直接的基于URL的设计方案,那就是REST。通过人为规定URL的构成形式(比如Action限制成只有几种)来促进网站之间的互相访问,降低开发的复杂性,提高系统的可伸缩性。REST对于Web Services来说是一个创新。

虽然本文讨论的是单个项目所采用的架构,而REST是为了解决网站之间的通讯问题,但REST的出现,会对单个项目的架构造成影响(很显然你在开发时就要构造规范的URL)。将来混用REST和MVC应该也是一种趋势。RoR提供很好的REST支持,Zend Framework也提供了Zend_Rest来支持REST,包括Server和Client。

(三) 基于“组件”(Component ,GUI设计也常称控件)、事件驱动的架构,最常见的是微软的.NET。基本思想是把程序分成很多组件,每个组件都可以触发事件,调用特定的事件处理器来处理(比如在一个HTML按钮上设置onClick事件链接到一个PHP函数)。这种设计远离HTTP,HTTP请求完全抽象,映射到一个事件。

事实上这种设计原本最常应用于传统桌面GUI程序的开发,例如Delphi,Java Swing等。所有表现层的组件比如窗口,或者HTML表单都可以由IDE来提供,我们只需要在IDE里点击或拖动鼠标就能够自动添加一个组件,并且添加一个相应的事件处理器。

这种开发方式有几个优点:

· 复用性 -代码高度可重用。

· 易于使用 -通常只需要配置控件的属性,编写相关的事件处理函数。

我个人也挺喜欢这种方式,PEAR就提供了相当强大的HTML_QuickForm,用于在页面添加表单元素及其事件处理函数,还可以与Smarty等模板引擎相结合。这对于项目开发来说是一个补充性的功能,在项目中的某些部份使用QuickForm,有时可以大大加快开发。

而完全基于组件和事件驱动的开发框架对于PHP来说也已经不新鲜,PRADO就是一个这样的框架,曾经得过Zend编程大赛的头奖。但目前来说很显然Prado所提倡的这种开发方式仍然没有被大部份PHP程序员所接受。为什么呢?

我觉得主要有以下两个问题:

(1)效率问题

这里指的不是开发效率,而是代码的执行效率。众所周知,正常情况下,PHP的执行是相当高效的。但是目前这种基于控件的框架效率都成问题。Prado本身提供了一个缓存机制来缓解这个问题。如果不采用缓存,可以说很多站点根本不能使用Prado这样的框架,比如门户网站,大型论坛等。

但ASP .NET不太一样,因为它是编译型的框架,最后生成的代码是编译生成的,不需要再次进行中间过程的诸多处理,所以在第一次执行之后速度会很快,执行效率还是很高的。 这是语言层次的功能,Prado无法通过代码层次的努力完全弥补。

(2)没有强大的IDE支持

设置控件的属性,添加其对应的事件处理器,看似简单,但控件多了,这也是个繁重的工作。.NET的强大就在于它把程序员从重复的工作中解放了出来,设置属性很方便,事件处理器也会自动添加。Prado目前没有这样的IDE支持。

总之,这种基于控件的框架比较适合于用户交互较多的,需要对页面中的很多组件设置不同处理操作,但对于性能要求不高的应用。另外,带有组件支持的框架通常对AJAX的支持都较好,比如.NET和Ruby on Rails。

综上,三种架构基本上可以代表目前的所有主流WEB开发方式,包括PHP,JavaEE,.NET,Ruby/RoR。

目前PHP开发的状况和未来的趋势:

平时做PHP比较多,特别总结一下PHP开发的趋势。目前在PHP开发中,我们最常用的是基于“文件”的架构,其实也就是一种“面向过程”的开发方式。通常我们写PHP程序的目的就是“快点上线,让程序跑起来”。而且大多数PHP程序员还要和HTML、CSS做近身搏斗,所以如果程序太抽象,调整视觉效果就比较困难。所以对于小项目,这是一个最好的选择。

但越来越多人认识到,面向对象和MVC框架更能促进代码的复用和分享,而且程序易于扩展,随着程序复杂性的增加这个趋势越明显。所以OO框架层出不穷。目前PHP框架当中最有前景的是CakePHP、Symphony和Zend Framework,各自拥有活跃的社区和庞大的用户群,都在快速成长当中。PHP的框架都避免走Java框架庞大臃肿的老路,致力于快速开发,而且主动模仿和吸收RoR这些优秀框架的新特性。随着PHP5的普及和这些框架的成熟,加上PHP原本开发社区的庞大人数,将来也许又会再产生出一些行业性的标准。

这种选择适合于中大型项目,特别是需要较大的团队合作和需要长期维护和二次开发情况。个人认为这是将来PHP开发的趋势。

而对于基于组件和事件驱动的开发方式大多数PHP程序员都不感兴趣。但是也有不少人在做这方面的努力,例如Codegear的Delphi for PHP,就吸引了很多人的关注。如果有强大的商业支持,也许将来在开发市场也会占一席之地。

我会在下一篇文章介绍D4P的新特性并作评测。

WEB开发的未来展望:

随着更贴近HTTP的REST的流行,我觉得像.NET和Java中的抽象组件的方式会受到冲击。因为这些组件并不如它们所承诺的那么方便。未来MVC+REST+RIA的模式应该会比较流行。

AJAX是一把双刃剑,尽管事件驱动的架构看起来非常适合于处理异步的请求(可以想像页面中存在几个组件,每个组件都可以触发异步请求,对应对服务器端的某个事件处理器,看起来是很理想的一个处理方式),但要为客户端自动生成良好的JavaScript代码是很不容易的,要满足各种浏览器的兼容性要求,还要能够自己进行扩展,以满足项目中千奇百怪的需求。 很多时候我更倾向于使用一些JS框架如Prototype来自己开发各种效果,而不是在服务器端生成。在服务器端生成JS的两个结果,一是对生成的代码不信任,二是人变傻,因为你并不知道真正发生了什么。

(一点牢骚也贴上来)
关于WEB开发的个人疑惑:

l 为了让开发更简单,我们不得不学习使用复杂的开发工具和框架,这到底是一个进步,还是退步?

l IDE让程序员变聪明还是变傻? 当我们在服务器代码里面就可以设计客户端界面,这是一个进步还是退步?

举个例子说,微软的ASP.NET AJAX,让我们可以在服务器端设计各种异步的控件。那么程序员甚至可以不会Javascript,不懂AJAX就设计出各种客户端效果。要是哪一天项目需要设计稍复杂的效果,靠IDE和框架无法自动完成,你要怎么办? 到这个时候再来学JS,也许就迟了。更可怕的是,技术在更新和淘汰,可能十年之后,你会发现自己除了各种IDE之后,真正精通的技术很少,脱离了IDE你写一个小程序都要查半天API手册,因为你平时都是依赖“自动补齐”来写代码的! 这样的情景,我想没有人愿意发生。

也许对于短期开发的项目来说,是一个进步,但对于程序员个人的成长来说,这并不是好事。对工具的依赖,导致了我们对于底层和核心技术的不求甚解,限制了个人的成长。




关于三种主流WEB架构的思考
Haohappy  haohappy AT msn.com
转载请注明来源:http://blog.youkuaiyun.com/haohappy2004

做WEB好几年了,各种语言和技术都稍有涉猎。今天心血来潮,突然想总结一下。其实不论什么技术,什么需求,通常WEB开发就是通过WEB前端管理一个或大或小或独立或分布式的关系型数据库,很多东西都是相通的。这里说的WEB架构,是指WEB应用开发中每种技术独有的资源组织形式(包括文件,数据库,HTTP请求处理等。注意并非OO的开发方式才有架构一说),也许说开发方式更容易让人理解一些。

以下想法主要以PHP实现为示例,但很多体会我想Java,.NET,Ruby开发者应该也很容易理解。最后是我对于刚面世就引起无数人关注的Delphi fo PHP的评测

WEB程序的架构基本上可以分成以下三类:

(一) 基于“WEB页面/文件”,例如CGI和PHP/ASP程序。程序的文件分别存储在不同的目录里,与URL相对应。当HTTP请求提交至服务器时,URL直接指向某个文件,然后由该文件来处理请求,并返回响应结果。

比如http://www.website.conm/news/readnews.php?id=1234

可以想像,我们在站点根目录的news目录下放置一个readnews.php文件。

这种开发方式最自然,最易理解,也是PHP最常用的方式。要注意产生的URL对搜索引擎不友好,不过你可以用服务器提供的URL重写方案来处理,例如Apache的mod_rewrite。

(二) 基于“动作”(Action)。这是MVC架构的WEB程序所采用的最常见的方式。目前主流的WEB框架像Struts、Webwork(Java),Ruby on Rails(Ruby),Zend Framework(PHP)等都采用这种设计。URL映射到控制器(controller)和控制器中的动作(action),由action来处理请求并输出响应结果。这种设计和上面的基于文件的方式一样,都是请求/响应驱动的方案,离不开HTTP。

比如 http://www.website.com/news/read/id/1234

可以想像在实际代码中,我们会有一个控制器newsController,其中有一个readAction。不同框架可能默认实现方式稍有不同,有的是一个Controller一个文件,其中有多个Action,有的是每个Action一个文件。当然这些你都可以自己控制,题外话。

这种方式的URL通常都很漂亮,对搜索引擎友好,因为很多框架都自带有URL重写功能。可以自由规定URL中controller、action及参数出现的位置。

另外,还有更直接的基于URL的设计方案,那就是REST。通过人为规定URL的构成形式(比如Action限制成只有几种)来促进网站之间的互相访问,降低开发的复杂性,提高系统的可伸缩性。REST对于Web Services来说是一个创新。

虽然本文讨论的是单个项目所采用的架构,而REST是为了解决网站之间的通讯问题,但REST的出现,会对单个项目的架构造成影响(很显然你在开发时就要构造规范的URL)。将来混用REST和MVC应该也是一种趋势。RoR提供很好的REST支持,Zend Framework也提供了Zend_Rest来支持REST,包括Server和Client。

(三) 基于“组件”(Component ,GUI设计也常称控件)、事件驱动的架构,最常见的是微软的.NET。基本思想是把程序分成很多组件,每个组件都可以触发事件,调用特定的事件处理器来处理(比如在一个HTML按钮上设置onClick事件链接到一个PHP函数)。这种设计远离HTTP,HTTP请求完全抽象,映射到一个事件。

事实上这种设计原本最常应用于传统桌面GUI程序的开发,例如Delphi,Java Swing等。所有表现层的组件比如窗口,或者HTML表单都可以由IDE来提供,我们只需要在IDE里点击或拖动鼠标就能够自动添加一个组件,并且添加一个相应的事件处理器。

这种开发方式有几个优点:

· 复用性 -代码高度可重用。

· 易于使用 -通常只需要配置控件的属性,编写相关的事件处理函数。

我个人也挺喜欢这种方式,PEAR就提供了相当强大的HTML_QuickForm,用于在页面添加表单元素及其事件处理函数,还可以与Smarty等模板引擎相结合。这对于项目开发来说是一个补充性的功能,在项目中的某些部份使用QuickForm,有时可以大大加快开发。

而完全基于组件和事件驱动的开发框架对于PHP来说也已经不新鲜,PRADO就是一个这样的框架,曾经得过Zend编程大赛的头奖。但目前来说很显然Prado所提倡的这种开发方式仍然没有被大部份PHP程序员所接受。为什么呢?

我觉得主要有以下两个问题:

(1)效率问题

这里指的不是开发效率,而是代码的执行效率。众所周知,正常情况下,PHP的执行是相当高效的。但是目前这种基于控件的框架效率都成问题。Prado本身提供了一个缓存机制来缓解这个问题。如果不采用缓存,可以说很多站点根本不能使用Prado这样的框架,比如门户网站,大型论坛等。

但ASP .NET不太一样,因为它是编译型的框架,最后生成的代码是编译生成的,不需要再次进行中间过程的诸多处理,所以在第一次执行之后速度会很快,执行效率还是很高的。 这是语言层次的功能,Prado无法通过代码层次的努力完全弥补。

(2)没有强大的IDE支持

设置控件的属性,添加其对应的事件处理器,看似简单,但控件多了,这也是个繁重的工作。.NET的强大就在于它把程序员从重复的工作中解放了出来,设置属性很方便,事件处理器也会自动添加。Prado目前没有这样的IDE支持。

总之,这种基于控件的框架比较适合于用户交互较多的,需要对页面中的很多组件设置不同处理操作,但对于性能要求不高的应用。另外,带有组件支持的框架通常对AJAX的支持都较好,比如.NET和Ruby on Rails。

综上,三种架构基本上可以代表目前的所有主流WEB开发方式,包括PHP,JavaEE,.NET,Ruby/RoR。

目前PHP开发的状况和未来的趋势:

平时做PHP比较多,特别总结一下PHP开发的趋势。目前在PHP开发中,我们最常用的是基于“文件”的架构,其实也就是一种“面向过程”的开发方式。通常我们写PHP程序的目的就是“快点上线,让程序跑起来”。而且大多数PHP程序员还要和HTML、CSS做近身搏斗,所以如果程序太抽象,调整视觉效果就比较困难。所以对于小项目,这是一个最好的选择。

但越来越多人认识到,面向对象和MVC框架更能促进代码的复用和分享,而且程序易于扩展,随着程序复杂性的增加这个趋势越明显。所以OO框架层出不穷。目前PHP框架当中最有前景的是CakePHP、Symphony和Zend Framework,各自拥有活跃的社区和庞大的用户群,都在快速成长当中。PHP的框架都避免走Java框架庞大臃肿的老路,致力于快速开发,而且主动模仿和吸收RoR这些优秀框架的新特性。随着PHP5的普及和这些框架的成熟,加上PHP原本开发社区的庞大人数,将来也许又会再产生出一些行业性的标准。

这种选择适合于中大型项目,特别是需要较大的团队合作和需要长期维护和二次开发情况。个人认为这是将来PHP开发的趋势。

而对于基于组件和事件驱动的开发方式大多数PHP程序员都不感兴趣。但是也有不少人在做这方面的努力,例如Codegear的Delphi for PHP,就吸引了很多人的关注。如果有强大的商业支持,也许将来在开发市场也会占一席之地。

我会在下一篇文章介绍D4P的新特性并作评测。

WEB开发的未来展望:

随着更贴近HTTP的REST的流行,我觉得像.NET和Java中的抽象组件的方式会受到冲击。因为这些组件并不如它们所承诺的那么方便。未来MVC+REST+RIA的模式应该会比较流行。

AJAX是一把双刃剑,尽管事件驱动的架构看起来非常适合于处理异步的请求(可以想像页面中存在几个组件,每个组件都可以触发异步请求,对应对服务器端的某个事件处理器,看起来是很理想的一个处理方式),但要为客户端自动生成良好的JavaScript代码是很不容易的,要满足各种浏览器的兼容性要求,还要能够自己进行扩展,以满足项目中千奇百怪的需求。 很多时候我更倾向于使用一些JS框架如Prototype来自己开发各种效果,而不是在服务器端生成。在服务器端生成JS的两个结果,一是对生成的代码不信任,二是人变傻,因为你并不知道真正发生了什么。

(一点牢骚也贴上来)
关于WEB开发的个人疑惑:

l 为了让开发更简单,我们不得不学习使用复杂的开发工具和框架,这到底是一个进步,还是退步?

l IDE让程序员变聪明还是变傻? 当我们在服务器代码里面就可以设计客户端界面,这是一个进步还是退步?

举个例子说,微软的ASP.NET AJAX,让我们可以在服务器端设计各种异步的控件。那么程序员甚至可以不会Javascript,不懂AJAX就设计出各种客户端效果。要是哪一天项目需要设计稍复杂的效果,靠IDE和框架无法自动完成,你要怎么办? 到这个时候再来学JS,也许就迟了。更可怕的是,技术在更新和淘汰,可能十年之后,你会发现自己除了各种IDE之后,真正精通的技术很少,脱离了IDE你写一个小程序都要查半天API手册,因为你平时都是依赖“自动补齐”来写代码的! 这样的情景,我想没有人愿意发生。

也许对于短期开发的项目来说,是一个进步,但对于程序员个人的成长来说,这并不是好事。对工具的依赖,导致了我们对于底层和核心技术的不求甚解,限制了个人的成长。




关于三种主流WEB架构的思考
Haohappy  haohappy AT msn.com
转载请注明来源:http://blog.youkuaiyun.com/haohappy2004

做WEB好几年了,各种语言和技术都稍有涉猎。今天心血来潮,突然想总结一下。其实不论什么技术,什么需求,通常WEB开发就是通过WEB前端管理一个或大或小或独立或分布式的关系型数据库,很多东西都是相通的。这里说的WEB架构,是指WEB应用开发中每种技术独有的资源组织形式(包括文件,数据库,HTTP请求处理等。注意并非OO的开发方式才有架构一说),也许说开发方式更容易让人理解一些。

以下想法主要以PHP实现为示例,但很多体会我想Java,.NET,Ruby开发者应该也很容易理解。最后是我对于刚面世就引起无数人关注的Delphi fo PHP的评测

WEB程序的架构基本上可以分成以下三类:

(一) 基于“WEB页面/文件”,例如CGI和PHP/ASP程序。程序的文件分别存储在不同的目录里,与URL相对应。当HTTP请求提交至服务器时,URL直接指向某个文件,然后由该文件来处理请求,并返回响应结果。

比如http://www.website.conm/news/readnews.php?id=1234

可以想像,我们在站点根目录的news目录下放置一个readnews.php文件。

这种开发方式最自然,最易理解,也是PHP最常用的方式。要注意产生的URL对搜索引擎不友好,不过你可以用服务器提供的URL重写方案来处理,例如Apache的mod_rewrite。

(二) 基于“动作”(Action)。这是MVC架构的WEB程序所采用的最常见的方式。目前主流的WEB框架像Struts、Webwork(Java),Ruby on Rails(Ruby),Zend Framework(PHP)等都采用这种设计。URL映射到控制器(controller)和控制器中的动作(action),由action来处理请求并输出响应结果。这种设计和上面的基于文件的方式一样,都是请求/响应驱动的方案,离不开HTTP。

比如 http://www.website.com/news/read/id/1234

可以想像在实际代码中,我们会有一个控制器newsController,其中有一个readAction。不同框架可能默认实现方式稍有不同,有的是一个Controller一个文件,其中有多个Action,有的是每个Action一个文件。当然这些你都可以自己控制,题外话。

这种方式的URL通常都很漂亮,对搜索引擎友好,因为很多框架都自带有URL重写功能。可以自由规定URL中controller、action及参数出现的位置。

另外,还有更直接的基于URL的设计方案,那就是REST。通过人为规定URL的构成形式(比如Action限制成只有几种)来促进网站之间的互相访问,降低开发的复杂性,提高系统的可伸缩性。REST对于Web Services来说是一个创新。

虽然本文讨论的是单个项目所采用的架构,而REST是为了解决网站之间的通讯问题,但REST的出现,会对单个项目的架构造成影响(很显然你在开发时就要构造规范的URL)。将来混用REST和MVC应该也是一种趋势。RoR提供很好的REST支持,Zend Framework也提供了Zend_Rest来支持REST,包括Server和Client。

(三) 基于“组件”(Component ,GUI设计也常称控件)、事件驱动的架构,最常见的是微软的.NET。基本思想是把程序分成很多组件,每个组件都可以触发事件,调用特定的事件处理器来处理(比如在一个HTML按钮上设置onClick事件链接到一个PHP函数)。这种设计远离HTTP,HTTP请求完全抽象,映射到一个事件。

事实上这种设计原本最常应用于传统桌面GUI程序的开发,例如Delphi,Java Swing等。所有表现层的组件比如窗口,或者HTML表单都可以由IDE来提供,我们只需要在IDE里点击或拖动鼠标就能够自动添加一个组件,并且添加一个相应的事件处理器。

这种开发方式有几个优点:

· 复用性 -代码高度可重用。

· 易于使用 -通常只需要配置控件的属性,编写相关的事件处理函数。

我个人也挺喜欢这种方式,PEAR就提供了相当强大的HTML_QuickForm,用于在页面添加表单元素及其事件处理函数,还可以与Smarty等模板引擎相结合。这对于项目开发来说是一个补充性的功能,在项目中的某些部份使用QuickForm,有时可以大大加快开发。

而完全基于组件和事件驱动的开发框架对于PHP来说也已经不新鲜,PRADO就是一个这样的框架,曾经得过Zend编程大赛的头奖。但目前来说很显然Prado所提倡的这种开发方式仍然没有被大部份PHP程序员所接受。为什么呢?

我觉得主要有以下两个问题:

(1)效率问题

这里指的不是开发效率,而是代码的执行效率。众所周知,正常情况下,PHP的执行是相当高效的。但是目前这种基于控件的框架效率都成问题。Prado本身提供了一个缓存机制来缓解这个问题。如果不采用缓存,可以说很多站点根本不能使用Prado这样的框架,比如门户网站,大型论坛等。

但ASP .NET不太一样,因为它是编译型的框架,最后生成的代码是编译生成的,不需要再次进行中间过程的诸多处理,所以在第一次执行之后速度会很快,执行效率还是很高的。 这是语言层次的功能,Prado无法通过代码层次的努力完全弥补。

(2)没有强大的IDE支持

设置控件的属性,添加其对应的事件处理器,看似简单,但控件多了,这也是个繁重的工作。.NET的强大就在于它把程序员从重复的工作中解放了出来,设置属性很方便,事件处理器也会自动添加。Prado目前没有这样的IDE支持。

总之,这种基于控件的框架比较适合于用户交互较多的,需要对页面中的很多组件设置不同处理操作,但对于性能要求不高的应用。另外,带有组件支持的框架通常对AJAX的支持都较好,比如.NET和Ruby on Rails。

综上,三种架构基本上可以代表目前的所有主流WEB开发方式,包括PHP,JavaEE,.NET,Ruby/RoR。

目前PHP开发的状况和未来的趋势:

平时做PHP比较多,特别总结一下PHP开发的趋势。目前在PHP开发中,我们最常用的是基于“文件”的架构,其实也就是一种“面向过程”的开发方式。通常我们写PHP程序的目的就是“快点上线,让程序跑起来”。而且大多数PHP程序员还要和HTML、CSS做近身搏斗,所以如果程序太抽象,调整视觉效果就比较困难。所以对于小项目,这是一个最好的选择。

但越来越多人认识到,面向对象和MVC框架更能促进代码的复用和分享,而且程序易于扩展,随着程序复杂性的增加这个趋势越明显。所以OO框架层出不穷。目前PHP框架当中最有前景的是CakePHP、Symphony和Zend Framework,各自拥有活跃的社区和庞大的用户群,都在快速成长当中。PHP的框架都避免走Java框架庞大臃肿的老路,致力于快速开发,而且主动模仿和吸收RoR这些优秀框架的新特性。随着PHP5的普及和这些框架的成熟,加上PHP原本开发社区的庞大人数,将来也许又会再产生出一些行业性的标准。

这种选择适合于中大型项目,特别是需要较大的团队合作和需要长期维护和二次开发情况。个人认为这是将来PHP开发的趋势。

而对于基于组件和事件驱动的开发方式大多数PHP程序员都不感兴趣。但是也有不少人在做这方面的努力,例如Codegear的Delphi for PHP,就吸引了很多人的关注。如果有强大的商业支持,也许将来在开发市场也会占一席之地。

我会在下一篇文章介绍D4P的新特性并作评测。

WEB开发的未来展望:

随着更贴近HTTP的REST的流行,我觉得像.NET和Java中的抽象组件的方式会受到冲击。因为这些组件并不如它们所承诺的那么方便。未来MVC+REST+RIA的模式应该会比较流行。

AJAX是一把双刃剑,尽管事件驱动的架构看起来非常适合于处理异步的请求(可以想像页面中存在几个组件,每个组件都可以触发异步请求,对应对服务器端的某个事件处理器,看起来是很理想的一个处理方式),但要为客户端自动生成良好的JavaScript代码是很不容易的,要满足各种浏览器的兼容性要求,还要能够自己进行扩展,以满足项目中千奇百怪的需求。 很多时候我更倾向于使用一些JS框架如Prototype来自己开发各种效果,而不是在服务器端生成。在服务器端生成JS的两个结果,一是对生成的代码不信任,二是人变傻,因为你并不知道真正发生了什么。

(一点牢骚也贴上来)
关于WEB开发的个人疑惑:

l 为了让开发更简单,我们不得不学习使用复杂的开发工具和框架,这到底是一个进步,还是退步?

l IDE让程序员变聪明还是变傻? 当我们在服务器代码里面就可以设计客户端界面,这是一个进步还是退步?

举个例子说,微软的ASP.NET AJAX,让我们可以在服务器端设计各种异步的控件。那么程序员甚至可以不会Javascript,不懂AJAX就设计出各种客户端效果。要是哪一天项目需要设计稍复杂的效果,靠IDE和框架无法自动完成,你要怎么办? 到这个时候再来学JS,也许就迟了。更可怕的是,技术在更新和淘汰,可能十年之后,你会发现自己除了各种IDE之后,真正精通的技术很少,脱离了IDE你写一个小程序都要查半天API手册,因为你平时都是依赖“自动补齐”来写代码的! 这样的情景,我想没有人愿意发生。

也许对于短期开发的项目来说,是一个进步,但对于程序员个人的成长来说,这并不是好事。对工具的依赖,导致了我们对于底层和核心技术的不求甚解,限制了个人的成长。




关于三种主流WEB架构的思考
Haohappy  haohappy AT msn.com
转载请注明来源:http://blog.youkuaiyun.com/haohappy2004

做WEB好几年了,各种语言和技术都稍有涉猎。今天心血来潮,突然想总结一下。其实不论什么技术,什么需求,通常WEB开发就是通过WEB前端管理一个或大或小或独立或分布式的关系型数据库,很多东西都是相通的。这里说的WEB架构,是指WEB应用开发中每种技术独有的资源组织形式(包括文件,数据库,HTTP请求处理等。注意并非OO的开发方式才有架构一说),也许说开发方式更容易让人理解一些。

以下想法主要以PHP实现为示例,但很多体会我想Java,.NET,Ruby开发者应该也很容易理解。最后是我对于刚面世就引起无数人关注的Delphi fo PHP的评测

WEB程序的架构基本上可以分成以下三类:

(一) 基于“WEB页面/文件”,例如CGI和PHP/ASP程序。程序的文件分别存储在不同的目录里,与URL相对应。当HTTP请求提交至服务器时,URL直接指向某个文件,然后由该文件来处理请求,并返回响应结果。

比如http://www.website.conm/news/readnews.php?id=1234

可以想像,我们在站点根目录的news目录下放置一个readnews.php文件。

这种开发方式最自然,最易理解,也是PHP最常用的方式。要注意产生的URL对搜索引擎不友好,不过你可以用服务器提供的URL重写方案来处理,例如Apache的mod_rewrite。

(二) 基于“动作”(Action)。这是MVC架构的WEB程序所采用的最常见的方式。目前主流的WEB框架像Struts、Webwork(Java),Ruby on Rails(Ruby),Zend Framework(PHP)等都采用这种设计。URL映射到控制器(controller)和控制器中的动作(action),由action来处理请求并输出响应结果。这种设计和上面的基于文件的方式一样,都是请求/响应驱动的方案,离不开HTTP。

比如 http://www.website.com/news/read/id/1234

可以想像在实际代码中,我们会有一个控制器newsController,其中有一个readAction。不同框架可能默认实现方式稍有不同,有的是一个Controller一个文件,其中有多个Action,有的是每个Action一个文件。当然这些你都可以自己控制,题外话。

这种方式的URL通常都很漂亮,对搜索引擎友好,因为很多框架都自带有URL重写功能。可以自由规定URL中controller、action及参数出现的位置。

另外,还有更直接的基于URL的设计方案,那就是REST。通过人为规定URL的构成形式(比如Action限制成只有几种)来促进网站之间的互相访问,降低开发的复杂性,提高系统的可伸缩性。REST对于Web Services来说是一个创新。

虽然本文讨论的是单个项目所采用的架构,而REST是为了解决网站之间的通讯问题,但REST的出现,会对单个项目的架构造成影响(很显然你在开发时就要构造规范的URL)。将来混用REST和MVC应该也是一种趋势。RoR提供很好的REST支持,Zend Framework也提供了Zend_Rest来支持REST,包括Server和Client。

(三) 基于“组件”(Component ,GUI设计也常称控件)、事件驱动的架构,最常见的是微软的.NET。基本思想是把程序分成很多组件,每个组件都可以触发事件,调用特定的事件处理器来处理(比如在一个HTML按钮上设置onClick事件链接到一个PHP函数)。这种设计远离HTTP,HTTP请求完全抽象,映射到一个事件。

事实上这种设计原本最常应用于传统桌面GUI程序的开发,例如Delphi,Java Swing等。所有表现层的组件比如窗口,或者HTML表单都可以由IDE来提供,我们只需要在IDE里点击或拖动鼠标就能够自动添加一个组件,并且添加一个相应的事件处理器。

这种开发方式有几个优点:

· 复用性 -代码高度可重用。

· 易于使用 -通常只需要配置控件的属性,编写相关的事件处理函数。

我个人也挺喜欢这种方式,PEAR就提供了相当强大的HTML_QuickForm,用于在页面添加表单元素及其事件处理函数,还可以与Smarty等模板引擎相结合。这对于项目开发来说是一个补充性的功能,在项目中的某些部份使用QuickForm,有时可以大大加快开发。

而完全基于组件和事件驱动的开发框架对于PHP来说也已经不新鲜,PRADO就是一个这样的框架,曾经得过Zend编程大赛的头奖。但目前来说很显然Prado所提倡的这种开发方式仍然没有被大部份PHP程序员所接受。为什么呢?

我觉得主要有以下两个问题:

(1)效率问题

这里指的不是开发效率,而是代码的执行效率。众所周知,正常情况下,PHP的执行是相当高效的。但是目前这种基于控件的框架效率都成问题。Prado本身提供了一个缓存机制来缓解这个问题。如果不采用缓存,可以说很多站点根本不能使用Prado这样的框架,比如门户网站,大型论坛等。

但ASP .NET不太一样,因为它是编译型的框架,最后生成的代码是编译生成的,不需要再次进行中间过程的诸多处理,所以在第一次执行之后速度会很快,执行效率还是很高的。 这是语言层次的功能,Prado无法通过代码层次的努力完全弥补。

(2)没有强大的IDE支持

设置控件的属性,添加其对应的事件处理器,看似简单,但控件多了,这也是个繁重的工作。.NET的强大就在于它把程序员从重复的工作中解放了出来,设置属性很方便,事件处理器也会自动添加。Prado目前没有这样的IDE支持。

总之,这种基于控件的框架比较适合于用户交互较多的,需要对页面中的很多组件设置不同处理操作,但对于性能要求不高的应用。另外,带有组件支持的框架通常对AJAX的支持都较好,比如.NET和Ruby on Rails。

综上,三种架构基本上可以代表目前的所有主流WEB开发方式,包括PHP,JavaEE,.NET,Ruby/RoR。

目前PHP开发的状况和未来的趋势:

平时做PHP比较多,特别总结一下PHP开发的趋势。目前在PHP开发中,我们最常用的是基于“文件”的架构,其实也就是一种“面向过程”的开发方式。通常我们写PHP程序的目的就是“快点上线,让程序跑起来”。而且大多数PHP程序员还要和HTML、CSS做近身搏斗,所以如果程序太抽象,调整视觉效果就比较困难。所以对于小项目,这是一个最好的选择。

但越来越多人认识到,面向对象和MVC框架更能促进代码的复用和分享,而且程序易于扩展,随着程序复杂性的增加这个趋势越明显。所以OO框架层出不穷。目前PHP框架当中最有前景的是CakePHP、Symphony和Zend Framework,各自拥有活跃的社区和庞大的用户群,都在快速成长当中。PHP的框架都避免走Java框架庞大臃肿的老路,致力于快速开发,而且主动模仿和吸收RoR这些优秀框架的新特性。随着PHP5的普及和这些框架的成熟,加上PHP原本开发社区的庞大人数,将来也许又会再产生出一些行业性的标准。

这种选择适合于中大型项目,特别是需要较大的团队合作和需要长期维护和二次开发情况。个人认为这是将来PHP开发的趋势。

而对于基于组件和事件驱动的开发方式大多数PHP程序员都不感兴趣。但是也有不少人在做这方面的努力,例如Codegear的Delphi for PHP,就吸引了很多人的关注。如果有强大的商业支持,也许将来在开发市场也会占一席之地。

我会在下一篇文章介绍D4P的新特性并作评测。

WEB开发的未来展望:

随着更贴近HTTP的REST的流行,我觉得像.NET和Java中的抽象组件的方式会受到冲击。因为这些组件并不如它们所承诺的那么方便。未来MVC+REST+RIA的模式应该会比较流行。

AJAX是一把双刃剑,尽管事件驱动的架构看起来非常适合于处理异步的请求(可以想像页面中存在几个组件,每个组件都可以触发异步请求,对应对服务器端的某个事件处理器,看起来是很理想的一个处理方式),但要为客户端自动生成良好的JavaScript代码是很不容易的,要满足各种浏览器的兼容性要求,还要能够自己进行扩展,以满足项目中千奇百怪的需求。 很多时候我更倾向于使用一些JS框架如Prototype来自己开发各种效果,而不是在服务器端生成。在服务器端生成JS的两个结果,一是对生成的代码不信任,二是人变傻,因为你并不知道真正发生了什么。

(一点牢骚也贴上来)
关于WEB开发的个人疑惑:

l 为了让开发更简单,我们不得不学习使用复杂的开发工具和框架,这到底是一个进步,还是退步?

l IDE让程序员变聪明还是变傻? 当我们在服务器代码里面就可以设计客户端界面,这是一个进步还是退步?

举个例子说,微软的ASP.NET AJAX,让我们可以在服务器端设计各种异步的控件。那么程序员甚至可以不会Javascript,不懂AJAX就设计出各种客户端效果。要是哪一天项目需要设计稍复杂的效果,靠IDE和框架无法自动完成,你要怎么办? 到这个时候再来学JS,也许就迟了。更可怕的是,技术在更新和淘汰,可能十年之后,你会发现自己除了各种IDE之后,真正精通的技术很少,脱离了IDE你写一个小程序都要查半天API手册,因为你平时都是依赖“自动补齐”来写代码的! 这样的情景,我想没有人愿意发生。

也许对于短期开发的项目来说,是一个进步,但对于程序员个人的成长来说,这并不是好事。对工具的依赖,导致了我们对于底层和核心技术的不求甚解,限制了个人的成长。




关于三种主流WEB架构的思考
Haohappy  haohappy AT msn.com
转载请注明来源:http://blog.youkuaiyun.com/haohappy2004

做WEB好几年了,各种语言和技术都稍有涉猎。今天心血来潮,突然想总结一下。其实不论什么技术,什么需求,通常WEB开发就是通过WEB前端管理一个或大或小或独立或分布式的关系型数据库,很多东西都是相通的。这里说的WEB架构,是指WEB应用开发中每种技术独有的资源组织形式(包括文件,数据库,HTTP请求处理等。注意并非OO的开发方式才有架构一说),也许说开发方式更容易让人理解一些。

以下想法主要以PHP实现为示例,但很多体会我想Java,.NET,Ruby开发者应该也很容易理解。最后是我对于刚面世就引起无数人关注的Delphi fo PHP的评测

WEB程序的架构基本上可以分成以下三类:

(一) 基于“WEB页面/文件”,例如CGI和PHP/ASP程序。程序的文件分别存储在不同的目录里,与URL相对应。当HTTP请求提交至服务器时,URL直接指向某个文件,然后由该文件来处理请求,并返回响应结果。

比如http://www.website.conm/news/readnews.php?id=1234

可以想像,我们在站点根目录的news目录下放置一个readnews.php文件。

这种开发方式最自然,最易理解,也是PHP最常用的方式。要注意产生的URL对搜索引擎不友好,不过你可以用服务器提供的URL重写方案来处理,例如Apache的mod_rewrite。

(二) 基于“动作”(Action)。这是MVC架构的WEB程序所采用的最常见的方式。目前主流的WEB框架像Struts、Webwork(Java),Ruby on Rails(Ruby),Zend Framework(PHP)等都采用这种设计。URL映射到控制器(controller)和控制器中的动作(action),由action来处理请求并输出响应结果。这种设计和上面的基于文件的方式一样,都是请求/响应驱动的方案,离不开HTTP。

比如 http://www.website.com/news/read/id/1234

可以想像在实际代码中,我们会有一个控制器newsController,其中有一个readAction。不同框架可能默认实现方式稍有不同,有的是一个Controller一个文件,其中有多个Action,有的是每个Action一个文件。当然这些你都可以自己控制,题外话。

这种方式的URL通常都很漂亮,对搜索引擎友好,因为很多框架都自带有URL重写功能。可以自由规定URL中controller、action及参数出现的位置。

另外,还有更直接的基于URL的设计方案,那就是REST。通过人为规定URL的构成形式(比如Action限制成只有几种)来促进网站之间的互相访问,降低开发的复杂性,提高系统的可伸缩性。REST对于Web Services来说是一个创新。

虽然本文讨论的是单个项目所采用的架构,而REST是为了解决网站之间的通讯问题,但REST的出现,会对单个项目的架构造成影响(很显然你在开发时就要构造规范的URL)。将来混用REST和MVC应该也是一种趋势。RoR提供很好的REST支持,Zend Framework也提供了Zend_Rest来支持REST,包括Server和Client。

(三) 基于“组件”(Component ,GUI设计也常称控件)、事件驱动的架构,最常见的是微软的.NET。基本思想是把程序分成很多组件,每个组件都可以触发事件,调用特定的事件处理器来处理(比如在一个HTML按钮上设置onClick事件链接到一个PHP函数)。这种设计远离HTTP,HTTP请求完全抽象,映射到一个事件。

事实上这种设计原本最常应用于传统桌面GUI程序的开发,例如Delphi,Java Swing等。所有表现层的组件比如窗口,或者HTML表单都可以由IDE来提供,我们只需要在IDE里点击或拖动鼠标就能够自动添加一个组件,并且添加一个相应的事件处理器。

这种开发方式有几个优点:

· 复用性 -代码高度可重用。

· 易于使用 -通常只需要配置控件的属性,编写相关的事件处理函数。

我个人也挺喜欢这种方式,PEAR就提供了相当强大的HTML_QuickForm,用于在页面添加表单元素及其事件处理函数,还可以与Smarty等模板引擎相结合。这对于项目开发来说是一个补充性的功能,在项目中的某些部份使用QuickForm,有时可以大大加快开发。

而完全基于组件和事件驱动的开发框架对于PHP来说也已经不新鲜,PRADO就是一个这样的框架,曾经得过Zend编程大赛的头奖。但目前来说很显然Prado所提倡的这种开发方式仍然没有被大部份PHP程序员所接受。为什么呢?

我觉得主要有以下两个问题:

(1)效率问题

这里指的不是开发效率,而是代码的执行效率。众所周知,正常情况下,PHP的执行是相当高效的。但是目前这种基于控件的框架效率都成问题。Prado本身提供了一个缓存机制来缓解这个问题。如果不采用缓存,可以说很多站点根本不能使用Prado这样的框架,比如门户网站,大型论坛等。

但ASP .NET不太一样,因为它是编译型的框架,最后生成的代码是编译生成的,不需要再次进行中间过程的诸多处理,所以在第一次执行之后速度会很快,执行效率还是很高的。 这是语言层次的功能,Prado无法通过代码层次的努力完全弥补。

(2)没有强大的IDE支持

设置控件的属性,添加其对应的事件处理器,看似简单,但控件多了,这也是个繁重的工作。.NET的强大就在于它把程序员从重复的工作中解放了出来,设置属性很方便,事件处理器也会自动添加。Prado目前没有这样的IDE支持。

总之,这种基于控件的框架比较适合于用户交互较多的,需要对页面中的很多组件设置不同处理操作,但对于性能要求不高的应用。另外,带有组件支持的框架通常对AJAX的支持都较好,比如.NET和Ruby on Rails。

综上,三种架构基本上可以代表目前的所有主流WEB开发方式,包括PHP,JavaEE,.NET,Ruby/RoR。

目前PHP开发的状况和未来的趋势:

平时做PHP比较多,特别总结一下PHP开发的趋势。目前在PHP开发中,我们最常用的是基于“文件”的架构,其实也就是一种“面向过程”的开发方式。通常我们写PHP程序的目的就是“快点上线,让程序跑起来”。而且大多数PHP程序员还要和HTML、CSS做近身搏斗,所以如果程序太抽象,调整视觉效果就比较困难。所以对于小项目,这是一个最好的选择。

但越来越多人认识到,面向对象和MVC框架更能促进代码的复用和分享,而且程序易于扩展,随着程序复杂性的增加这个趋势越明显。所以OO框架层出不穷。目前PHP框架当中最有前景的是CakePHP、Symphony和Zend Framework,各自拥有活跃的社区和庞大的用户群,都在快速成长当中。PHP的框架都避免走Java框架庞大臃肿的老路,致力于快速开发,而且主动模仿和吸收RoR这些优秀框架的新特性。随着PHP5的普及和这些框架的成熟,加上PHP原本开发社区的庞大人数,将来也许又会再产生出一些行业性的标准。

这种选择适合于中大型项目,特别是需要较大的团队合作和需要长期维护和二次开发情况。个人认为这是将来PHP开发的趋势。

而对于基于组件和事件驱动的开发方式大多数PHP程序员都不感兴趣。但是也有不少人在做这方面的努力,例如Codegear的Delphi for PHP,就吸引了很多人的关注。如果有强大的商业支持,也许将来在开发市场也会占一席之地。

我会在下一篇文章介绍D4P的新特性并作评测。

WEB开发的未来展望:

随着更贴近HTTP的REST的流行,我觉得像.NET和Java中的抽象组件的方式会受到冲击。因为这些组件并不如它们所承诺的那么方便。未来MVC+REST+RIA的模式应该会比较流行。

AJAX是一把双刃剑,尽管事件驱动的架构看起来非常适合于处理异步的请求(可以想像页面中存在几个组件,每个组件都可以触发异步请求,对应对服务器端的某个事件处理器,看起来是很理想的一个处理方式),但要为客户端自动生成良好的JavaScript代码是很不容易的,要满足各种浏览器的兼容性要求,还要能够自己进行扩展,以满足项目中千奇百怪的需求。 很多时候我更倾向于使用一些JS框架如Prototype来自己开发各种效果,而不是在服务器端生成。在服务器端生成JS的两个结果,一是对生成的代码不信任,二是人变傻,因为你并不知道真正发生了什么。

(一点牢骚也贴上来)
关于WEB开发的个人疑惑:

l 为了让开发更简单,我们不得不学习使用复杂的开发工具和框架,这到底是一个进步,还是退步?

l IDE让程序员变聪明还是变傻? 当我们在服务器代码里面就可以设计客户端界面,这是一个进步还是退步?

举个例子说,微软的ASP.NET AJAX,让我们可以在服务器端设计各种异步的控件。那么程序员甚至可以不会Javascript,不懂AJAX就设计出各种客户端效果。要是哪一天项目需要设计稍复杂的效果,靠IDE和框架无法自动完成,你要怎么办? 到这个时候再来学JS,也许就迟了。更可怕的是,技术在更新和淘汰,可能十年之后,你会发现自己除了各种IDE之后,真正精通的技术很少,脱离了IDE你写一个小程序都要查半天API手册,因为你平时都是依赖“自动补齐”来写代码的! 这样的情景,我想没有人愿意发生。

也许对于短期开发的项目来说,是一个进步,但对于程序员个人的成长来说,这并不是好事。对工具的依赖,导致了我们对于底层和核心技术的不求甚解,限制了个人的成长。




<think> 嗯,用户现在想了解IT领域的主流架构类型。从对话历史看,用户之前询问过Linux架构,现在转向更广泛的IT架构分类。用户引用了五段材料,但核心诉求很明确——需要系统性的架构类型梳理。 用户可能是一位技术决策者或开发人员,正在为项目选型做调研。ta引用的材料涉及集中式、分布式、容灾设计等概念,说明关注点偏向企业级系统架构。尤其引用[4]提到“避免技术虚荣”和“演进式架构”,暗示用户需要务实、可落地的建议。 梳理主流架构时要注意几个维度: 1. 部署形态:集中式vs分布式 2. 服务结构:单体vs微服务 3. 技术特性:如云原生、超融合等 4. 特殊场景:如容灾架构 引用[1][2]恰好对比了集中式和分布式架构的优劣。集中式在传统行业仍有价值,尤其当业务压力不大时;而分布式(如超融合)通过软件定义存储提升了灵活性。引用[5]则补充了微服务的实现方式。需要强调架构选型的关键因素:团队能力、业务规模、演进路径——这点在引用[4]的“演进式架构”建议里特别重要。 回答框架可以按演进顺序组织:从最基础的单体/三层架构,过渡到分布式,再延伸到云原生等现代架构。每个类型要说明核心特征、典型组件和适用场景,避免单纯堆砌术语。比如超融合架构可以结合引用[2]提到的“计算存储融合”特点展开。 最后生成的问题要引导用户深入思考架构选择:从成本评估到演进策略,再到具体场景适配。用户似乎更关注实践层面,问题设计要侧重可操作性。 </think>根据引用材料和行业实践,IT领域主流架构可分为以下五类,每种架构针对不同业务场景各有优势: --- ### 一、集中式三层架构 **核心结构**: $$ \text{表现层(UI)} \rightarrow \text{逻辑层(业务规则)} \rightarrow \text{数据层(数据库)} $$ **特点**: 1. **垂直分层**:各层职责明确,开发维护简单 2. **硬件依赖**:通常部署在物理服务器+集中式存储(如SAN)[^2] 3. **适用场景**: - 低并发系统(如内部OA、传统ERP) - 业务变更频率低 - 技术团队规模有限[^1][^4] **局限性**: - 扩展性差:需整体扩容硬件 - 单点故障风险高 --- ### 二、分布式架构 **代表技术**:超融合架构(HCI) **核心变革**: $$ \text{传统三层架构} \Rightarrow \text{计算/存储融合节点} + \text{软件定义网络} $$ **优势**: 1. **弹性扩展**:通过增加x86服务器节点横向扩容[^2] 2. **故障隔离**:单节点故障不影响整体服务 3. **成本优化**:采用商用硬件替代专用设备[^2] **运维差异**: | 维度 | 传统架构 | 分布式架构 | |------------|------------------------|--------------------------| | 故障影响 | 存储/交换机宕机导致全局瘫痪 | 单节点故障自动迁移 | | 扩容单元 | 整机柜级 | 单服务器级 | **典型场景**:云计算平台、大规模Web应用[^2][^5] --- ### 三、微服务架构 **核心理念**: $$ \text{单体应用} \xrightarrow{\text{拆分}} \{\text{独立服务}_1, \text{服务}_2, \cdots, \text{服务}_n\} $$ **关键特征**: 1. **服务自治**:每个服务独立开发、部署、扩容 2. **通信机制**:API网关 + 轻量协议(如REST/gRPC) 3. **技术异构**:不同服务可用不同语言/数据库[^5] **拆分原则**: - 业务能力拆分(如订单服务、支付服务) - 领域驱动设计(DDD)限界上下文[^5] **适用性警告**: > ❗ 日活<1000的系统用微服务会增加运维复杂度[^4] --- ### 四、云原生架构 **技术栈**: ```mermaid graph LR A[容器化] --> B[Kubernetes编排] B --> C[服务网格] C --> D[声明式API] ``` **核心价值**: - **持续交付**:容器镜像实现环境一致性 - **自动恢复**:K8s自愈机制保障高可用 - **资源优化**:按需分配计算资源 **演进路径建议**: 单体 → 模块化单体 → 微服务(当团队能独立运维≥2服务时)[^4] --- ### 五、容灾架构 **设计原则**: $$ \text{数据可靠性} = f(\text{冗余度}, \text{故障检测速度}, \text{恢复策略}) $$ **主流方案**: | 类型 | 实现方式 | RTO/RPO | |------------|-----------------------------|---------------| | 同城双活 | 跨机房数据同步+流量调度 | 分钟级 | | 异地多活 | 地理分布式部署+最终一致性 | 秒级 | | 备份容灾 | 定期快照+离线恢复 | 小时级 | **关键考量**:根据业务容忍度选择方案(如金融系统需异地多活)[^3] --- ### 架构选型决策树 ```mermaid graph TD A[业务规模] -->|低并发/小团队| B(集中式三层) A -->|高并发/快速迭代| C{是否需要强一致性?} C -->|是| D[同城双活+微服务] C -->|否| E[异地多活+云原生] B -->|数据库压力>70%| F[分库分表优化] D -->|持续交付周期>1周| G[引入容器化] ``` > **架构演进黄金法则**:复杂度增长斜率应趋近线性[^4]。避免过早分布式化,模块化单体通常是更务实的选择。 --- ### 相关问题 1. 集中式架构在哪些场景下仍比分布式架构更有优势?[^1][^2] 2. 微服务拆分过度会导致什么运维问题?如何评估拆分合理性?[^4][^5] 3. 设计容灾架构时,如何平衡RTO/RPO目标与成本?[^3] 4. 云原生架构中的服务网格解决了哪些微服务的痛点? 5. 传统企业向分布式架构迁移的关键挑战是什么?[^2]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值