面向对象软件设计川大智胜仿真模拟部莫世锋主要内容►软件之美►软件设计►软件设计表示法►面向对象设计过程►面向对象设计的基本原则►面向对象设计的战术方法:设计模式►结束语►讨论:三维音效引擎设计►参考文献小测试►你在哪个层次?第一层是不管什么OO,直接编码,把功能实现了项目就是成功;第二层是理解了几个曲向对象的典型概念——封装,继承,模式。囫囵吞枣,不管实际效率如何就开始应用,为OO而OO;第三层是在设计阶段按出一副OOAD的架于,进入编码实现就逐步把OO放到了一边,OO与实践分离。第四层是基本举握OO理论,在具体应用中能大量使用OO技术来进行系统分析和程序设计;第五层是化OO思想融会贯通,不管用不用oo技术,都能选探最佳设计和实现方池。软件之美►工程是科学也是艺术。新型结构的设计概念涉及到想象的巨大飞跃以及各种经验和知识的综合,这与任何一个艺术家需要表现到他的画布和画纸上的内容是一样的。而且一旦这项设计被工程师以艺术家的身份清楚地表达出来,那么它必须被工程师以科学家的身份进行分析,并在分析过程中采取一种严谨的态度,就像任何一个科学家对待科学方法应采取的严谨态度一样。►软件开发应该是集科学家、工程师和艺术家三者素养于一身的一种职业。软件之美►通过软件,我们可以体现创新和价值,同时也可以创造出美(R.C.Martin)。在于它的功能:通过直观、简单的界面呈现出恰当的特性;在于它的内部结构:被简单、直观地分割,并具有最小内部耦合的内部结构;还在于团队创建它的过程:每周都会取得重大进展,并生产出无缺陷代码的、具有活力的团队。►软件可能是丑陋的,难以使用、不可靠并且是粗制滥造的。混乱、粗糙的内部结构使得对它们的更改既昂贵又困难;通过笨拙的、难以使用的界面展现其特性;易崩溃且行为不当。►糟糕的是,作为一种职业,软件开发人员所创造的美的东西往往少于丑的东西。软件之美►最好的软件开发人员都知道一个秘密:美的东西比丑的东西创建起来更廉价,也更快捷。构建、维护一个美的软件系统所花费的时间、金钱都要少于丑的系统;美的系统是灵活、易于理解的,构建、维护它们是一种快乐。丑陋的系统是不实用的,丑陋会降低开发速度,使软件昂贵而又脆弱。构建、维护美的系统所花费的代价最少,交付起来也最快。软件设计►软件开发中永远不会消失的部分是概念结构的建立,而表达它们的劳动则是可以消失的部分。►什么是设计?包含了用来解决某个问题而遵循的方法,提供了从需求到实现的路径和蓝图。建立模型非常重要,设计中的每个模型都描述了考虑中的系统中的一个特定方面,由此可对设计进行交流和评估。模型本身仅是设计的表示方式,代码也是设计的表示方式(敏捷开发)►为何要设计?小软件(狗窝):即使不用任何设计方法,大多数程序员也可实现一个满足需求、足够健壮的软件。大规模软件(高楼大厦):►每个软件模块都有三个职责:完成功能、应对变化、便于沟通。►需要对系统进行分解,除了功能、性能显式要求外,还需要考虑可扩展性、复用性等隐性需求,应对可能的变化,保证质量;►软件之美,涉及所有Stakeholder的利益,用户、老板、自己、协作者、维护人员等等。开发团队面临的人员配备问题:划分架构师、子系统设计、程序员等不同角色同时也为没有经验的人员提供了一条职业途径。►没有魔法,也没有“银弹”可以引导软件工程师从复杂软件系统的需求正确无误地到达它的实现,复杂系统的设计是一个递增和迭代的过程。►一般来说,复杂系统是由稳定的中间格式演化而来的。软件设计►结构化设计功能分解与逐层迭代思想的最好体现,在不同层次级别上,把系统划分为多个功能模块,并确保模块之间的耦合度最小。对现实世界的简单抽象,按照功能特性,以函数为单位对系统进行分解。难以有效应对复用性和可扩展性要求,规模100,000行以下。►面向对象OOD是一种解决软件问题的设计范式(paradigm),一种抽象的范式。使用OOD这种设计范式,我们可以用对象(object)来表现问题领域的实体,每个对象都有相应的状态和行为,直观地体现了现实世界中物体是状态和行为的复合体。抽象可以分成很多层次,从非常概括的到非常特殊的都有,而对象可能处于任何一个抽象层次上。另外,彼此不同但又互有关联的对象可以共同构成抽象:只要这些对象之间有相似性,就可以把它们当成同一类的对象来处理。►比较结构化方法是对世界的简单抽象,注重算法和数据:算法+数据结构=程序面向对象是对世界更为贴切、接近的抽象,注重对象及其相互关系,更便于复用和扩展;无论什么方法,只要满足项目需求,适合项目特点,就是最好的设计方法。学习能力,知识、经验积累以及在两难境地的果断决策才是确保软件质量的关键。设计过程►面向对象设计过程Stroustrup:“OOD就是“根据需求决定所需的类、类的操作以及类之间关联的过程”。面向对象设计:以此前得到的分析模型作为输入,把分析模型转化成如何解决问题的系统模型,得出完整的设计方案。微观过程,即不是严格的自顶向下,也不是严格的自底向上,而是迭代和增量的。迭代过程中,需要不断对体系结构细化,并将以往的经验和结果用于下一阶段;增量过程中,不断精化,最后发展成一个满足实际需求的设计。识别类和对象识别类和对象的语义识别类和对象间的关系说明类和对象接口及其实现设计表示法►具有一个明确定义且有表达力的表示法对于软件开发十分重要,但做一个图表的活动并不构成分析或设计。►统一建模语言UML。Rational统一了Booch、Rumbaugh、Jacbson三大建模流派,形成了UML,并为OMG接纳为标准建模语言,支持不同抽象层次的面向对象的建模。►UML是一种建模语言,而不是一种建模方法。它只给出了表示设计的符号,并未对建模过程加以限定。设计表示法►组成UML有三种基本的建筑块:事物(Things):►结构事物(Structuralthings):接口、类、节点►动作事物(Behavioralthings):活动、状态►分组事物(Groupingthings):包►注释事物(Annotationalthings):注释关系(Relationships)。设计表示法►UML9种图:类图(Classdiagram)对象图(Objectdiagram)组件图(Compomnentdiagram)部署图(Deploymentdiagram)用例图(Usecasediagram)时序图(Sequencediagram)协作图(Collaborationdiagram)状态图(Statechartdiagram)活动图(Activitydiagram)设计表示法VerifyCustomerCheckOrderProcessOrderShipProduct用户PlaceOrderRegisterOrderSystemProcessOrderSystemShippingCompanySubmitOrderTakeOrderVerifyCustomerVerifyStockProcessOrderShipProductRegisterOrder用户OrderRegistrationOrderProcessingCRMERPShippingSubmitOrderTakeOrderVerifyCustomerVerifyStockProcessOrderShipProductRegisterOrderCreateOrderSTARTCorporateOrder?CheckCustomerAccountCheckStockProcessCorporateOrderProcessOrderShipUSPostalGroundConfirmOrderENDOvernightDelivery?ShipFedExOvernightReceptionistStockResponsibleOrderingemployeeSimulationReadme.txt0..*1..10..10..*1..10..*Customer----idnameemailphone:int:java.lang.String:java.lang.String:java.lang.StringOrder--orderIDorderDate:int:java.util.DateProduct---idnameprice:int:java.lang.String:doubleorderItem--idquantity:int:int设计评价标准►设计的评价标准满足功能和性能要求复用性:软件系统的架构、模块、函数或过程、类、组件等单元能否很容易地被本项目的其他部分或其他项目复用。可扩展性:软件面对变化的需求时,进行功能或性能扩展的难易程度。任何系统在其生命周期中都会发生变化。如果我们期望开发出的系统不会在第1版后就被抛弃,就必须牢牢地记住这一点。可维护性:可维护性:软件维护(上要指软件错误的修改、遗漏功能的添加等)的难易程度。设计评价标准►设计的评价标准更具体的衡量标准:内聚度、耦合度内聚度:表示一个模块、类以函数所承担职责的自相关程度。如果—个模块只负责一件事情,就说明这个模块有很高的内聚度;如果如果个模块负责了很多毫不相关的事情,则说明这个模块的内聚度根低。内聚度向的模块通常根容易理解,很容易被复用、扩展和维护。有一个简单的方法可以粗略地判断系统单元的内聚度:函数可用简单的“动词十名同“的形式;类用一个准确的名词。耦合度:表示模块和模块之间、类和类之间、两数和函数之间关系的亲密程度。耦合度越高,软件单元间的依赖性也就越强,软件的可维护性、可扩展性和可复用性就会相应地降低。结构化程序设计语言中,如果两个函数访问了问一个全局变量,它们之间就具有了非常强的耦合度;如果它们都没有访问全局变量,它们彼此的耦合度就由二者互相调用时传递的信息量来决定。函数调用时,函数参数包含的信息越多,函数和函数之间的耦合度就较大。在面向对象的积序设计语言中,类与类之间的耦合度由它们为了完成自己的职责顺必须相互发送的消息及消息的参数来决定。“高内聚、低耦合”是所有优秀软件的共同特征。设计评价标准►拙劣设计的症状:整个软件的臭味僵化性:设计难以改变;脆弱性:设计易于遭到破坏;牢固性:设计难以重用;粘滞性:难以做正确的事;不必要的复杂性:过分设计;不必要的重复:拷贝、粘贴;晦涩性:混乱的表达。基本原则►开—闭原则(Open-ClosedPrinciple,OCP)软件模块对扩展应是开放的。模块的功能和行为可扩展和变化,以应对需求的变化。对修改应是封闭的。对模块的功能和行为扩展时,不必改动模块已有的结构和代码。关键是抽象。创建出固定却能够描述一组任意个可能行为的抽象体,这个抽象体就是接口或抽象类,而一组任意个可能的行为则表现为可能的派生类。无论模块多么的“封闭”,都会存在一些无法对之封闭的变化,因此设计人员必须对于设计的模块应该应对哪种变化封闭做出选择。对每个部分肆意地进行抽象不是一个好主意,拒绝不成熟的抽象和抽象本身一样重要。估计出最有可能发生的变化,然后构造抽象来隔离变化。OCP是OOD中的核心,如果这个原则应用得有效,软件就会具有更多的可维护性、可复用性和健壮性。基本原则►开闭原则:主要机制是抽象和多态!ClientServerClient《interface》ServerInterfaceServer既不开放又不封闭STRATEGY模式:既开放又封闭Policy+PolicyFunction()-ServiceFunction()Implementation-ServiceFunction()TemplateMethod模式:既开放又封闭面向接口而非实现编程。基本原则►开闭原则结构化方法:Enumshapetype{circle,square};Structcircle{…};Structsquare{…};VoidDrawAllShapes(Shape*l