﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-云淡风轻-随笔分类-JAVA相关</title><link>http://www.blogjava.net/yihan422/category/221.html</link><description>闭关苦修中................</description><language>zh-cn</language><lastBuildDate>Wed, 28 Feb 2007 18:22:02 GMT</lastBuildDate><pubDate>Wed, 28 Feb 2007 18:22:02 GMT</pubDate><ttl>60</ttl><item><title>第一个帖子，先转篇文章--------C&amp;S B&amp;S及三层结构</title><link>http://www.blogjava.net/yihan422/archive/2005/01/30/829.html</link><dc:creator>俊子</dc:creator><author>俊子</author><pubDate>Sun, 30 Jan 2005 04:47:00 GMT</pubDate><guid>http://www.blogjava.net/yihan422/archive/2005/01/30/829.html</guid><wfw:comment>http://www.blogjava.net/yihan422/comments/829.html</wfw:comment><comments>http://www.blogjava.net/yihan422/archive/2005/01/30/829.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/yihan422/comments/commentRss/829.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yihan422/services/trackbacks/829.html</trackback:ping><description><![CDATA[<P>对一名软件开发人员而言，计算机语言只是手段，开发平台是工具，而技术才是真正的实现。所以任何一位在软件开发领域奋斗的朋友，都应努力把握目前软件开发的主流技术与知识，才能在这个领域中立于不败之地。 <BR><BR>多层模式（n tier） <BR><BR>　　从事过windows下mis程序开发的人，都很清楚c/s是怎样实现的，在此笔者并不是要抛弃两层模式，只是希望通过笔者的描述帮助大家建立概念及了解三层结构带给我们的是什么空间。 <BR><BR>误解一：c/s退出历史舞台了 <BR><BR>　　笔者以为，c/s并没有到这么惨的地步，任何一个项目或任何一种方案，都要分析一下它实现的是什么东西，并且它将要面对的最终用户是什么性质。比如开发一个在windows下运行的程序，或开发一个在局域网内并且只针对少量用户的程序，或者一个管理程序、后台运行程序，未必一定强求使用多层模式，因为它并不能给你带来什么，反而会增加你的工作量与维护量。 <BR><BR>　　我们不应该单纯追求技术的先进性，而要追求实用技术，当你要实现一个方案时，你要分析项目的性质及最终用户，然后再寻找能解决你问题的最实用手段。因为用户并不关心你采用多么先进的技术，用户关心的是可靠（reliable）、快速（rapid）、方便（convenient）。 <BR><BR>误解二：多层模式只适用于大型项目 <BR><BR>　　这是常见的一种误区，包括笔者自己，在进入n tier领域之前都是这种想法。但随着对n tier了解的不断深入，才发现这种理解是错误的。具体的选择应根据项目的特点及面向的最终用户群性质来决定。 <BR><BR>　　如果你的项目运行在广域网，就必须考虑数据的安全以及带宽问题，或者当你面对的是普通用户，他们不可能完成复杂的程序设置、安装等工作，或者简单地讲，如果你要实现一种零成本或者最小成本的最终用户维护，你就必须考虑采用n tier的b/s模式来开发该系统。 <BR><BR>　　我们习惯把n tier模式称作三层结构体系，因为n tier实际上是三层结构的变体。正确理解三层结构对于程序员而言非常重要，因为这里面包含着许许多多的理论和技术背景，融合了多少天才式人物的奋斗，才有了我们今天成熟的n tier开发基础。 <BR><BR>三层结构的技术实现手段 <BR><BR>　　要开发一个三层结构，这些技术是必不可少: 中间件、通信协议以及交易模式。 <BR><BR>　　中间件 中间件是构造应用服务器不可缺少的。目前在window平台下通用的三层结构中间件有下面几种: midas、corba、com/dcom/com+以及asta。 <BR><BR>　　midas是borland公司从delphi 3开始达到应用级的产品，功能强大，也是borland公司的旗艇产品，可应用在windows及linux下; corba是omg（对象管理组织）推出的产品，有强大的跨平台能力; com/com+是microsoft的拳头产品，也是每次microsoft都要宣传的理念之一，目前已整合到操作系统中。它的结构非常庞大，如果把midas比喻成一只野马，那com+就像是一头狮子。狮子看起来比野马强壮很多，但要驯服它却很不容易。最后一个是asta中间件，可能大家不太熟悉，实际上从1997年开始asta公司就致力于发展这个产品。它内嵌了socket连接，有强大的“消息”开发机制。 <BR><BR>　　通信协议（或连接方式） 通用的中间件连接模式有tcp/ip（如socket）、dcom、corba等。程序员经常会把dcom与com混淆，实际是有区别的，com只是一种服务提供，而dcom才能使com真正发挥它的魅力，dcom在com的基础上增加了分布的概念。目前，微软又新推出了.net，对dcom进行了发展和完善。 <BR><BR>　　midas既可使用dcom连接，也可使用socket连接，borland公司在delphi 5中对midas进行了核心性的改造，所以要使用midas，一定要看delphi 5以上版本的书籍。 <BR><BR>　　com/com+只能使用dcom连接，corba使用自己的连接协议。这里笔者还想提一下dcom，dcom连接虽然优点很多，但设置过于复杂，所以连microsoft也承认其缺陷。microsoft在.net平台中将首推soap连接协议，soap是建立在http上层的协议，主要为了适应xml的发展，目前已得到许多大公司的支持（如ibm、oracle等）。 <BR><BR>　　交易模式 最著名的是mts，它的英文全称是microsoft transaction server，交易模式实现的功能非常多，比如，多段提交模式，其pooling技术，也就是缓冲池技术，让数据提交更加安全、快速。很难想像，如果没有交易模式，三层结构要做什么：你要自己动手写大量的代码实现事务机制，如果解决得不好，还降低了程序的可靠性与速度。而mts是建立在系统层的，可以帮助你解决许多本应在程序里解决的东西。还有一点要记住，目前市面上windows开发平台上，只有delphi与vc才能真正发挥mts的功能。<BR><BR><BR>三层结构编程要点 <BR>　　对此笔者不想讲太多理论，只给大家一句经典名言，这句话每个程序员都应该牢牢记住：all business logic in the middle tier（所有的商业逻辑处在中间层上）。如果不这样，你开发的三层结构程序就不专业，或者只是c/s模式的翻版产品。这句话虽然很简单，要达到这一境界却需要大量的经验积累。 <BR><BR>　　另一个要领是: 一定要尽量减少应用服务器与前台程序的数据传递量以及round trip。因为如果你的三层结构存在频繁的round trip，那么你开发的应用服务器效率一定非常低下，当同时进入10个连接时，你就会发现应用服务器接近瘫痪。 <BR><BR>　　在开发三层结构的系统时，应该养成一种好习惯，就是在系统分析或者设计报告中，较为详细地描述如何解决商业逻辑、如何有效降低数据传递量，以及只使用必要的round trip。只有这样，别人才能与你一起探讨你的解决方案是否合理，是否有更有效的实现方式。同时，经过不断归纳，提高自己的系统分析能力。 <BR><BR>　　在开发大量用户连接的应用服务器时，多线程技术是必要的，否则当应用服务器在处理一个用户的请求时，另一用户只能等待，如果这种等待的时间太长了，用户就会对软件失去信心。还有一个是分布式的概念，你可以根据商业逻辑来切分，开发并发布多个应用服务器解决不同的商业逻辑；或者你可以将运行应用服务器的多个进程分布在不同的服务器中，并根据访问流程自动引导用户到合理的应用服务器中。 <BR><BR>　　正是因为三层结构比c/s复杂，所以你要成为三层结构的高手，一定要经过一段较长的时间和大量项目的锻练。但三层结构体现了一个开发人员与系统人员的专业素质，因为它涉及太多东西: 技术工具的选型、模块化和组件化思想、前后台功能的分割等等。从真正意义上来讲，只有三层结构的项目才能完整反映软件项目的每个过程。 <BR><BR>b/s模式与发展<BR><BR>　　主流的软件架构b/s与n tier模式都有一些缺点，所以现在出现了许多b－n tier的系统，就是基于web浏览器的多层结构开发模式，它吸收了两者的优点。 <BR><BR>　　我们知道单纯的b/s方式，虽然很令人兴奋，并且最终用户使用成本几乎为零，但它存在许多不足，它的功能较弱，无法非常容易地实现你的理念。比如你要实现一种商业模型，你会发现实际上web方式是不安全、不可靠的，比如，用户可通过页面回退或前进来改变你所有希望的结果、报表制作能力不足等。 <BR><BR>　　为什么web会造成逻辑实现上的困难？因为它是基于stateless（无状态）的。打个比方，stateless就是这样一种情形：你与你的用户中间有一道墙，你并不知道墙另一边的用户长得什么样子，甚至是男是女你都不知道，然后你通过墙上的一个小窗递给他一件礼物，至于礼物最终的流向，你也一无所知，这就是stateless。所有基于http的东西都是stateless的。而socket的魅力就在于它是有状态的。 <BR><BR>　　笔者以为现在发展起来的asp、技术，都是在弥补http协议存在的无状态缺陷，但即使有了这些工具，仍会觉得网页编程无法随心所欲，因为这些技术再先进，也无法解决http协议基于stateless的事实。 <BR><BR>　　也许有人会问，这些动态网页开发技术是如何在一定程度上避免了stateless的弊端的？以基于iis的asp技术来说，它使用session变量来实现state。但是不管什么技术，最终都落在了上，也就是使用来保留客户端状态。 <BR><BR>　　这里还要提一下socket。socket目前应用十分广泛，icq、qq等即时通讯软件，还有许多网络工具，大都基于socket，因为socket协议是有状态的，所以才能做到这一点。可以这么说，是socket让网络生活更精彩！ <BR><BR>　　目前基于web的多层结构采用的底层技术主要有soap＋state类协议或者http＋state类协议。这里有一个delphi程序员的好消息，从delphi 6开始引入websnap包（一种web provider产品），它的设计者被borland公司称为borland历史上最伟大的工程师之一。它同时支持http与soap协议，也采用了一种类似session变量的模式来实现有状态(state)。它可以说是目前市面上最强大的基于平台的browse/server开发工具之一，其不足是它还不能称为完全的rad工具，而且门槛较高。为什么不是asp或者asp.net呢？笔者认为asp不是基于平台的，它是基于脚本语言的，它的运行效率不高，而且它的调试困难。在delphi 7中还引入了intraweb控件包，笔者以为它是一种真正意义上的网页rad开发工具，与websnap配合更会如虎添翼。 <BR><BR>　　web provider、逻辑组件、多线程处理、交易机制、消息流转等组合在一起是n tier开发的最高境界，笔者以为是大型商业软件架构的首选。笔者在前面很少提到消息机制，主要是怕大家混淆了概念，消息机制并不一定在所有的多层结构中都存在，而且，如果要实现消息机制，必须寻找实现手段（比如使用socket），否则，如果在程序中强制实施大量消息流转（比如使用定时器监控和消息数据表方式），无论是效率还是实现的复杂性来讲都是要考虑的问题。 <BR><BR>软件开发人员的选择<BR><BR>　　笔者愿意把软件设计看成音乐艺术，它有许多流派，也有主流，但并不意味着别的思想被彻底抛弃。比如单层结构或c/s方式，许多人仍然在用，而且很擅长。笔者不鼓励读者抛弃这些传统的东西，笔者的意思是要扩大眼界，开放思想。而多层反映的是一种集成的思想，以安全、高效、图形方式整合系统，以组件思想逐步构架整个公司的商业逻辑，并降低最终用户使用成本。其最核心的思想是集中，所有中间层是集中的，可以在不同的服务器上运行不同的商业逻辑组件（比如.net），但这个逻辑组件一定是提供给所有前端程序使用的。现在许多企业都在走系统集中的道路，集中可以带来无限的好处，但没有软件平台的支撑，集中是非常肤浅的。我们追求的不单纯是机器的集中，机器的集中会同时带来网络带宽的压力，只有应用集中了，才能最终达到合理配置资源的目的，这也是为什么我们要用多层体系、要用分布式思想来构建企业应用的真正原因。 <BR><BR>　　笔者以为，在软件开发的今天，作为一名专业人员，如果总在单层或c/s构架下，永远形成不了系统思想，只有多层体系才能真正体会软件生命周期的理念，从需求分析形成商业逻辑到系统设计、数据库结构设计、组件化程序编写、测试、推广，一个好的n tier系统一定要踏实地做好各个阶段的工作。这不像程序语言的变化或者开发环境的简单变换，因为它是一种开发思想与开发模式的完全变革，所以它也一定是一个过程，不可能要求自己在一两个月内就能真正体会并开始驾驭n tier模式，但商业模式变了，开发思想也要变，你必须也只能让自己去适应新的思想，才能成为一名更加专业的开发人员。一旦你进入了n tier的殿堂，并熟练掌握了这种开发模式，就会发现你开始逐渐形成了软件开发的系统思想，并且在这个领域上越走越在前面，开发也会越来越有激情。 <BR><BR>编后语：可怜的程序员<BR><BR>　　“真累！”时常听到软件开发人员这么说。软件开发是一个高强度的工作，这是共识，无论对于体力还是脑力都是一个考验，因此不少程序员常常自嘲为“吃青春饭”的人。本人此前也做过几年软件开发，我也深谙其中的辛苦。我知道，对于软件开发人员而言，赶工期、赶进度、封闭开发、长时间的加班加点等很多人已经习以为常，不过和心理上承受的压力相比, 这点痛实在算不得什么，软件技术的更新日新月异，要在这一行立足，就必须时刻追踪技术发展，不然掉队事小，掉饭碗事大。c/s模式刚刚掌握，又流行起b/s架构，对高深莫测的j2ee、corba还是一知半解，.net又接踵而至。掌握vb太基础，掌握delphi也才刚刚跨入程序员大门。要想待遇高，那得掌握vc或者bc，若论工作机会多还数迷。最近又流行web services，也一定要弄明白，但要真正理解web服务，掌握xml是前提。头儿有一天谈到uml，也要补上……“可怜的程序员，何时是尽头！” <BR><BR>　　作为程序员的你是否在工作中陷入过这个误区，也为此苦恼过？或许你已经走出了这个阴影，或许你对此能轻松对付，你是否愿意让大家分享你的经验和观点，无论如何，如果你对这个话题感兴趣，欢迎你和大家一起来讨论</P><img src ="http://www.blogjava.net/yihan422/aggbug/829.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yihan422/" target="_blank">俊子</a> 2005-01-30 12:47 <a href="http://www.blogjava.net/yihan422/archive/2005/01/30/829.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java从入门到精通，一个网友的帖子，写的很不错</title><link>http://www.blogjava.net/yihan422/archive/2005/01/30/827.html</link><dc:creator>俊子</dc:creator><author>俊子</author><pubDate>Sun, 30 Jan 2005 04:45:00 GMT</pubDate><guid>http://www.blogjava.net/yihan422/archive/2005/01/30/827.html</guid><wfw:comment>http://www.blogjava.net/yihan422/comments/827.html</wfw:comment><comments>http://www.blogjava.net/yihan422/archive/2005/01/30/827.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yihan422/comments/commentRss/827.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yihan422/services/trackbacks/827.html</trackback:ping><description><![CDATA[<STRONG>Java&nbsp;Learning&nbsp;Path&nbsp;（一）、工具篇&nbsp;<BR></STRONG>一、&nbsp;JDK&nbsp;(Java&nbsp;Development&nbsp;Kit)&nbsp;<BR><BR>JDK是整个Java的核心，包括了Java运行环境（Java&nbsp;Runtime&nbsp;Envirnment），一堆Java工具和Java基础的类库(rt.jar)。不论什么Java应用服务器实质都是内置了某个版本的JDK。因此掌握JDK是学好Java的第一步。最主流的JDK是Sun公司发布的JDK，除了Sun之外，还有很多公司和组织都开发了自己的JDK，例如IBM公司开发的JDK，BEA公司的Jrocket，还有GNU组织开发的JDK等等。其中IBM的JDK包含的JVM（Java&nbsp;Virtual&nbsp;Machine）运行效率要比Sun&nbsp;JDK包含的JVM高出许多。而专门运行在x86平台的Jrocket在服务端运行效率也要比Sun&nbsp;JDK好很多。但不管怎么说，我们还是需要先把Sun&nbsp;JDK掌握好。&nbsp;<BR><BR>1、&nbsp;JDK的下载和安装&nbsp;<BR>JDK又叫做J2SE（Java2&nbsp;SDK&nbsp;Standard&nbsp;Edition），可以从Sun的Java网站上下载到，<IMG src="file:///D:/我的文档/我的书籍/技术/JAVA相关/文章/java从入门到精通，一个网友的帖子，写的很不错（－）.files/url.gif" align=absMiddle><A href="http://java.sun.com/j2se/downloads.html&nbsp;" target=_blank>http://java.sun.com/j2se/downloads.html&nbsp;</A>，JDK当前最新的版本是J2SDK1.4.2，建议下载该版本的JDK，下载页面在这里：<IMG src="file:///D:/我的文档/我的书籍/技术/JAVA相关/文章/java从入门到精通，一个网友的帖子，写的很不错（－）.files/url.gif" align=absMiddle><A href="http://java.sun.com/j2se/1.4.2/download.html" target=_blank>http://java.sun.com/j2se/1.4.2/download.html</A>。&nbsp;<BR><BR>下载好的JDK是一个可执行安装程序，默认安装完毕后会在C:\Program&nbsp;Files\Java\目录下安装一套JRE（供浏览器来使用），在C:\j2sdk1.4.2下安装一套JDK（也包括一套JRE）。然后我们需要在环境变量PATH的最前面增加java的路径C:\j2sdk1.4.2\bin。这样JDK就安装好了。&nbsp;<BR><BR>2、&nbsp;JDK的命令工具&nbsp;<BR>JDK的最重要命令行工具：&nbsp;<BR>java：&nbsp;启动JVM执行class&nbsp;<BR>javac：&nbsp;Java编译器&nbsp;<BR>jar：&nbsp;Java打包工具&nbsp;<BR>javadoc：&nbsp;Java文档生成器&nbsp;<BR>这些命令行必须要非常非常熟悉，对于每个参数都要很精通才行。对于这些命令的学习，JDK&nbsp;<I>document</I>.tion上有详细的文档。&nbsp;<BR><BR><BR>二、&nbsp;JDK&nbsp;<I>document</I>.tion&nbsp;<BR><BR><I>document</I>.tion在JDK的下载页面也有下载连接，建议同时下载<I>document</I>.tion。<I>document</I>.tion是最最重要的编程手册，涵盖了整个Java所有方面的内容的描述。可以这样说，学习Java编程，大部分时间都是花在看这个<I>document</I>.tion上面的。我是随身携带的，写Java代码的时候，随时查看，须臾不离手。&nbsp;<BR><BR><BR>三、&nbsp;应用服务器(App&nbsp;Server)&nbsp;<BR><BR>App&nbsp;Server是运行Java企业组件的平台，构成了应用软件的主要运行环境。当前主流的App&nbsp;Server是BEA公司的Weblogic&nbsp;Server和IBM公司的Websphere以及免费的Jboss，选择其中一个进行学习就可以了，个人推荐Weblogic，因为它的体系结构更加干净，开发和部署更加方便，是Java企业软件开发人员首选的开发平台。下面简要介绍几种常用的App&nbsp;Server：&nbsp;<BR><BR>1、&nbsp;Tomcat&nbsp;<BR>Tomcat严格意义上并不是一个真正的App&nbsp;Server，它只是一个可以支持运行Serlvet/JSP的Web容器，不过Tomcat也扩展了一些App&nbsp;Server的功能，如JNDI，数据库连接池，用户事务处理等等。Tomcat被非常广泛的应用在中小规模的Java&nbsp;Web应用中，因此本文做一点下载、安装和配置Tomcat的介绍：&nbsp;<BR><BR>Tomcat是Apache组织下Jakarta项目下的一个子项目，它的主网站是：<IMG src="file:///D:/我的文档/我的书籍/技术/JAVA相关/文章/java从入门到精通，一个网友的帖子，写的很不错（－）.files/url.gif" align=absMiddle><A href="http://jakarta.apache.org/tomcat/&nbsp;" target=_blank>http://jakarta.apache.org/tomcat/&nbsp;</A>，Tomcat最新版本是Tomcat4.1.27，软件下载的连接是：<IMG src="file:///D:/我的文档/我的书籍/技术/JAVA相关/文章/java从入门到精通，一个网友的帖子，写的很不错（－）.files/url.gif" align=absMiddle><A href="http://www.apache.org/dist/jakarta/tomcat-4/binaries/&nbsp;" target=_blank>http://www.apache.org/dist/jakarta/tomcat-4/binaries/&nbsp;</A>。&nbsp;<BR><BR>下载Tomcat既可以直接下载zip包，也可以下载exe安装包（个人建议zip更干净些），不管哪种情况，下载完毕安装好以后（zip直接解压缩就可以了）。需要设置两个环境变量：&nbsp;<BR><BR>JAVA_HOME=C:\j2sdk1.4.2&nbsp;<BR>CATALINA_HOME=D:\tomcat4&nbsp;(你的Tomcat安装目录)&nbsp;<BR><BR>这样就安装好了，启动Tomcat运行CATALINA_HOME\bin\startup.bat，关闭Tomcat运行shutdown.bat脚本。Tomcat启动以后，默认使用8080端口，因此可以用浏览器访问<IMG src="file:///D:/我的文档/我的书籍/技术/JAVA相关/文章/java从入门到精通，一个网友的帖子，写的很不错（－）.files/url.gif" align=absMiddle><A href="http://localhost:8080/" target=_blank>http://localhost:8080/</A>来测试Tomcat是否正常启动。&nbsp;<BR><BR>Tomcat提供了两个Web界面的管理工具，URL分别是：&nbsp;<BR><IMG src="file:///D:/我的文档/我的书籍/技术/JAVA相关/文章/java从入门到精通，一个网友的帖子，写的很不错（－）.files/url.gif" align=absMiddle><A href="http://localhost:8080/admin/index.jsp&nbsp;" target=_blank>http://localhost:8080/admin/index.jsp&nbsp;</A><BR><IMG src="file:///D:/我的文档/我的书籍/技术/JAVA相关/文章/java从入门到精通，一个网友的帖子，写的很不错（－）.files/url.gif" align=absMiddle><A href="http://localhost:8080/manager/html&nbsp;" target=_blank>http://localhost:8080/manager/html&nbsp;</A><BR>在启用这两个管理工具之前，先需要手工配置一下管理员用户和口令。用一个文本工具打开CATALINA_HOME\conf\tomcat-users.xml这个文件，加入如下几行：&nbsp;<BR><BR>&lt;role&nbsp;rolename="manager"/&gt;&nbsp;<BR>&lt;role&nbsp;rolename="admin"/&gt;&nbsp;<BR>&lt;user&nbsp;username="robbin"&nbsp;password="12345678"&nbsp;roles="admin,manager,tomcat"/&gt;&nbsp;<BR><BR>这样用户“robbin”就具备了超级管理员权限。重新启动Tomcat以后，你就可以使用该用户来登陆如上的两个管理工具，通过Web方式进行Tomcat的配置和管理了。&nbsp;<BR><BR>2、&nbsp;BEA&nbsp;Weblogic&nbsp;<BR>Weblogic可以到BEA的网站上免费注册之后下载到最新的Weblogic8.1企业版，License可以免费使用1年时间，其实这已经完全足够了。Weblogic的下载连接：<IMG src="file:///D:/我的文档/我的书籍/技术/JAVA相关/文章/java从入门到精通，一个网友的帖子，写的很不错（－）.files/url.gif" align=absMiddle><A href="http://commerce.bea.com/index.jsp" target=_blank>http://commerce.bea.com/index.jsp</A>，Weblogic的在线文档：<IMG src="file:///D:/我的文档/我的书籍/技术/JAVA相关/文章/java从入门到精通，一个网友的帖子，写的很不错（－）.files/url.gif" align=absMiddle><A href="http://edocs.bea.com/&nbsp;" target=_blank>http://edocs.bea.com/&nbsp;</A>。&nbsp;<BR><BR>3、&nbsp;IBM&nbsp;Webshpere&nbsp;<BR>Websphere同样可以下载到免费的试用版本，到IBM的developerWorks网站可以看到Websphere试用产品的下载和相关的Websphere的资料，developerWorks中文网站的连接是：<IMG src="file:///D:/我的文档/我的书籍/技术/JAVA相关/文章/java从入门到精通，一个网友的帖子，写的很不错（－）.files/url.gif" align=absMiddle><A href="http://www-900.ibm.com/developerWorks/cn/wsdd/&nbsp;" target=_blank>http://www-900.ibm.com/developerWorks/cn/wsdd/&nbsp;</A>，Websphere的下载连接：<IMG src="file:///D:/我的文档/我的书籍/技术/JAVA相关/文章/java从入门到精通，一个网友的帖子，写的很不错（－）.files/url.gif" align=absMiddle><A href="http://www7b.software.ibm.com/wsdd/downloads/WASsupport.html&nbsp;" target=_blank>http://www7b.software.ibm.com/wsdd/downloads/WASsupport.html&nbsp;</A>。&nbsp;<BR><BR>4、&nbsp;Jboss&nbsp;<BR>Jboss是免费开源的App&nbsp;Server，可以免费的从Jboss网站下载：<IMG src="file:///D:/我的文档/我的书籍/技术/JAVA相关/文章/java从入门到精通，一个网友的帖子，写的很不错（－）.files/url.gif" align=absMiddle><A href="http://www.jboss.org/index.html" target=_blank>http://www.jboss.org/index.html</A>，然而Jboss的文档是不免费，需要花钱购买，所以为我们学习Jboss设置了一定的障碍。在Jdon上有几篇不错的Jboss配置文档，可以用来参考：<IMG src="file:///D:/我的文档/我的书籍/技术/JAVA相关/文章/java从入门到精通，一个网友的帖子，写的很不错（－）.files/url.gif" align=absMiddle><A href="http://www.jdon.com/idea.html&nbsp;" target=_blank>http://www.jdon.com/idea.html&nbsp;</A><BR><BR><BR>四、&nbsp;Java应用的运行环境&nbsp;<BR><BR>Java的应用可以简单分为以下几个方面：&nbsp;<BR><BR>1、&nbsp;Java的桌面应用&nbsp;<BR>桌面应用一般仅仅需要JRE的支持就足够了。&nbsp;<BR><BR>2、&nbsp;Java&nbsp;Web应用&nbsp;<BR>Java的Web应用至少需要安装JDK和一个web容器（例如Tomcat），以及一个多用户数据库，Web应用至少分为三层：&nbsp;<BR>Browser层：浏览器显示用户页面&nbsp;<BR>Web层：运行Servlet/JSP&nbsp;<BR>DB层：后端数据库，向Java程序提供数据访问服务&nbsp;<BR><BR>3、&nbsp;Java企业级应用&nbsp;<BR>企业级应用比较复杂，可以扩展到n层，最简单情况会分为4层：&nbsp;<BR>Browser层：浏览器显示用户页面&nbsp;<BR>Client层：Java客户端图形程序（或者嵌入式设备的程序）直接和Web层或者EJB层交互&nbsp;<BR>Web层：运行Servlet/JSP&nbsp;<BR>EJB层：运行EJB，完成业务逻辑运算&nbsp;<BR>DB层：后端数据库，向Java程序提供数据访问服务&nbsp;<BR><BR>4、&nbsp;Java嵌入式应用&nbsp;<BR>Java嵌入式应用是一个方兴未艾的领域，从事嵌入式开发，需要从Sun下载J2ME开发包，J2ME包含了嵌入式设备专用虚拟机KVM，和普通的JDK中包含的JVM有所不同。另外还需要到特定的嵌入式厂商那里下载模拟器。&nbsp;<BR><BR><BR>Java&nbsp;Learning&nbsp;Path（二）、书籍篇&nbsp;<BR><BR>学习一门新的知识，不可能指望只看一本，或者两本书就能够完全掌握。需要有一个循序渐进的阅读过程。我推荐Oreilly出版的Java系列书籍。&nbsp;<BR><BR>在这里我只想补充一点看法，很多人学习Java是从《Thinking&nbsp;in&nbsp;Java》这本书入手的，但是我认为这本书是不适合初学者的。我认为正确的使用这本书的方法应该是作为辅助的读物。《Thinking&nbsp;in&nbsp;Java》并不是在完整的介绍Java的整个体系，而是一种跳跃式的写作方法，是一种类似tips的方法来对Java很多知识点进行了深入的分析和解释。&nbsp;<BR><BR>对于初学者来说，最好是找一本Java入门的书籍，但是比较完整的循序的介绍Java的语法，面向对象的特性，核心类库等等，在看这本书的同时，可以同步来看《Thinking&nbsp;in&nbsp;Java》，来加深对Java的理解和原理的运用，同时又可以完整的了解Java的整个体系。&nbsp;<BR><BR>对于Java的入门书籍，蔡学镛推荐的是Oreilly的《Exploring&nbsp;Java,&nbsp;2nd&nbsp;Edition》&nbsp;或者《Java&nbsp;in&nbsp;a&nbsp;Nutshell,2nd&nbsp;Edition（针对C++背景）》，我并没有看过这两本书。其实我觉得电子工业出版社的《Java&nbsp;2编程详解》或者《Java&nbsp;2从入门到精通》就很不错。&nbsp;<BR><BR>在所有的Java书籍当中，其实最最有用的，并不是O'reilly的&nbsp;Java&nbsp;Serials，真正最最有用处是JDK的<I>document</I>.tion！几乎你想获得的所有的知识在<I>document</I>.tion里面全部都有，其中最主要的部分当然是Java基础类库的API文档，是按照package来组织的，对于每一个class都有详细的解释，它的继承关系，是否实现了某个接口，通常用在哪些场合，还可以查到它所有的public的属性和方法，每个属性的解释，意义，每个方法的用途，调用的参数，参数的意义，返回值的类型，以及方法可能抛出的异常等等。可以这样来说，所有关于Java编程方面的书籍其实都不过是在用比较通俗易懂的语言，和良好的组织方式来介绍<I>document</I>.tion里面的某个package里面包含的一些类的用法而已。所以万变不离其宗，如果你有足够的能力来直接通过<I>document</I>.tion来学习Java的类库，那么基本上就不需要看其他的书籍了。除此之外，<I>document</I>.tion也是编程必备的手册，我的桌面上有三个<I>document</I>.tion的快捷方式，分别是J2SDK1.4.1的<I>document</I>.tion，Servlet2.3的<I>document</I>.tion和J2SDKEE1.3.1的<I>document</I>.tion。有了这个三个<I>document</I>.tion，什么其他的书籍都不需要了。&nbsp;<BR><BR>对于Java&nbsp;Web&nbsp;编程来说，最核心的是要熟悉和掌握HTTP协议，这个就和Java无关了，在熟悉HTTP协议之后，就需要熟悉Java的实现HTTP协议的类库，也就是Servlet&nbsp;API，所以最重要的东西就是Servlet&nbsp;API。当然对于初学者而言，直接通过Servlet&nbsp;API来学习Web编程有很大的难度，我推荐O'reilly的《Java&nbsp;Server&nbsp;Pages&nbsp;》这本书来学习Web&nbsp;编程。&nbsp;<BR><BR>EJB的书籍当中，《Enterprise&nbsp;JavaBeans,&nbsp;2nd&nbsp;Edition》是一本很不错的书，&nbsp;EJB的学习门槛是比较高，入门很难，但是这本书完全降低了学习的难度，特别重要的一点是，EJB的学习需要结合一种App&nbsp;Server的具体实现，所以在学习EJB的同时，必须同步的学习某种App&nbsp;Server，而这本书相关的出了三本书，分别是Weblogic6.1，Websphere4.0和JBoss3.0上面部署书中例子的实做。真是既有理论，又有实践。在学习EJB的同时，可以边看边做，EJB的学习会变得很轻松。&nbsp;<BR><BR>但是这本书也有一个问题，就是版本比较旧，主要讲EJB1.1规范和部分EJB2.0的规范。而Ed&nbsp;Roman写的《Mastering&nbsp;EJB&nbsp;2.0》这本书完全是根据EJB2.0规范写的，深入浅出，覆盖了EJB编程的各个方面，并且还有很多编程经验tips，也是学习EJB非常推荐的书籍之一。&nbsp;<BR><BR>如果是结合Weblogic来学习J2EE的话，《J2EE应用与BEA&nbsp;Weblogic&nbsp;Server》绝对是首选读物，虽然是讲述的Weblogic6.0，仍然值得购买，这本书是BEA官方推荐的教材，作者也是BEA公司的工程师。现在中文版已经随处可见了。这本书结合Weblogic介绍了J2EE各个方面的技术在Weblogic平台上的开发和部署，实践指导意义非常强。&nbsp;<BR><BR>在掌握了Java平台基础知识和J2EE方面的知识以后，更进一步的是学习如何运用OO的方法进行软件的设计，那么就一定要学习“设计模式”。Sun公司出版了一本《J2EE核心模式》，是每个开发Java企业平台软件的架构师必备的书籍。这本书全面的介绍了J2EE体系架构的各种设计模式，是设计师的必读书籍。&nbsp;<BR><BR>Java&nbsp;Learning&nbsp;Path（三）过程篇&nbsp;<BR><BR>每个人的学习方法是不同的，一个人的方法不见得适合另一个人，我只能是谈自己的学习方法。因为我学习Java是完全自学的，从来没有问过别人，所以学习的过程基本上完全是自己摸索出来的。我也不知道这种方法是否是比较好的方法，只能给大家提供一点参考了。&nbsp;<BR><BR>学习Java的第一步是安装好JDK，写一个Hello&nbsp;World，&nbsp;其实JDK的学习没有那么简单，关于JDK有两个问题是很容易一直困扰Java程序员的地方：一个是CLASSPATH的问题，其实从原理上来说，是要搞清楚JRE的ClassLoader是如何加载Class的；另一个问题是package和import问题，如何来寻找类的路径问题。把这两个问题摸索清楚了，就扫除了学习Java和使用JDK的最大障碍。推荐看一下王森的《Java深度历险》，对这两个问题进行了深入的探讨。&nbsp;<BR><BR>第二步是学习Java的语法。Java的语法是类C++的，基本上主流的编程语言不是类C，就是类C++的，没有什么新东西，所以语法的学习，大概就是半天的时间足够了。唯一需要注意的是有几个不容易搞清楚的关键字的用法，public，protected，private，static，什么时候用，为什么要用，怎么用，这可能需要有人来指点一下，我当初是完全自己琢磨出来的，花了很久的时间。不过后来我看到《Thinking&nbsp;in&nbsp;Java》这本书上面是讲了这些概念的。<img src ="http://www.blogjava.net/yihan422/aggbug/827.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yihan422/" target="_blank">俊子</a> 2005-01-30 12:45 <a href="http://www.blogjava.net/yihan422/archive/2005/01/30/827.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java编码规范</title><link>http://www.blogjava.net/yihan422/archive/2005/01/30/826.html</link><dc:creator>俊子</dc:creator><author>俊子</author><pubDate>Sun, 30 Jan 2005 04:43:00 GMT</pubDate><guid>http://www.blogjava.net/yihan422/archive/2005/01/30/826.html</guid><wfw:comment>http://www.blogjava.net/yihan422/comments/826.html</wfw:comment><comments>http://www.blogjava.net/yihan422/archive/2005/01/30/826.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yihan422/comments/commentRss/826.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yihan422/services/trackbacks/826.html</trackback:ping><description><![CDATA[<P>所有的程序开发手册都包含了各种规则。一些习惯自由程序人员可能对这些规则很不适应，但是在多个开发人员共同写作的情况下，这些规则是必需的。这不仅仅是为了开发效率来考虑，而且也是为了后期维护考虑。<BR>定义这个规范的目的是让项目中所有的文档都看起来像一个人写的，增加可读性，减少项目组中因为换人而带来的损失。<BR>这是一个强制执行的标准，而不是一个指南。当我们的标准不适应的时候，我们可以讨论、修改标准。但是已经制定的标准一定要得到执行。<BR>当你违背标准时，将其注释出来。如果违背了，你必须说明为什么你要违背这个标准，违背这个标准可能产生的影响，以及标准被应用于这个场合之前可能/必须出现的任何条件。<BR>随着此标准发下的还有一份指南，是rational公司推荐的编程指南。希望大家认真学习，你将受益匪浅。<BR>1. 命名规范 <BR>? 一般命名约定<BR>除以下特别规定之外，所有名称遵从本规定。<BR>使用可以准确说明变量/字段/类的完整的英文描述符，并且尽可能采用相关领域内已有的术语。采用大小写混合，提高名字的可读性。一般应该采用小写字母，但是下面规定名称的首字母，以及任何中间单词的首字母应该大写。不要使用相似或者仅在大小写上有区别的名字，也不要使用下划线作为名字的首末字母。<BR>? package 的命名 <BR>package 的名字应该都是由一个小写单词组成。 <BR>? class/interface 的命名 <BR>class与interface的名字必须由大写字母开头。后面的单词也用大写字母开头。<BR>? 普通成员的命名 <BR>变量的名字必须用一个小写字母开头。后面的单词用大写字母开头。<BR>? static final 变量的命名 <BR>static final 变量的名字应该都大写，并且指出完整含义。 <BR>? 数组的命名 <BR>数组应该总是用下面的方式来命名： <BR>byte[] buffer;<BR>而不是： <BR>byte buffer[]; <BR>2. 文件样式<BR>所有的 ) 文件都必须遵守如下的样式规则 <BR>? 版权信息 <BR>版权信息必须在 文件的开头，比如： </P>
<P>/**<BR>* copyright ? 2000 shanghai xxx co. ltd.<BR>* all right reserved.<BR>*/</P>
<P>? 其他不需要出现在 doc 的信息也可以包含在这里。<BR>? package/imports <BR>package 行要在 import 行之前，import 中标准的包名要在本地的包名之前，而且按照字母顺序排列。 <BR>? class/interface<BR>接下来的是类的注释，一般是用来解释类的。 </P>
<P>/**<BR>* a class representing a set of packet and byte counters<BR>* it is observable to allow it to be watched, but only<BR>* reports changes when the current set is complete<BR>*/</P>
<P>? 接下来是类定义，extends和implements要放在不同的行上。</P>
<P>public class counterset<BR>extends observable<BR>implements cloneable</P>
<P>? 构造函数 <BR>接下来是构造函数，它应该用递增的方式写（比如：参数多的写在后面）。 <BR>访问类型 ("public", "private" 等.) 和 任何 "static", "final" 或 "synchronized" 应该在一行中，方法名和参数另写一行，这样可以使方法和参数更易读。 <BR>public<BR>counterset(int size){<BR>this.size = size;<BR>}<BR>? finalize()<BR>如果需要的话，接下来定义finalize()。这是在一个对象从内存里删除之前的“垃圾收集”过程中被自动调用的成员函数。注意程序员是不能控制何时调用此函数的，甚至你都不能肯定此函数会被调用，所以，只有在必要的时候定义这个函数，要慎重使用此函数。<BR>? 克隆方法 <BR>如果这个类是可以被克隆的，那么下一步就是 clone 方法： </P>
<P>public<BR>object clone() {<BR>try {<BR>counterset obj = (counterset)super.clone();<BR>obj.packets = (int[])packets.clone();<BR>obj.size = size;<BR>return obj;<BR>}catch(clonenotsupportedexception e) {<BR>throw new internalerror("unexpected clonenotsupportedexception: " + e.getmessage());<BR>}<BR>}<BR>? 类方法 <BR>下面开始写类的方法，请按照public, protected, private的顺序排列类方法： </P>
<P>/**<BR>* set the packet counters<BR>* (such as when restoring from a database)<BR>*/<BR>protected final<BR>void setarray(int[] r1, int[] r2, int[] r3, int[] r4)<BR>throws illegalargumentexception<BR>{<BR>//<BR>// ensure the arrays are of equal size<BR>//<BR>if (r1.length != r2.length || r1.length != r3.length || r1.length != r4.length)<BR>throw new illegalargumentexception("arrays must be of the same size");<BR>system.arraycopy(r1, 0, r3, 0, r1.length);<BR>system.arraycopy(r2, 0, r4, 0, r1.length);<BR>}<BR>public和protected方法必须有doc文档。<BR>? 存取方法 <BR>类变量的存取的方法书写在其它方法的后面。注意，所以私有的方法要排列在最后(包括公有存取方法的后面)。如果存取方法只是简单的用来将类的变量赋值获取值的话，可以简单的写在一行上：</P>
<P>/**<BR>* get the counters<BR>* @return an array containing the statistical data. this array has been<BR>* freshly allocated and can be modified by the caller.<BR>*/<BR>public int[] getpackets() { return copyarray(packets, offset); }<BR>public int[] getbytes() { return copyarray(bytes, offset); }</P>
<P>public int[] getpackets() { return packets; }<BR>public void setpackets(int[] packets) { this.packets = packets; }<BR>注意其它的方法不要写在一行上。<BR>? 成员变量<BR>接下来是类的成员变量：</P>
<P>/**<BR>* packet counters<BR>*/<BR>protected int[] packets;<BR>? 强烈建议不要定义公有(public)的成员变量，请代之以存取方法。注意public和protected的成员变量必须生成文档（ckage 定义的成员变量如果名字含义明确的话，可以没有注释。<BR>? main 方法 <BR>如果定义了main(string[]) 方法, 那么应该把它写在类的底部。</P>
<P>3. 代码编写格式 <BR>? 文档化 <BR>必须用 doc 来为类生成文档。不仅因为它是标准，这也是被各种 编译器都认可的方法。 <BR>? 缩进 <BR>如果使用空格缩进的话，缩进应该是每行4个空格。如果在源文件中保存tab字符的话，所有的缩进都应该使用tab字符。不能混合使用空格与tab字符，因为使用不同的源代码管理工具时tab字符将因为用户设置的不同而扩展为不同的宽度。<BR>? 页宽 <BR>页宽应该设置为80字符，源代码一般不要超过这个宽度。超长的语句应该在一个逗号或者一个操作符后折行。一条语句折行后，应该比原来的语句再增加一个缩进。 <BR>? {}对 <BR>如果{}中的语句非常短，{和}可以(和其中的语句)写在一行上。否则，}应该单独在一行上，并且缩进到与相应的{那一行对齐的位置上。</P>
<P>if (i&gt;0) { i ++； }</P>
<P>if (i&gt;0){ <BR>i ++ ；<BR>}</P>
<P>? 括号 <BR>左括号和后一个字符之间、右括号和前一个字符之间，不应该出现多于一个的空格。不要在语句中使用无意义的括号 </P>
<P>4. 程序编写规范 <BR>? exit() <BR>永远不要调用exit()。因为这样做不给任何代码代码机会来截获退出。一个类似后台服务地程序不应该因为某一个库模块决定了要退出就退出。 <BR>在n中绝对禁止调用exit()。<BR>? 异常 <BR>在n或者jsp中，不要试图截获任何实际上并不处理的异常。仅仅是一个e.printstacktrace(); 语句这样的处理没有任何意义。如果需要的话，使用一个finally子句就可以保证某些操作在任何情况下都得到执行。<BR>? final 类 <BR>绝对不要因为性能的原因将类定义为 final 的（除非程序的框架要求） <BR>如果一个类还没有准备好被继承，最好在类文档中注明，而不要将她定义为 final 的。这是因为没有人可以保证会不会由于什么原因需要继承她。 <BR>? 访问类的成员变量 <BR>大部分的类成员变量应该定义为 protected或者private 的来防止随意使用他们。提倡使用存取成员函数，可能的话，不要定义任何public的成员变量。<BR>? jsp <BR>jsp中应该只保留跟表现(显示)直接相关的代码。一切包含程序逻辑、对资源(比如数据库)进行访问的代码，都应该在n中实现。<BR>jsp中的代码应该集中在文件的头部，只有显示输出内容可以嵌入。鼓励使用getproperty和setproperty进行操作，可以简化对null值得处理。<BR>? ns <BR>对servlet/jsp中参数的获取应该写成专门的存取成员函数(setxxx/getxxx)，对字符集的转换应该在存取函数中完成。这样在各个功能中可以共用这些部分。<BR>? sql<BR>在所有可能的情况下，应该使用preparedstatement和动态sql，即用?符号代表参数，通过preparedstatement的setxxx(如setint, setstring等)方法设置参数，然后执行sql语句。<BR>不要养成在每次语句执行前根据参数拼sql语句的习惯。<BR>? 类（功能）和程序文件的对应关系<BR>开发jsp过程中可能涉及很多类，在jsp页面中除了要说明这个页面完成的功能之外，还要说明用到的类名称以及类存放的位置、所在文件名等信息，在说明中应着重指出该 jsp使用了类的哪些成员函数。例如：<BR>-- 该jsp程序的功能- -&gt;<BR>—作者的名称，日期，修改记录-- &gt;<BR>? 类的组织方式<BR>鉴于在编译过程中会将所有的类分别编译成独立的class，所以在编写类的过程中尽量将完成一个完整功能的类放在一个文件中，该文件中不要包含完成其它功能的类，这些类可以用package组装和安排。<BR>? 变量的定义和初始化<BR>在程序设计过程中不可避免要定义多个变量并初始化，原则上要求将所有的变量放在一起定义并初始化，虽然对于静态变量系统赋予变量默认值，但为了清晰起见，请大家将初始化代码写在程序中。变量命名的规则见上面的叙述。<BR>? 合成和继承的合理使用<BR>程序中强调继承，但并不表示程序设计中处处用继承，合成和继承作为重新生成类的两个方法，请大家在具体使用之前要慎重。为判断自己到底应当使用哪种方法生成新的类，一个较好的方法是考虑是否需要从新类上溯造型回基础类。若必须上溯，就需要继承；否则，就要慎重考虑，防止自己对继承的滥用。<BR>? 程序的修改和功能变更<BR>程序开发过程中会不断对程序进行修改，对于那些由于功能的改变而引起的修改，在程序文件的头部要以文档的形式记录下来；如果是为了调试bug而进行的程序调整可以不记录在文件中。程序中比较复杂的算法要做出详细的解释。<BR>5. 性能 <BR>? 在写代码的时候，从头至尾都应该考虑性能问题。这不是说时间都应该浪费在优化代码上，而是我们时刻应该提醒自己要注意代码的效率。比如：如果没有时间来实现一个高效的算法，那么我们应该在文档中记录下来，以便在以后有空的时候再来实现她。 <BR>? 不必要的对象构造，构造对象的代价是很高的<BR>o 不要在循环中构造和释放对象 <BR>o 不要构造没有用的对象<BR>如下面例子中，第一行构造的vector对象，根本没有使用，在第二行中就释放掉了。<BR>vector newvector=new vector();<BR>newvector=string2vector.run(str);<BR>o <BR>o 使用 stringbuffer 对象 <BR>在处理 string 的时候要尽量使用 stringbuffer 类，stringbuffer 类是构成 string 类的基础。string 类将 stringbuffer 类封装了起来，（以花费更多时间为代价）为开发人员提供了一个安全的接口。当我们在构造字符串的时候，我们应该用 stringbuffer 来实现大部分的工作，当工作完成后将 stringbuffer 对象再转换为需要的 string 对象。比如：如果有一个字符串必须不断地在其后添加许多字符来完成构造，那么我们应该使用 stringbuffer 对象和她的 append() 方法。如果我们用 string 对象代替 stringbuffer 对象的话，会花费许多不必要的创建和释放对象的 cpu 时间。 <BR>? 避免不必要的使用 synchronized 关键字 <BR>避免的使用关键字 synchronized，应该在必要的时候再使用她，这是一个避免死锁的好方法。</P><img src ="http://www.blogjava.net/yihan422/aggbug/826.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yihan422/" target="_blank">俊子</a> 2005-01-30 12:43 <a href="http://www.blogjava.net/yihan422/archive/2005/01/30/826.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>架构与模式(Architecture &amp; Patterns)</title><link>http://www.blogjava.net/yihan422/archive/2005/01/30/825.html</link><dc:creator>俊子</dc:creator><author>俊子</author><pubDate>Sun, 30 Jan 2005 04:41:00 GMT</pubDate><guid>http://www.blogjava.net/yihan422/archive/2005/01/30/825.html</guid><wfw:comment>http://www.blogjava.net/yihan422/comments/825.html</wfw:comment><comments>http://www.blogjava.net/yihan422/archive/2005/01/30/825.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yihan422/comments/commentRss/825.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yihan422/services/trackbacks/825.html</trackback:ping><description><![CDATA[<TABLE width=387 align=center border=0>
<TBODY>
<TR>
<TD width=381>
<DIV align=center><SPAN class=style3><FONT size=2><FONT face=Arial><STRONG>架构与模式(Architecture &amp; Patterns)<BR>——Microsoft .Net在企业解决方案中的架构和模式实概述</STRONG><BR></FONT></FONT></SPAN></DIV></TD></TR></TBODY></TABLE>
<HR>
<BR>
<TABLE width=480 align=center border=0>
<TBODY>
<TR>
<TD><FONT color=#000099 size=2>[摘要]<BR><FONT face=楷体_GB2312>本专题的目标读者是那些希望理解Microsoft在企业、应用程序和技术体系结构方面提供的方法的商业、软件和基础设施体系结构设计师及其程序设计人员。全专题阐述了体系结构设计中需要考虑的各个要素，讨论了Microsoft .Net在企业解决方案中的结构和模式实现，全文定位比较高，对于架构和模式不是比较了解的读者可以参阅本专题提供的参看书目，对于专题提到的一些模式实现是以.Net Framework为基础的，有相关语言功底的读者就能够看懂示例代码，对于ASP.NET不是很熟悉的读者也可以参考MSDN联机帮助。</FONT></FONT><FONT size=2><BR><BR><STRONG><FONT size=3>什么是架构(Architecture)</FONT></STRONG> <BR><BR>软件体系结构通常被称为架构，指可以预制和可重构的软件框架结构。架构尚处在发展期，对于其定义，学术界尚未形成一个统一的意见，而不同角度的视点也会造成软件体系结构的不同理解，以下是一些主流的标准观点。<BR><BR>ANSI/IEEE 610.12-1990软件工程标准词汇对于体系结构定义是：“体系架构是以构件、构件之间的关系、构件与环境之间的关系为内容的某一系统的基本组织结构以及知道上述内容设计与演化的原理(principle)”。<BR><BR>Mary Shaw和David Garlan认为软件体系结构是软件设计过程中，超越计算中的算法设计和数据结构设计的一个层次。体系结构问题包括各个方面的组织和全局控制结构，通信协议、同步，数据存储，给设计元素分配特定功能，设计元素的组织，规模和性能，在各设计方案之间进行选择。Garlan &amp; Shaw模型的基本思想是：软件体系结构={构件(component),连接件(connector)，约束(constrain)}．其中构件可以是一组代码，如程序的模块；也可以是一个独立的程序，如数据库服务器。连接件可以是过程调用、管道、远程过程调用(RPC)等，用于表示构件之间的相互作用。约束一般为对象连接时的规则，或指明构件连接的形式和条件，例如，上层构件可要求下层构件的服务，反之不行；两对象不得递规地发送消息；代码复制迁移的一致性约束；什么条件下此种连接无效等。<BR><BR>关于架构的定义还有很多其他观点，比如Bass定义、Booch &amp; Rumbaugh &amp;Jacobson定义、Perry &amp; Wolf模型[7]、Boehm模型等等，虽然各种定义关键架构的角度不同，研究对象也略有侧重，但其核心的内容都是软件系统的结构，其中以Garlan &amp; Shaw模型为代表，强调了体系结构的基本要素是构件、连接件及其约束（或者连接语义），这些定义大部分是从构造的角度来甚至软件体系结构，而IEEE的定义不仅强调了系统的基本组成，同时强调了体系结构的环境即和外界的交互。<BR><BR><FONT color=#000000 size=3><STRONG>什么是模式(Pattern)</STRONG></FONT><BR><BR>模式（Pattern）的概念最早由建筑大师Christopher Alexander于二十世纪七十年代提出，应用于建筑领域，八十年代中期由Ward Cunningham和Kent Beck将其思想引入到软件领域，1994年开始由Hillside Group(由Kent Beck等发起成立)和OOPSLA联合发起了国际PLoP（Pattern Language of Programming）会议，如今模式（Pattern）已成为软件工程领域内的一个热门话题，其在计算机领域的影响超过了在建筑界的影响。<BR><BR>Christopher Alexander将模式分为三个部分：首先是周境（Context，也可以称着上下文）,指模式在何种状况下发生作用；其二是动机（System of Forces）,意指问题或预期的目标；其三是解决方案（Solution）,指平衡各动机或解决所阐述问题的一个构造或配置（Configuration）。他提出，模式是表示周境、动机、解决方案三个方面关系的一个规则，每个模式描述了一个在某种周境下不断重复发生的问题，以及该问题解决方案的核心所在，模式即是一个事物（thing）又是一个过程(process)，不仅描述该事物本身，而且提出了通过怎样的过程来产生该事物。这一定义已被软件界广为接受。<BR><BR>软件模式的应用对软件开发产生了重大的作用，主要表现在：<BR>? 软件模式是人们在长期的设计软件、管理组织软件开发等实践中大量经验的提炼和抽象，是复用软件设计方法、过程管理经验的有力工具。模式类似于拳击中的组合拳，它提供了一系列软件开发中的思维套路。如，通过模式的使用，有利于在复杂的系统中产生简洁、精巧的设计。<BR><BR>? 软件模式为我们提供了一套简洁通用的设计、管理、组织方面的词汇，同时模式也为我们提供了一个描述抽象事物的规范标准，可大大促进软件开发过程中人与人之间的交流，而软件开发中的交流是至关重要的，“软件项目失败的原因最终都可追溯到信息没有及时准确地传递到应该接收它的人”。<BR><BR><FONT size=3><STRONG>架构和模式的关系</STRONG></FONT><BR><BR>因为架构(Architecture)和模式(Pattern)在当前的软件开发中经常地被提及，可是很多人容易混淆这两个术语，而对此，学术界也没有一个非常统一的定义。<BR><BR>架构和模式应该是一个属于相互涵盖的过程，但是总体来说Architecture更加关注的是所谓的High-Level Design,而模式关注的重点在于通过经验提取的“准则或指导方案”在设计中的应用，因此在不同层面考虑问题的时候就形成了不同问题域上的Pattern。相对于系统分析而言，架构是在提出解决问题的方案，而系统分析则是解决这些问题，这两者都会运用到模式，只是侧重的角度略有不同，架构方面倾向于架构模式，而系统分析更多的是采用设计模式和具体语言的实现模式。架构强调的是软件系统的结构及其各个元素之间的关系，而模式则是抽象各个层次上的关系，比如在架构设计时，设计模式是经过经验抽象过后的一些“准则”，而利用这些模式，有助于在架构设计中更好的分离系统元素(elements)和组织系统元素之间的关系。<BR><BR>模式是一个经验提取的“准则”，并且在一次一次的实践中得到验证，在不同的层次有不同的模式，小到语言实现(如Singleton)大到架构。在不同的层面上，模式提供不同层面的指导，比如架构设计方面，三层应用程序，分布式应用程序等等这些技术架构模式为架构设计提供了理论的参考，而在程序设计领域，设计模式则是提供了描述各个元素（在面向对象领域，更多的是指Class)之间的关系,GOF95的《设计模式---可复用面向对象软件的基础 》就是这个层次上的经典巨作，而在语言的实现过程中，也出现了同样的实现模式，如.NET<BR>中的delegate（委托）的Observer（观察者）模式实现。<BR><BR>相对于系统分析或者设计模式来说，体系结构从更高的层面去考虑问题，所以关注的问题就体现在“不变”因素上，比如系统部署中，更加关心应用程序的分层分级设计，而在这个基础之上提出的部署方案，才是架构考虑的重点。体系结构关心应用程序模式，更加体现在通过技术去解决这些业务差异带来的影响，关心是否是分布式应用程序，关心系统分层是如何设计，也关心性能和安全，因此在这样的情况之下，会考虑集群，负载平衡，故障迁移等等一系列技术。<BR><BR>希望通过定义的方式来区分架构和模式是不太可能的，因为本来就是交互交叉和提供服务的，比如著名的MVC(Model-View-Controll)就是一个例子，在设计模式中是一个非常经典的模式，在架构中同样适用。对于熟悉架构设计的系统架构师而言，似乎可以用如下来解释架构和模式之间的关系：架构是Hight-Level Design,着眼于不同业务中共性的解决方案，而模式是General Principle(通用原理)。<BR><BR><FONT color=#ff0000>模式用来指导架构设计，同时架构设计选择模式</FONT> 
<P><STRONG><FONT size=3>关于Microsoft .Net Framework</FONT></STRONG><BR><BR>.NET Framework是一种新的计算平台，它简化了在高度分布式Internet环境中的应用程序开发。.NET Framework旨在实现下列目标：<BR>　 ●提供一个一致的面向对象的编程环境，而无论对象代码是在本地存储和执行，还是在本地执行但在Internet上分布，或者是在远程执行的。<BR>　●提供一个将软件部署和版本控制冲突最小化的代码执行环境。<BR>　●提供一个保证代码（包括由未知的或不完全受信任的第三方创建的代码）安全执行的代码执行环境。<BR>　●提供一个可消除脚本环境或解释环境的性能问题的代码执行环境。<BR>　●使开发人员的经验在面对类型大不相同的应用程序（如基于Windows的应用程序和基于Web的应用程序）时保持一致。<BR>　●按照工业标准生成所有通信，以确保基于.NET Framework的代码可与任何其他代码集成。<BR><BR>.NET Framework具有两个主要组件：公共语言运行库和.NET Framework类库。公共语言运行库是.NET Framework的基础。您可以将运行库看作一个在执行时管理代码的代理，它提供核心服务（如内存管理、线程管理和远程处理），而且还强制实施严格的类型安全以及可确保安全性和可靠性的其他形式的代码准确性。事实上，代码管理的概念是运行库的基本原则。以运行库为目标的代码称为托管代码，而不以运行库为目标的代码称为非托管代码。.NET Framework的另一个主要组件是类库，它是一个综合性的面向对象的可重用类型集合，您可以使用它开发多种应用程序，这些应用程序包括传统的命令行或图形用户界面(GUI)应用程序，也包括基于ASP.NET所提供的最新创新的应用程序（如Web窗体和XML Web services）。<BR><BR>.NET Framework可由非托管组件承载，这些组件将公共语言运行库加载到它们的进程中并启动托管代码的执行，从而创建一个可以同时利用托管和非托管功能的软件环境。.NET Framework不但提供若干个运行库宿主，而且还支持第三方运行库宿主的开发。<BR><BR>例如，ASP.NET承载运行库以为托管代码提供可伸缩的服务器端环境。ASP.NET直接使用运行库以启用ASP.NET应用程序和XML Web services。<BR>下面的插图显示公共语言运行库和类库与应用程序之间以及与整个系统之间的关系。该插图还显示托管代码如何在更大的结构内运行。<BR><BR><FONT size=3><STRONG>.NET Framework环境</STRONG></FONT><BR></P></FONT>
<TABLE width=480 border=0>
<TBODY>
<TR>
<TD><IMG height=363 src="file:///D:/我的文档/我的书籍/技术/文章/架构与模式(Architecture%20&amp;%20Patterns).files/tupian1.jpg" width=396></TD></TR></TBODY></TABLE><FONT size=2>
<P><BR><STRONG><FONT size=3>Microsoft企业架构(体系结构)概述</FONT></STRONG><BR><BR>企业体系结构(EA)是帮助组织理解自己的结构及其原理的概念工具。它提供了企业的结构图，是业务和技术变化的规划工具。一般来说，企业体系结构表现为一整套相互关联的模型，这些模型描述了企业的结构和功能。企业体系结构主要用于系统化的IT规划和架构，以及改进的决策过程。EA中的各个模型以逻辑方式来排列，可以使企业的详细信息处于不断增长中，包括：<BR>　 ●目的和目标；<BR>　 ●过程和组织；<BR>　 ●系统和数据；<BR>　 ●使用的技术；<BR><BR>企业体系结构中的信息可以从不同角度来审视，并且可以满足各种需要。体系结构的用户包括业务经理和分析员、系统体系结构设计师、工作流程和程序分析员、后勤专家、组织分析员等。这些人员要求有高级的概括信息、详细的数据和各种级别的中间数据。这些需要通过创建概念视图、逻辑分析和物理实现来满足。在Microsoft，我们发现了四个重要并且常用的基本审视角度。它们是业务、应用程序、信息和技术角度。<BR><BR><STRONG>业务角度</STRONG><BR>“业务角度”描述了业务的运作方式。它包括广泛的商业策略，以及为了将组织从当前状态推进到构想的未来状态而做的计划。一般包括以下内容：<BR>1． 企业的高级目标；<BR>2． 整个企业或企业的重要部分实施的业务过程；<BR>3． 执行的业务功能；<BR>4． 主要的组织结构；<BR>5． 各元素之间的相互关系；<BR><STRONG>应用程序角度</STRONG><BR>“应用程序角度”定义了企业的资产应用，以应用程序为中心。一般包括下列内容：<BR>1. 有关支持业务过程的自动服务的描述；<BR>2. 有关组织中应用程序系统的相互作用和相互依赖（接口）的描述；<BR>3. 根据企业目标开发新应用程序和改造旧应用程序，以及发展技术平台的计划；<BR>应用程序角度可表示跨组织的服务、信息和功能，连接具有不同技能和技术的用户以便达到共同的业务目标。<BR><STRONG>信息角度</STRONG><BR>“信息角度”描述了组织在业务处理和运作过程中需要知道的信息。包括下列内容：<BR>1. 标准数据模型；<BR>2. 数据管理策略；<BR>3. 组织中信息产生和使用的模式说明；<BR>信息角度还描述了数据与工作流程关联的方式，包括整个组织中存在的结构化数据存储（如数据库）和非结构化数据存储（如文档、电子表格和演示文稿等）。<BR><STRONG>技术角度</STRONG><BR>“技术角度”对组织提供硬件和软件支持。它包括但不仅限于：<BR>1. 台式机和服务器硬件；<BR>2. 操作系统；<BR>3. 网络连接组件；<BR>4. 打印机；<BR>5. 调制解调器；<BR>技术角度对支持应用程序和信息角度所需的基础设施和系统组件提供了逻辑化的、独立于供应商的描述。它定义了一套完成业务所需的技术标准和服务。</P>
<P>尽管有许多角度，但是从这些角度看到的只是一个企业体系结构。企业体系结构的价值不在于任何一个单独的角度，而在于各角度之间的相互关系、相互作用和相互依赖。尽管所有角度都是企业体系结构的关键元素，而本专题将集中讨论应用程序和技术角度。<BR><BR>“应用程序体系结构”是自动服务的体系结构，用于支持和实现这样的业务需求，包括该业务与其他应用程序之间的接口。它描述了应用程序的结构，以及该结构如何实现组织的功能需求。虽然在理想情况下，一个组织应该只有一个应用程序体系结构，但实际上，一个组织往往会有许多不同的应用程序体系结构。<BR><BR>软件系统的“运作”需求定义了软件的可靠性、可管理性、性能、安全性和互操作性等。常见的例子是仅对授权用户开放的服务，这种服务要求在99.999%的时间内都能正确实现它的功能。<BR><BR>“技术体系结构”是支持组织以及实现运作（非功能）需求（尤其是组织的应用程序和信息体系结构）的硬件和软件基础设施的体系结构。它描述了所使用技术的结构和内部关系，以及这些技术如何支持组织的运作需求。<BR><BR>好的技术体系结构可以提供安全性、可用性和可靠性，还可以支持各种其他运作需求。但是如果应用程序的设计没有利用技术体系结构的优点的话，它的执行效果会很差，或者会难以部署和运作。同样，即使一个优秀的应用程序体系结构是通过使用最新的技术、利用可重用软件组件来构建的，能很好地满足业务过程的需求，它也可能不能很好地反映实际的技术配置，例如：服务器没有经过正确配置来支持应用程序组件，网络硬件设置不能支持信息流等。这显示了应用程序体系结构和技术体系结构之间的相互关系：一个好的技术体系结构能够支持组织中关键的应用程序，而一个好的应用程序体系结构能够充分利用技术体系结构，在整个运作需求中提供一致的性能。<BR><BR></P></FONT>
<TABLE width=480 border=0>
<TBODY>
<TR>
<TD><IMG height=325 src="file:///D:/我的文档/我的书籍/技术/文章/架构与模式(Architecture%20&amp;%20Patterns).files/tupian2.jpg" width=450></TD></TR></TBODY></TABLE><FONT size=2><BR>图：体系结构之间的关系<BR><BR>所有体系结构角度都有多种体系结构视图，通常分为概念、逻辑和物理视图。“概念视图”是最抽象的视图，一般用系统用户（非IT专业用户）熟悉的术语来描述。概念视图用于定义应用程序的功能需求和商业用户视图，以便生成业务模型。“逻辑视图”显示了主要的功能组件和它们在系统中的关系，而不涉及功能的实现细节。体系结构设计师创建的“应用程序模型”就是业务模型的逻辑视图，因为它们决定了如何满足业务目标和需求。应用程序模型表示应用程序体系结构的逻辑视图。“物理视图”是最不抽象的，它们表示特定的实现组件和它们之间的关系。物理视图中的每个元素一般都由设计和开发过程来实现，如软件和硬件系统。<BR><BR><BR></FONT>
<TABLE width=287 border=0>
<TBODY>
<TR>
<TD width=281><IMG height=170 src="file:///D:/我的文档/我的书籍/技术/文章/架构与模式(Architecture%20&amp;%20Patterns).files/tupian3.jpg" width=264></TD></TR></TBODY></TABLE><FONT size=2><BR>图：体系结构视图<BR><BR>每一个体系结构级别均可能有（事实上通常都会有）多个视图，例如，每个应用程序通常都会有一个逻辑应用程序体系结构。这些视图由一组需求来驱动，反过来又会生成设计、开发、配置和运作过程及系统的输入。 <BR><BR></FONT>
<TABLE width=480 border=0>
<TBODY>
<TR>
<TD><IMG height=333 src="file:///D:/我的文档/我的书籍/技术/文章/架构与模式(Architecture%20&amp;%20Patterns).files/tupian4.jpg" width=450></TD></TR></TBODY></TABLE><FONT size=2><BR>图：体系结构视图和模式</FONT> 
<P><FONT size=2>以.NET为代表的Microsoft产品线向我们展示了“架构为基础，模式为指导”的企业解决方案设计理念，秉承微软产品一贯以来的简单易用以外，同时我们将看到使用.NET构建企业应用平台上使用.NET的优势。毫不夸张地说，.NET不是第一个体现架构和模式的软件应用平台，确是目前为止最后的实现了架构和模式的平台，在随后的文章介绍中，你将会发现，架构设计和模式应用会是如此简单。</FONT></P></TD></TR></TBODY></TABLE><img src ="http://www.blogjava.net/yihan422/aggbug/825.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yihan422/" target="_blank">俊子</a> 2005-01-30 12:41 <a href="http://www.blogjava.net/yihan422/archive/2005/01/30/825.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>