第四章 设计准则1-正确性和健壮性_第1页
第四章 设计准则1-正确性和健壮性_第2页
第四章 设计准则1-正确性和健壮性_第3页
第四章 设计准则1-正确性和健壮性_第4页
第四章 设计准则1-正确性和健壮性_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

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

文档简介

设计准则I

正确性和健壮性正确性和充分性正确性:每个项目都要满足指定的需求,然后一起满足所有应用程序的需求问题越明确,就能提供越精确的设计来解决问题设计的正确性通常是指充分性实现正确性的正规方法是依靠数学逻辑实现正确性的途径非正式方法:判断设计是否满足所需的功能正式方法:包含了用数学逻辑的方法来分析变量变化的方向设计进入详细设计阶段时,经常采用正式方法来判断正确性实现正确性的途径非正式方法:判断设计是否满足所需的功能正式方法:包含了用数学逻辑的方法来分析变量变化的方向设计进入详细设计阶段时,经常采用正式方法来判断正确性实现正确性的非正式方法要求我们在宣布设计正确之前必须完全理解它设计和实现必须具有可读性由于人类大脑在处理复杂问题方面有局限性,所以要进行模块化的设计,即将设计分成独立的可理解的部分。不断进行简化和模块化,直到设计使人信服充分设计的术语和理论基础一个足以实现需求的设计一个正确的设计有时称为

…设计必须完全可理解接下来

…设计非常模块化达到这个目标的常用方法是

…最小目标实现正确性的正式方法常常基于在严密的控制下跟踪变量的变化,一般会指定一个不变式不变式在变量值之间表示的是一种不变关系用在类级别设计中的不变式称为类不变式 --包含变量mileage,VehicleID, value,originalPrice,和type:

mileage>0mileage<1000000vehicleID

至少有

8个字符value>=-300

($300是一辆报废汽车的处理价格)originalPrice

>=0(type==“REGULAR”&&value<=originalPrice

)||(type==“VINTAGE”&&value>=originalPrice

)Automobile类的不变式实现正确性的正式方法Automobile类的方法要考虑这些不变式,因此将变量设为私有,并且只能通过公有的存取(accessor)方法才能改变他们的值。可以对存取方法进行编码来保持不变式。在Automobile类中使用“setter”方法来设置类不变式Automobile的一个客户的main()方法模块接口由于模块化是获得设计正确性的方法,所以我们首先要理解客户代码是如何使用模块的。模块可以是类或类的包接口是函数形式(或原型)的集合,让设计更易于理解模块的接口定义了它的用途类的接口当一个类支持的方法有很多种时,将这些方法成组放置到几个接口中是很有好处的,可以重用接口。例在一个运输业的应用程序中的类Shipment。ShipmentsetVehicle()perishable()getWidth()printRoute()describeType()getLength()getDuration()setType()ShipmentsetVehicle()perishable()getWidth()printRoute()describeType()getLength()getDuration()setType()ShipmentDimensionsgetWidth()getLength()getWeight()TransportationMeansgetDuration()setVehicle()printRoute()GoodsTypedescribeType()setType()perishable()ShipmentDimensionsTransportationMeansGoodsType原始形式使用接口的形式包的接口包的接口与类的接口不同,包不能被实例化通过包来使用接口的一种方法是利用包中类的指定对象来提供相应的接口。包的接口PricingpurchasesFurnitureClothingApplianceSelectionClothingTryout«singleton»PurchasesIFParticipant-servicesConversation-services包的接口的示例ConversationchatServerchatClientDisplayConversationManagerClientCommServerCommbillingAccountingBillFinancialMessage-Reception模块化为了模块化特定的应用程序,在高层需要创建包,在底层需要创建类选择类设计中用到两种类:领域类:属于设计中的特有类,如一个模拟银行的应用程序的领域类可能包括BankCustomer类、BankTransation类和Teller类,但不包括File类和Database类。非领域类:不是程序特有的,如Customer类和Transaction类。通常从领域类开始类的选择,然后增加非领域类来满足设计目标非领域类通常用于概括领域类领域类VS非领域类领域类:应用程序特有的类例如:BankCustomer,BankTransaction,Teller

通常是非GUI类足以分类所有的需求非领域类:一般类例如:抽象类,实用类源于设计和实现的考虑选择包选择包是选定应用程序体系结构时必须进行的一步,任务是将应用程序分组,通常为3~10个包,然后这些包能用同样方法进一步分解。可供选择的模块化方式mechanicspositiongroundcontrolonBoardNavigationcontroltrajectoryweather跟踪运送卫星进入预定轨道的运载火箭轨迹的应用程序选择1选择2AdaptedfromSoftwareDesign:FromProgrammingtoArchitecturebyEricJ.Braude(Wiley2003),withpermission.为正确性和充分性而重整极限编程(extremeprogramming)是首先为给定的需求进行设计,然后在额外的需求变得透明时对设计和实现进行修改,这个过程称为重整(refactoring)。重整:为类提升一个原始属性为了适应范围的增长,常常需要引入一个新类来进行重整。如,假设已经有一个包含整形变量mileage的类Automobile:classAutomobile{Mileagemileage;...….}重整:为类提升一个原始属性对于一个使用过的汽车,提出的额外要求也许说明了已使用的汽车上的“mileage”根本不是一个简单的变量。如,引擎也许有另一种表示方式,那么底盘的英里数和引擎的就不同。假设应用程序要考虑被欺骗的可能性,那么报告的“mileage”就要根据汽车是否曾被偷过这样的其他属性来修改。因此,要考虑“将mileage提升为一个类”这样的重整。重整:为类提升一个原始属性ClassMileage{intnominalMileageValue=0;intchassisMileageValue=0;intengineMileageValue=0;

……publicintcomputeEffectiveMileage(){…}}ClassAutomobile{Mileagemileage;

……}重整:引入抽象基类或接口当应用程序包含几个具有广泛通用性的类时。如Gymnast(体操运动员)、Runner、FootballPlayer类:抽象类就是Athlete(运动员)Java抽象类几乎可以包含类的所有特性,只有不能创建类的对象重整:引入抽象基类或接口AbstractclassMyAbstractClass{}ClassAnotherClass{MyAbstractClassm=newMyAbstractClass();}不能编译,因为试图建立一个抽象类的对象重整:引入抽象基类或接口AbstractclassMyAbstractClass{}ClassAnotherClass{MyAbstractClassm;

……m=getObjectOfMyAbstractClass();//returnsobj.ofnon-abstractsubclassm=newConcreteSubclassOfMyAbstractClass();}通常使用“concrete”(具体)来强调不是抽象类可以编译健壮性错误的原因防止错误输入用户输入不是用户的输入数据通信其他应用程序的方法调用防止开发错误错误的设计错误的实现检查输入(保证环境健壮性)在继续进行处理之前,可以检查应用程序的所有输入的方法。检查类型检查与前置条件和不变式不符的输入为提高健壮性而初始化初始化变量是很好的练习:intI=0;因为带着未初始化的变量执行一个程序所受的损失比先初始化变量要大得多。当应用程序的不良性能变得明显时,初始化版本的程序可能产生更多有价值的信息。提高健壮性的参数传递技术如intcomputeArea(intaLength,intaBreadth){…}如果可行,捕获在类中的参数约束intcomputeArea(RectangleDimensionaRectangleDimension)在方法注释中说明所有的参数约束aLength>0andaBreadth>0andaLength>=aBreadth提高健壮性的参数传递技术调用者遵循参数的显示要求问题是方法的设计者没有控制调用者在方法代码内首先检查约束If(aLength<=0)…如果预计这种情况将会出现,则抛出异常否则,如果可能就中止程序否则,如果返回的默认值在上下文间有意义,就将其返回,并且产生警告或日志检查参数值是否违反约束的方法如果清楚地指定了参数约束,那么不用检查一些假设的状态,并且也没有可靠的方法来弥补原本不应出现的方法调用错误安全的态度(fail-safeattitude),检查所有约束都得到满足。在类中捕获参数在类中包装参数,而不是按原始形式使用它们ReplaceintcomputeArea(intaLength,intaBreadth) {..}with intcomputeArea(RectangleaRectangle) {..}--whereclassRectangle {… Rectangle(intaLength,intaBreadth) { if(aLength>0)this.length=aLength; else….. } …} 包装参数只在一个地方——Rectangl

温馨提示

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

评论

0/150

提交评论