汽车租赁管理系统的设计与实现毕业设计论文_第1页
汽车租赁管理系统的设计与实现毕业设计论文_第2页
汽车租赁管理系统的设计与实现毕业设计论文_第3页
汽车租赁管理系统的设计与实现毕业设计论文_第4页
汽车租赁管理系统的设计与实现毕业设计论文_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

中南财经政法大学毕业设计(论文)第32页共32页毕业设计论文汽车租赁管理系统的设计与实现摘要:汽车租赁业被称为“朝阳产业”,它因为无须办理保险、无须年检维修、车型可随意更换等优点,以租车代替买车来控制企业成本,这种在外企中十分流行的管理方式,正慢慢受到国内企事业单位和个人用户的青睐。将买车、养车的包袱全丢给汽车租赁公司,而把主要财力和精力放在自己的主业上,这是当今国际跨国公司流行的做法。据统计,一年下来,像桑塔纳2000这样的普通车,购车要比租车多花费10000元修理费,即以租车代替买车,成本就可以下降3成。另外,租车还为企业节省一笔管理成本,其根本原因在于对企业管理上“成本可控”理念认可——采用租赁,随时可以调整开支,风险小,灵活性强,是降低成本的最好办法。那些对中国地方性法规制度不熟悉的商家可以减少诸如汽车上牌、年检、缴费、违章事故的处理等一系列不必要的麻烦。客户们还可以自由地选择租赁汽车的品牌,从经济型车到高档车,所有汽车均有完备的手续。汽车租赁的五个优势车型可随时更新随着人们消费水平的提高,对高档消费品有不断更新的欲望。在欧美人们平均8个月更换一次车型。假如现在花费三十多万元购买一台轿车,因社会经济发展很快,一年后汽车的性能、外观改进很多,而价格却会大幅下降。一年后,如果想换新车型,老车可能15万元就很难卖出。这意味着,一年中车价损失接近20万元。但假如租赁一台三十多万元的车,只需10余万元。而且,可随时租用最新车型。从目前人们经常更换手机的状况就能预料到几年后,经常换新车,将是人们的新时尚。解除车辆维修、年度检验的烦恼自购车辆后对车辆的维修和保养及一年一度的车辆年检要耗费很多财力和精力。但如果租车,就不存在这些烦恼,无论是车辆维修还是其它原因,车辆不能正常使用时,租赁公司都会及时提供替代车,保证用车。三、可充分提高资金利用率如果自购车辆要一次性支付30万元,消费者具有一定经济实力。也就是说租车和买车相比至少可节省一次性投资20万元。消费者用这20万元去经营,可赚取一笔可观的利润。四、可保证你良好的财务状况自购车辆必然会造成固定资产增加、借款增加、流动资产减少使财务出现不良状况,而租赁车辆将有效回避上述风险。五、有利于提高成本观念,减少浪费自购车辆使用时随心所欲,特别是单位公车,私自用车现象较多,造成不必要的浪费,而如果租赁车,一是可根据业务需要随时调控用车数量,二是用车人知道自己的用车成本,,可直接减少不必要的用车,有效地提高员工的成本观念。第1章开发环境1.1开发所需工具 Tomcat6.0,WindowsXP,EditPlus,DreamweaverMX2004,IE6.0,Firefox火狐浏览器,Oracle10g等。1.2Tomcat Tomcat服务器是一个免费的开放源代码的Web应用服务器,目前最新版本是6.0.18.Tomcat是Apache软件基金会(ApacheSoftwareFoundation)的Jakarta项目中的一个核心项目,由Apache、Sun和其他一些公司及个人共同开发而成。由于有了Sun的参与和支持,最新的Servlet和JSP规范总是能在Tomcat中得到体现,Tomcat5支持最新的Servlet2.4和JSP2.0规范。因为Tomcat技术先进、性能稳定,而且免费,因而深受Java爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web应用服务器。 Tomcat很受广大程序员的喜欢,因为它运行时占用的系统资源小,扩展性好,支持负载平衡与邮件服务等开发应用系统常用的功能;而且它还在不断的改进和完善中,任何一个感兴趣的程序员都可以更改它或在其中加入新的功能。 Tomcat是一个小型的轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP程序的首选。对于一个初学者来说,可以这样认为,当在一台机器上配置好Apache服务器,可利用它响应对HTML页面的访问请求。实际上Tomcat部分是Apache服务器的扩展,但它是独立运行的,所以当你运行tomcat时,它实际上作为一个与Apache独立的进程单独运行的。1.3JSP JSP(JavaServerPages)是由SunMicrosystems公司倡导、许多公司参与一起建立的一种动态网页技术标准。JSP技术有点类似ASP技术,它是在传统的网页HTML文件(*.htm,*.html)中插入Java程序段(Scriptlet)和JSP标记(tag),从而形成JSP文件(*.jsp)。用JSP开发的Web应用是跨平台的,即能在Linux下运行,也能在其他操作系统上运行。JSP技术使用Java编程语言编写类XML的tags和scriptlets,来封装产生动态网页的处理逻辑。网页还能通过tags和scriptlets访问存在于服务端的资源的应用逻辑。JSP将网页逻辑与网页设计和显示分离,支持可重用的基于组件的设计,使基于Web的应用程序的开发变得迅速和容易。Web服务器在遇到访问JSP网页的请求时,首先执行其中的程序段,然后将执行结果连同JSP文件中的HTML代码一起返回给客户。插入的Java程序段可以操作数据库、重新定向网页等,以实现建立动态网页所需要的功能。JSP与JavaServlet一样,是在服务器端执行的,通常返回该客户端的就是一个HTML文本,因此客户端只要有浏览器就能浏览。JSP的1.0规范的最后版本是1999年9月推出的,12月又推出了1.1规范。目前较新的是JSP1.2规范,JSP2.0规范的征求意见稿也已出台。JSP页面由HTML代码和嵌入其中的Java代码所组成。服务器在页面被客户端请求以后对这些Java代码进行处理,然后将生成的HTML页面返回给客户端的浏览器。JavaServlet是JSP的技术基础,而且大型的Web应用程序的开发需要JavaServlet和JSP配合才能完成。JSP具备了Java技术的简单易用,完全的面向对象,具有平台无关性且安全可靠,主要面向因特网的所有特点。 自JSP推出后,众多大公司都支持JSP技术的服务器,如IBM、Oracle、Bea公司等,所以JSP迅速成为商业应用的服务器端语言。1.4Servlet Servlet是一种独立于平台和协议的服务器端的Java应用程序,可以生成动态的Web页面。它担当Web浏览器或其他HTTP客户程序发出请求,与HTTP服务器上的数据库或应用程序之间的中间层。 Servlet是位于Web服务器内部的服务器端的Java应用程序,与传统的从命令行启动的Java应用程序不同,Servlet由Web服务器进行加载,该Web服务器必须包含支持Servlet的Java虚拟机。 在传统的CGI中,每个请求都要启动一个新的进程,如果CGI程序本身的执行时间较短,启动进程所需要的开销很可能反而超过实际执行时间。而在Servlet中,每个请求由一个轻量级的Java线程处理(而不是重量级的操作系统进程)。在传统CGI中,如果有N个并发的对同一CGI程序的请求,则该CGI程序的代码在内存中重复装载了N次;而对于Servlet,处理请求的是N个线程,只需要一份Servlet类代码。在性能优化方面,Servlet也比CGI有着更多的选择。 Servlet提供了大量的实用工具例程,例如自动地解析和解码HTML表单数据、读取和设置HTTP头、处理Cookie、跟踪会话状态等。 在Servlet中,许多使用传统CGI程序很难完成的任务都可以轻松地完成。例如,Servlet能够直接和Web服务器交互,而普通的CGI程序不能。Servlet还能够在各个程序之间共享数据,使得数据库连接池之类的功能很容易实现。Servlet用Java编写,ServletAPI具有完善的标准。因此,为IPlanetEnterpriseServer写的Servlet无需任何实质上的改动即可移植到Apache、MicrosoftIIS或者WebStar。几乎所有的主流服务器都直接或通过插件支持Servlet。 不仅有许多廉价甚至免费的Web服务器可供个人或小规模网站使用,而且对于现有的服务器,如果它不支持Servlet的话,要加上这部分功能也往往是免费的(或只需要极少的投资)。1.5静态网页与动态网页 静态网页是标准的HTML文件,其文件扩展名是.htm或.html。它可以包含HTML标记、文本、Jave小程序、客户端脚本以及客户端ActiveX控件,但这种网页不包含任何服务器端脚本,该页中的每一行HTML代码都是在放置到Web服务器前由网页设计人员编写的,在放置到Web服务器后便不再发生任何更改,所以称之为静态网页。 程序是否在服务器端运行,是动态网页的重要标志。在服务器端运行的程序、网页、组件,属于动态网页,它们会随不同客户、不同时间,返回不同的网页,例如ASP、PHP、JSP、ASP.net、CGI等。运行于客户端的程序、网页、插件、组件,属于静态网页,例如html页、Flash、JavaScript、VBScript等等,它们是永远不变的。1.6JDBC JDBC(JavaDataBaseConnectivity,java数据库连接)是一种用于执行SQL语句的JavaAPI,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC为工具/数据库开发人员提供了一个标准的API,据此可以构建更高级的工具和接口,使数据库开发人员能够用纯JavaAPI编写数据库应用程序,同时,JDBC也是个商标名。 有了JDBC,向各种关系数据发送SQL语句就是一件很容易的事。换言之,有了JDBCAPI,就不必为访问Sybase数据库专门写一个程序,为访问Oracle数据库又专门写一个程序,或为访问Informix数据库又编写另一个程序等等,程序员只需用JDBCAPI写一个程序就够了,它可向相应数据库发送SQL调用。同时,将Java语言和JDBC结合起来使程序员不必为不同的平台编写不同的应用程序,只须写一遍程序就可以让它在任何平台上运行,这也是Java语言“编写一次,处处运行”的优势。 Java数据库连接体系结构是用于Java应用程序连接数据库的标准方法。JDBC对Java程序员而言是API,对实现与数据库连接的服务提供商而言是接口模型。作为API,JDBC为程序开发提供标准的接口,并为数据库厂商及第三方中间件厂商实现与数据库的连接提供了标准方法。JDBC使用已有的SQL标准并支持与其它数据库连接标准,如ODBC之间的桥接。JDBC实现了所有这些面向标准的目标并且具有简单、严格类型定义且高性能实现的接口。 Java具有坚固、安全、易于使用、易于理解和可从网络上自动下载等特性,是编写数据库应用程序的杰出语言。所需要的只是Java应用程序与各种不同数据库之间进行对话的方法。而JDBC正是作为此种用途的机制。 JDBC扩展了Java的功能。例如,用Java和JDBCAPI可以发布含有applet的网页,而该applet使用的信息可能来自远程数据库企业也可以用JDBC通过Intranet将所有职员连到一个或多个内部数据库中(即使这些职员所用的计算机有Windows、Macintosh和UNIX等各种不同的操作系统)。随着越来越多的程序员开始使用Java编程语言,对从Java中便捷地访问数据库的要求也在日益增加。1.7Oracle Oracle是殷墟(YinXu)出土的甲骨文(oracleboneinscriptions)的英文翻译的第一个单词,在英语里是“神谕”的意思。 与无压缩格式下存储数据相比,新的Oracle数据压缩技术能够确保以较小的开销节省三倍以上的磁盘存储空间。这一点比仅节省磁盘空间要具有更大的优势,因为它能够使企业节约更多的开支,以便有更多的资金来巩固自己的地位。 自动诊断知识库(AutomaticDiagnosticRepository,ADR)是专门针对严重错误的知识库。该知识库基本上能够自动完成一些以往需要由数据库管理员来手动完成的操作。 作为ADR的一部分,SQL性能分析器(SQLPerformanceAnalyzer,SPA)是最让人惊喜的特性之一。SQL性能分析器是一个整体调整工具,管理员可以通过该工具在数据库上定义和重演(replay)一个典型的工作负载,之后管理员可以调节整体参数来使数据库尽快的达到最佳性能——而这一任务同样也是许多年以来由数据库管理员手动完成的。 由于获得了最优的初始参数,数据库管理员就不需要调整数以万计的SQL语句。管理员需要做的就是给定一个典型的负载,由SAP根据历史记录来决定SQL的最终设置,而不用管理员来检测哪一个SQL设置是最合理的。 多年以来,甲骨文公司一直在努力完成地另一个新特性便是“联机更新”(在不down机的情况下更新软件)。实际上,很难从软件工程的角度来设计一个运行时能自动升级的软件。由于真正的应用集群(RealApplicationClusters,RAC)特性,甲骨文公司再一次对其他的数据库供应商造成了更大的压力。在实际的使用过程中,数据库产品的用户总是希望产品有持续的高可用性,这并不是说只需满足下次补丁更新之前的3年的时间就够了。 自动内存管理特性可以追根溯源至Oracle9i,那时甲骨文公司推出首款自动调节存储池的工具。AMM工具其实就是一种探测机制。实际上,Oracle11g有很多随机访问存储池,当AMM探测到某个存储池中已满时,它将整个RAM从一个区域分配到其他相对合适的区域。系统后台设计2.1系统的主要技术分析2.1.1.Browser/Server系统的三层体系结构 在Browser/Server的系统中,用户可以通过浏览器向分布在网络上的许多服务器发出请求。Browser/Server结构极大的简化了客户机的工作,客户机上只需安装、配置少量的客户端软件即可,服务器将担负更多的工作,对数据库的访问和应用程序的执行将在服务器上完成。 在Browser/Server三层体系结构下,表示层(Presentation)、功能层(BusinessLogic)、数据层(DataService)被分割成三个相对独立的单元: 第一层--表示层:Web浏览器在表示层中包含系统的显示逻辑,位于客户端。它的任务是由Web浏览器向网络上的某一Web服务器提出服务请求,Web服务器对用户身份进行验证后用HTTP协议把所需的主页传送给客户端,客户机接受传来的主页文件,并把它显示在Web浏览器上。 第二层--功能层:具有应用程序扩展功能的Web服务器在功能层中包含系统的事务处理逻辑,位于Web服务器端。它的任务是接受用户的请求,首先需要执行相应的扩展应用程序与数据库进行连接,通过SQL等方式向数据库服务器提出数据处理申请,而后等数据库服务器将数据处理的结果提交给Web服务器,再由Web服务器传送回客户端。 第三层--数据层:数据库服务器在数据层中包含系统的数据处理逻辑,位于数据库服务器端。它的任务是接受Web服务器对数据库操纵的请求,实现对数据库查询、修改、更新等功能,把运行结果提交给Web服务器。 从上面的分析中可以看出,三层的Browser/Server体系结构是把二层Client/Server结构的事务处理逻辑模块从客户机的任务中分离出来,由单独组成的一层来负担其任务,这样客户机的压力大大减轻了,把负荷均衡地分配给了Web服务器,于是由原来的两层的Client/server结构转变成三层的Browser/Server结构。图2-1数据模型第3章数据库设计3.1数据库模式数据库模式定义了数据库的结构、表、关系、域和业务规则。数据库模式是一种设计,数据库和应用正是建立在此基础上的。域是一列可能拥有的值的集合。必须为每一个表的每一列确定域。除了数据的物理格式外,还需要确定是否有些域对表来说是唯一的。数据库模式的最后一个要素是业务规则,它是对需要反映在数据库和数据库应用程序中的业务活动的约束。业务规则是模式的一个重要部分,因为他们指定了无论什么数据变化到达DBMS引擎,允许的数据值必须满足的约束。不管无效的数据变化请求是来自窗体的用户、查询/修改请求还是应用程序,DBMS都应该拒绝。遗憾的是,不同的DBMS产品用不同的方法实施业务规则。在某些情况下,DBMS产品不具备实施必要业务规则的能力,必须以代码形式把它们编入应用程序。3.2用户表结构用户表用来反映用户在数据库内所有属性,包括:用户ID,登入名,密码,身份证号,姓名,性别,地址,联系电话,职位以及用户类型.用户表Users名称中文名称物理名称字段类型主键字段名IDUserid(PK)Number是字段名登录名UsernameVarchar2(30)否字段名身份证IdentityNumber否字段名姓名FullnameVarchar2(30)否字段名性别SexNumber否字段名地址AddressVarchar2(30)否字段名联系电话PhoneNumber否字段名职位PositionVarchar2(30)否字段名用户类型UserlevelNumber否字段名密码UserpwdVarchar2(30)否表3-1用户表功能关系图如下:用户管理用户管理添加用户修改用户密码查询用户修改用户删除用户分配权限图3-1功能关系图3.3客户表结构客户表用来反正真实客户在数据库内所有属性,包括:客户ID,身份证号,姓名,性别,地址,电话,职业,密码等。客户表:Customers名称中文名称物理名称字段类型主键字段名IDCust_id(PK)Number是字段名身份证IdentityNumber否字段名姓名CustnameVarchar2(30)否字段名性别SexNumber否字段名地址AddressVarchar2(30)否字段名电话PhoneNumber否字段名职业CareerVarchar2(30)否字段名密码CustpwdVarchar2(30)否表3-2客户表结构功能关系图如下:客户管理客户管理添加客户修改客户密码查询客户删除客户修改客户图3-2功能关系图3.4汽车表结构汽车表用来反正真实汽车在数据库内所有属性,其中包括:汽车ID,车号,车型,颜色,价值,租金,押金,租用情况,简介等.汽车信息表:Cars名称中文名称物理名称字段类型主键字段名IDcarid(PK)Number是字段名车号carnumberVarchar2(30)否字段名型号cartypeVarchar2(30)否字段名颜色colorVarchar2(30)否字段名价值priceNumber否字段名租金rentpriceNumber否字段名押金depositNumber否字段名租用情况isrentingNumber否字段名简介descriptionVarchar2(50)否表3-3信息表功能关系图如下:汽车管理汽车管理查询汽车信息删除汽车信息添加汽车信息修改汽车信息图3-4关系图3.5出租单表结构 反映出租单情况,包括出租单编号,预付金,应付金,实际交付金额,起租日期,应归还日期,归还日期,出租单状态,客户号,车号,服务人员编号等.出租单信息表:Rentable名称中文名称物理名称字段类型主键字段名出租单编号tableid(PK)Number是字段名预付金ImprestNumber否字段名应付金shouldpaypriceNumber否字段名实际交付金额PriceNumber否字段名起租日期BegindateDate否字段名应归还日期shouldreturndateDate否字段名归还日期ReturndateDate否字段名出租单状态RentflagNumber否字段名客户号custid(FK)Number否字段名车号carid(FK)Number否字段名服务人员编号userid(FK)Number否表3-4信息表3.6检查单表结构 反映检查单实际情况,包括检查单号,检查时间,属性,问题,赔费,检查员,出租单编号等.检查单信息表:checktable名称中文名称物理名称字段类型主键字段名检查单号checkid(PK)Number是字段名检查时间checkdateDate否字段名属性FieldVarchar2(30)否字段名问题problemVarchar2(30)否字段名赔费payingNumber否字段名检查员checkuserid(FK)参照用户表Number否字段名出租单编号Rentid(FK)参照出租单表 Number否表3-5检查单信息表客户租车流程图:图3-5客户租车流程图客户请客户请求业务出租汽车查询是否存在此客户生成出租单并修改数据库汽车信息数据库内修改该客户信息记录租车记录客户还车流程图:图3-6客户还车流程图客户归还汽车客户归还汽车查询出租单生成检查单修改客户租用状态修改汽车租用状态修改出租单状态连接数据库 通过JDBC连接到ORACLE,利用JAVA的反射机制来寻找ORACLE提供的JDBC连接方法源代码节选:/***连接数据库抽象类*作为工具提供其他类直接调用Connection连接数据库*含有关闭数据库连接方法*/ Class.forName(ConnectionImport.driver);//反射机制获取数据库驱动! conn=DriverManager.getConnection(ConnectionImport.url, ConnectionImport.user,ConnectionImport.password); //回滚操作。 第4章建立数据库4.1数据库建模 通过建模工具建立数据库中所有数据模型UML图如下:图4-1UML数据模型4.2数据库建表 利用SQL语句建立数据库表,利用数据库表的互相管理来反映具体事务的真实关系。由于表太多,这里也就不一一列举了。 权限与目录表的SQL语句如下: createtableOA_ROLES_MENUS(ROLE_IDNUMBERnotnull,MENU_IDNUMBERnotnull,constraintROLES_MENUSprimarykey(ROLE_ID,MENU_ID)系统前台设计系统登入界面:界面如下图:图5-1登陆界面源代码节选: Stringname=request.getParameter("username");//获取用户名 Stringpassword=request.getParameter("password");//获取密码 Stringrole_id=request.getParameter("role");//获取用户等级 intid=Integer.parseInt(role_id); LoginDAOlogin=newLoginDAO(name,password,id); booleanflag=login.checkUser(); if(flag){ //建立回话 Useruser=login.getUser(); HttpSessionsession=request.getSession(); //在会话中将用户操作目录和所能操作的功能做保存 session.setAttribute(Constants.KEY_SESSION,user); response.sendRedirect("default.jsp");//跳转生成目录 }else{ //System.out.println(flag); request.setAttribute("msg","err"); request.getRequestDispatcher("wrong.html").forward(request, response); }动态生成菜单 每次登入时自动访问数据库查询角色所对应的功能菜单如图所示 图5-2功能菜单查询界面如图所示图5-3查询界面 通过查询数据库生成数组进行遍历产生结果集,利用分页技术展示给用户使用。代码节选: 根据角色ID查询角色对应的菜单 conn=JdbcUtil.getConnection(); stat=conn.prepareStatement(sql); stat.setInt(1,id); set=stat.executeQuery(); while(set.next()){ menu=newMenu(); 如果没有父目录,则将父目录设为-1 intmenuid=set.getInt("id"); FunDAOfun=newFunDAOImpl(); List<Fun>funs=fun.findFunByMenu(menuid); menu.setId(menuid); menu.setName(set.getString("name"));目录名 intfatherid=set.getInt("father_id"); if(fatherid<1){ fatherid=-1; } menu.setFatherid(fatherid);父目录ID menu.setUri(set.getString("uri")); menu.setFuns(funs); list.add(menu); }角色添加如图所示 添加角色是比较关键的部分,修改角色对应的目录和功能,通过修改中间表.并且不通过UPDATA来修改,只能将原有数据删除然后重新插入代码如下:Stringsql1="deletefromoa_roles_menuswhererole_id=?";//刪除菜单语句Stringsql3="deletefromoa_roles_funswhererole_id=?";//刪除功能语句Stringsql2="insertintooa_roles_menusvalues(?,?)";//插入菜单语句Stringsql4="insertintooa_roles_funsvalues(?,?)";//插入功能语句 stat=conn.prepareStatement(sql1);//刪除菜单关联stat.setInt(1,role.getRole_id());//插入刪除值stat2=conn.prepareStatement(sql3);//刪除功能关联stat2.setInt(1,role.getRole_id());//插入刪除值stat.execute();stat2.execute();stat3=conn.prepareStatement(sql2);//批量插入菜单对应关联 参考文献[1].孙卫琴.Java网络编程精解[M].–北京:电子工业出版社,2007.3[2].林胜利.连旦晖Java开发经典模式与实例[M].–北京:中国铁道出版社,2007.1[3].张洪伟.TomcatWeb开发整合应用[M].清华大学出版社,2006.3.[4]闫静,钟斌.DreamweaverMX2004与ASP动态网页基础与范例[M].北京:机械工业出版社,2004.1-280.[5]邱旭东,刘文浩.基于JSP的MVC开发模式研究及应用[J].中国科技术信息2006[6]汪孝宜等.JSP数据库开发实例精粹[M].电子工业出版社2005[7]孙卫琴.精通Struts:基于MVC的JavaWeb设计与开发[M].电子工业出版社2004[8]屈文军,孙林夫,赵慧娟,屈喜龙.ASP服务平台身份认证技术研究[J].计算机应用研究,2006(5).[9]刘丽平,王文杰.基于Web的自适应性智能试题库的设计[J].计算机系统应用,2006(4).[9]刘明,蒋朝慧,李燕华.基于J2EE标准ASP服务平台的实现[J].计算机应用与软件,2006(4).[10]RusselWinderGrahamRoberts著.Java软件开发[M].人民邮电出版社2004[11]GaryBollinger,BharathiNatarajan著.JSP程序设计指南[M].清华大学出版社2002附录《TheArtofTrade-offs》HowdoyouDevelopSoftware?Thereseemstobeacommonmisunderstandingamongnetizenswhocreatesoftwareforaliving.Therearethosewhoproclaimloudlythatonemustmodelthewholeworldbeforecommittingtocodeandthatthosewhojumpintocodeearlyaremerely``code-like-hell''hackers.Thenthere'sthecrowdthatsays,Hey,waitaminute.Youcan'tlearnenoughfromasimplemodelupfront.Youhavetoexplorewithcodeofsometype.Otherwise,youcouldveryeasilymissimportantdetails,orevencreateamodelthatcan'tbebuilt!TheOneTrueAnswerSowhichcampiscorrect?Thosewhopreferhackingaroundincode,orthethosewhoinsistonfullymodelingtheirperceptionoftheworldbeforeeventhinkingaboutcode?Well,inaway,theyarebothright.Atleast,theyaretryingtosolvethesameproblemgainingsufficientknowledgetocorrectlyimplementasystem.See,asoftwareprojectisunlikeprojectsinotherengineeringdisciplines.Softwareprojectsareinherentlyprojectsofdiscovery.Youandyourteamwilllearnmoreastimegoesby.Yourknowledgeofthecustomer,theapplication,theenvironment,thesponsoryouwillcometoknowmuchmoreabouteachofthesetopicsasyougoalong.Andyoumustbepreparedtoactonthatnew-foundknowledge.Theerroroftheclassicwaterfallapproachisthatthereisn'tanyfeedback.Discoveriesmadeatthelowerlevelsofcodinghavenowaytoaffectrequirementsorarchitectureinawaterfallmodel.Yettheselowerleveldetailscanoftenhaveprofoundeffectsonyourunderstandingofthehigherlevels!MitigateRiskMitigationofriskisattheheartoftraditionalengineering.Whenyoubuildabridge,youdon'tbuilditasaperfectstructurethatwillnevercollapse.Insteadyoubuildittowithstand500yearwinds,200yearfloods,300%expectedmaximumload,etc.Ifyoudidn'tmakethesedesigntrade-offs,everybridgewouldbesolidconcretefromthedecktotheground,andwouldbesomethinglike500feetwide.Engineeringisallaboutmakingthesecompromises,andsoissoftwareengineering.Thedifferenceisthatwithsoftwareengineering,muchoftheriskisintheprocessofbuildingit,aswellasinthefinishedstructure,duetothenatureofdiscovery.Knowingthatyouwillcontinuetomakediscoveriesasyouproceed,itcomesdowntothefactthatyouwanttominimizetheriskofdiscoveringsomethingthatinvalidatestoomuchofyourexistingwork.Thosewhojumprightintohackingoutproductioncodearealreadyintroublebeforetheybegin:largechangesindirection(broughtaboutbyincreasedknowledge)arehardesttochangehere,andarethemostexpensive.Thosewhoproposemodelingfullybeforedoinganyimplementationrunthesameriskofmakingimportantdiscoverieswhilecreatingproductioncode.Themodel,beinganabstractversionofreality,mustforfeitsomedetails.Andthedevilmaywellbelurkinginthosedetails.Thentherearethosewhotrytobalancethesetwoextremes,bymodelingalittle,andcodingalittle,orbymodelingwithadisposableprototypeortracer-bulletcode.ManyoftheUsenetdiscussionsofthistopicseemtoboggeddowninthedetailshereofbreadth-firstversusdepth-first;whendoyoumodelandwhendoyoucode,andsoon.Differentmethodswillsuggestdifferentwaysofattackingthisproblem.MethodsRUseXtremeProgrammingisbasedonthepremiseofmitigatingrisk,andinaway,soarealltheotherpopulardesignmethodsofthedaywhethertheyadmittoitornot.Publishedmethodsattempttoanswerthequestion``HowdoIandmyteamgainthemostknowledgeabouttheproblemandsolutiondomaininthemosteconomicalwaypossibleinordertocreateasoftwaresystem?''Clearly,riskisinherentinthediscoveryprocessofaproject.Butthatdiscoveryisongoing,andwecan'taffordtomakecrucialdiscoverieslateinthegame.Ideally,wewanttodiscovereverythingwe'llneedtoknowup-frontandunderstanditperfectly.Itwillneverhappenthatway,ofcourse,soeverymethodtriestocreateanenvironmentwhereyoucanmaketheimportantdiscoveriesasearlyaspossible.ThegoldenAnswerofaparticularmethodisbasedonhowtoloweryourriskofmakingcrucial,latediscoveries.Butthoseanswerswillbedifferentforeveryone.Theanswerdependsonyourteam,yourproject,yourexperience,yourproblemdomain,yourworkenvironment,etc.Onceyouhavefoundamethodthatworkswellforoneproject,thereisnoguaranteethatitwillworkwellonthenext.Ifanyoftheselistedfactorschange,yourprocesswilllikelyneedrevising.Itain'tPerfectYousee,unlikethepristinebeautyofanalgorithmorsequenceoftightly-codedmachineinstructions,itain'tperfect.Processesandmethodsdependonpeopletocarrythemoutandtounderstandthematerialbeingexamined.Andpeoplearefallible.Sointheend,itcomesbackaroundtotheideaofmanagingtrade-offs.Youcouldspendsixmonthsonaprojectdiddlingaroundwithanobjectmodel,onlytodiscoverthatyoumisunderstoodthecustomer'sperformancerequirementsduringimplementation.Youcouldjumpintoimplementationtooearly,andlockyourselfintoadesignorarchitecturethatwon'tsupportimportantrequirementsthatyouhaven'tgottentoyet.Oryoucanweighthetrade-offstominimizeoverallrisk,andanalyzealittle,designalittle,andcodealittle.Therelativeproportionofeachtask,theorder,theamountoffeedbackallofthesewillbedifferentforeachproject,andeachpractitioner.Therearenorightanswersthatarecorrectallthetime,inallcontexts.Oncemustbepragmatic,andmakethechoicethatfitsthecurrentproblem,thecurrentteam,thecurrentenvironment,andsoon.Sonexttimeyouenterintoadiscussionofcomputerasanengineeringexerciseversusanart,considertheartoftrade-offs.Otherdisciplinesmustlivewithtrade-offsconcerningthephysicalworld;wemustlivewithtrade-offsconcerningourselves.Andthenwecanproceedtodevelopsoftware.文献翻译你是怎样开发软件的?在那些以编写软件为生的人们之间有一个常见的争执。有些人坚持认为在编写代码前必须先要有一个完整的模型,那些过早进行编码的人只不过是一些“在地狱中编码”的hacker。然后,就会有另外一群人说,嗨!等一下。你无法从一个简单的预先模型中学到足够的知识。你必须得编写某些形式的代码。否则,你很可能会遗漏掉一些重要细节,甚至创建出一个无法构建的模型。正确答案那么哪一方正确呢?是整天侵淫在代码之中的那一方呢?还是坚持在思考代码前必须先完整地建立对世界感知的模型那一方呢?嗯,他们在某种程度上都是正确的。至少,他们在试图解决同样的问题--获取正确实现一个系统的足够知识。请注意,软件项目和其他工程学科中的项目不同。软件项目在本质上是以发现为中心的项目。随着时间的过去,你和你的团队会学到更多的知识。你对客户、应用、环境以及发起者的认识也会随着项目的进展而增加。你必须得做好适应新发现的知识的准备。典型的瀑布方法的错误就在于根本没有任何反馈。在瀑布模型中,低层编码中的任何发现根本无法影响到需求和架构。然而,这些低层细节对于理解更高层的东西来说常常具有深远的影响。降低风险降低风险是传统工程的核心。当建造一座桥梁时,你不会考虑把它建造成一座永远不会倒塌的完美桥梁。相反,你只会考虑它能经受500年的风吹、200年的水淹、最大3倍于所期望的承重,等等。如果不做这些设计权衡,那么所有的桥梁都将是从桥面到地面的实心混凝土,都将有500英尺宽。工程的全部就是做这些折中,软件工程也是如此。软件工程的困难在于:大部分的风险都存在于构建它的过程以及所完成的结构之中。原因就是其发现的本质。知道了要在前进中不断地进行发现,那么问题的核心就在于要使所发现的东西使你已完成工作失效的风险最小化。那些直接去拼凑产品代码的人在开始之前就已经陷入麻烦之中:(由增加的知识所导致的)方向上大的变化此时更改起来最为困难,也最为昂贵。那些建议在做任何实现之前要先建立完整模型的人,同样也冒着在创建产品代码期间会出现重要发现的风险。作为现实抽象版本的模型,必然会失去一些细节。而恶魔很可能就潜伏在这些细节之中。于是,就有一些人试图在这两个极端之间进行平衡,他们建立一点模型,就进行一些编码,他们使用一次性的原型或者代码曳光弹进行建模。Usenet中许多关于这个主题的讨论都集中在是宽度优先还是深度优先;何时建模以及何时编码等细节之上。针对这个问题,不同的方法会给出不同的建议。方法就是我们自己极限编程是基于降低风险的前提之上,当今所有其他流行设计方法在某种程度上亦是如此――不管它们是否承认这一点。已公开的方法都在试图回答下面问题:“为了创建一个软件系统,我和我的团队如何才能以最为经济的方法获取最多的问题领域和解决方案领域知识。”很明显,风险固有地存在于项目的发现过程之中。然而,该发现是一直在进行的,我们无法承受游戏后期的重大发现。在理想情况下,我们希望能够预先发现我们希望知道的一切,并且完全理解它们。现实肯定不会是这样的,所以每个方法都试图创建出一个环境,在其中你能够尽可能早地做出最重要的发现。一个特定方法最有价值之处就在于它是如何降低在晚期出现的关键发现的风险的。不过,这些答案对每个人来说都是不同的。答案和你的团队、项目、经验、问题领域、工作环境等相关。如果你曾经发现一个方法很适合于一个项目,谁也无法保证它会适合于下一个项目。如果所列出的这些因素中的任何一个发生变化,很可能就要对过程进行修订。它并不完美你已经看到,和算法或者坚固的机器指令序列的质朴之美不同,它并不完美。过程和方法依赖于人去维持它们,去理解将被检查的要素。而人是很容易犯错误的。所以在最后,我们再回到对管理权衡的想法。你可以在一个项目的对象模型上浪费6个月的时间,结果在实现期间却发现你错误的理解了客户的性能需求。你可以很早就开始实现,把自己锁定在一个无法支持一些你还不知道的重要需求的设计和架构上。或者,你可以对权衡进行评估以最小化总的风险,接着分析一点、设计一点、编码一点。每个任务所占的相对比例、顺序、反馈的数量――所有这些对每个项目、每个实践者都是不同的。不存在在任何时间、任何场合都正确的答案。所以,一定要注重实效,作出最适合当前问题、当前团队、当前环境的选择。所以,当你下次进行计算机是工程实践还是艺术的讨论时,请考虑一下权衡的艺术。其他的工程学科必须要建立在和物理世界有关的权衡之上;我们必须要面对和我们自己相关的权衡。然后我们就可以开始开发软件了。基于C8051F单片机直流电动机反馈控制系统的设计与研究基于单片机的嵌入式Web服务器的研究MOTOROLA单片机MC68HC(8)05PV8/A内嵌EEPROM的工艺和制程方法及对良率的影响研究基于模糊控制的电阻钎焊单片机温度控制系统的研制基于MCS-51系列单片机的通用控制模块的研究基于单片机实现的供暖系统最佳启停自校正(STR)调节器单片机控制的二级倒立摆系统的研究基于增强型51系列单片机的TCP/IP协议栈的实现基于单片机的蓄电池自动监测系统基于32位嵌入式单片机系统的图像采集与处理技术的研究基于单片机的作物营养诊断专家系统的研究基于单片机的交流伺服电机运动控制系统研究与开发基于单片机的泵管内壁硬度测试仪的研制基于单片机的自动找平控制系统研究基于C8051F040单片机的嵌入式系统开发基于单片机的液压动力系统状态监测仪开发模糊Smith智能控制方法的研究及其单片机实现一种基于单片机的轴快流CO〈,2〉激光器的手持控制面板的研制基于双单片机冲床数控系统的研究基于CYGNAL单片机的在线间歇式浊度仪的研制基于单片机的喷油泵试验台控制器的研制基于单片机的软起动器的研究和设计基于单片机控制的高速快走丝电火花线切割机床短循环走丝方式研究基于单片机的机电产品控制系统开发基于PIC单片机的智能手机充电器基于单片机的实时内核设计及其应用研究基于单片机的远程抄表系统的设计与研究基于单片机的烟气二氧化硫浓度检测仪的研制基于微型光谱仪的单片机系统单片机系统软件构件开发的技术研究基于单片机的液体点滴速度自动检测仪的研制基于单片机系统的多功能温度测量仪的研制基于PIC单片机的电能采集终端的设计和应用基于单片机的光纤光栅解调仪的研制气压式线性摩擦焊机单片机控制系统的研制基于单片机的数字磁通门传感器基于单片机的旋转变压器-数字转换器的研究基于单片机的光纤Bragg光栅解调系统的研究单片机控制的便携式多功能乳腺治疗仪的研制基于C8051F020单片机的多生理信号检测仪基于单片机的电机运动控制系统设计Pico专用单片机核的可测性设计研究基于MCS-51单片机的热量计基于双单片机的智能遥测微型气象站MCS-51单片机构建机器人的实践研究基于单片机的轮轨力检测基于单片机的GPS定位仪的研究与实现基于单片机的电液伺服控制系统用于单片机系统的MMC卡文件系统研制基于单片机的时控和计数系统性能优化的研究基于单片机和CPLD的粗光栅位移测量系统研究单片机控制的后备式方波UPS提升高职学生单片机应用能力的探究基于单片机控制的自动低频减载装置研究基于单片机控制的水下焊接电源的研究基于单片机的多通道数据采集系统基于uPSD3234单片机的氚表面污染测量仪的研制基于单片机的红外测油仪的研究96系列单片机仿真器研究与设计基于单片机的单晶金刚石刀具刃磨设备的数控改造基于单片机的温度智能控制系统的设计与实现基于MSP430单片机的电梯门机控制器的研制基于单片机的气体测漏仪的研究基于三菱M16C/6N系列单片机的CAN/USB协议转换器基于单片机和DSP的变压器油色谱在线监测技术研究基于单片机的膛壁温度报警系统设计基于AVR单片机的低压无功补偿控制器的设计基于单片机船舶电力推进电机监测系统基于单片机网络的振动信号的采集系统基于单片机的大容量数据存储技术的应用研究基于单片机的叠图机研究与教学方法实践基于单片机嵌入式Web服务器技术的研究及实现基于AT89S52单片机的通用数据采集系统基于单片机的多道脉冲幅度分析仪研究机器人旋转电弧传感角焊缝跟踪单片机控制系统HYPERLINK"/detail.htm?353

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论