教学课件-软件工程_第1页
教学课件-软件工程_第2页
教学课件-软件工程_第3页
教学课件-软件工程_第4页
教学课件-软件工程_第5页
已阅读5页,还剩934页未读 继续免费阅读

下载本文档

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

文档简介

第十章

更多设计模式

现代软件工程西安邮电学院计算机系舒新峰shuxf@1.迭代2的需求和重点2.更多设计模式3.GOF设计模式参考资料:(1)UML和模式应用,CraigLarman著,第三版,机械工业出版社(2)/oobject/OObject.aspChap10设计与代码映射西安邮电学院计算机系舒新峰shuxf@10.1迭代2的重点基本对象设计使用模式来创建稳健的设计应用UML使模型可视化makeCreditPayment(credNum,expiryDate)reply:=requestApproval(request)postReceivable(receivable)«actor»:CreditAuthorizationService«actor»:AccountsenterItem(itemID,quantity):NextGenPOSSystem:CashierendSale()ProcessSalePaybyCreditScenariodescription,totaltotalwithtaxes*[moreitems]makeNewSale()«actor»:TaxCalculatortaxLineItems:=getTaxes(sale)postSale(sale)西安邮电学院计算机系舒新峰shuxf@10.1从迭代1到迭代2在迭代1所有软件都已经被充分地测试客户定期地参与对已完成部分的评估已经对系统(这里的系统也包括所有子系统)进行了完整的集成和固化,使其成为基线化的内部版本西安邮电学院计算机系舒新峰shuxf@1.3迭代2需求NextGenPOS支持第三方外部服务的变化,例如,能够与不同的税金计算器相连接复杂的定价规则,可更换的业务规则需要进行设计,使得在销售总额变化时刷新GUI窗口西安邮电学院计算机系舒新峰shuxf@由于这些需求,我们要在迭代2中对处理销售用例进行修订,但是实现了更多场景对面向分析的对象的修改在此轮迭代中也是需要的Use-CasesSSDsDomainModel西安邮电学院计算机系舒新峰shuxf@10.2更多设计模式已经学习的模式包括:信息专家;创建者;高内聚;低耦合;控制器还需要学习的模式:多态(Polymorphism)间接性(Indirection)纯虚构(PureFabrication)防止变异(ProtectedVariation)……西安邮电学院计算机系舒新峰shuxf@10.2.1多态(Polymorphism)问题如何处理基于类型的选择?“If-then-else”;“select-case”如何创建可插拔的软件构件?解决方案当相关选择或行为随类型(类)有所不同时,使用多态为变化的行为类型分配职责西安邮电学院计算机系舒新峰shuxf@例子支持多种外部的第三方税金计算器它们具有不同技术实现的不同的TCPsocketSOAPinterfaceJavaRMIinterfaceTaxMasterAdaptergetTaxes(Sale):ListofTaxLineItemsGoodAsGoldTaxProAdaptergetTaxes(Sale):ListofTaxLineItems<<interface>>ITaxCalculatorAdaptergetTaxes(Sale):ListofTaxLineItemsByPolymorphism,multipletaxcalculatoradaptershavetheirownsimilar,butvaryingbehaviorforadaptingtodifferentexternaltaxcalculators.<???>Adapter......西安邮电学院计算机系舒新峰shuxf@UMLNotationGoodAsGoldTaxProAdaptergetTaxes(Sale):ListofTaxLineItems<<interface>>ITaxCalculatorAdaptergetTaxes(Sale):ListofTaxLineItemsINTERFACENOTATIONINTERFACENOTATIONInterfaceimplementationisillustratedwithadashedlineandalargeunfilledarrowpointingtotheinterfacefromtheimplementingclass.the<<interface>>elementinguillemetsiscalledaUMLstereotypeReturnorparametertypesthatrepresentacollectioncanbespecifiedinanysyntax,butthisisthegenerallyacceptedcommonUMLstyle.西安邮电学院计算机系舒新峰shuxf@10.2.1多态cont.禁忌不要为那些假想中的变化添加太多的多态优点易于增加新变化所需的扩展无需影响客户便能够引入新的实现西安邮电学院计算机系舒新峰shuxf@10.2.2纯虚构(PureFabrication)问题面向对象设计依据真实世界中的概念来表示软件类但是软件并非真实的世界我们需要通过领域层对象来克服低内聚或者耦合低复用解决方案对人为制造的类分配一组高内聚的职责,该类并不代表问题领域的概念-虚构的事物,用以支持高内聚、低耦合和复用西安邮电学院计算机系舒新峰shuxf@例子为了保存Sale

的实例到关系数据库基于信息专家的考虑,存在理由将责任分配给Sale

类自己.但是考虑如下含义:需要大量的数据库操作,这将使Sale

变得非内聚Sale

类必须与关系数据库接口耦合,这样增加了耦合将对象保存到关系数据库中是一个普遍的任务-它可以重用西安邮电学院计算机系舒新峰shuxf@西安邮电学院计算机系舒新峰shuxf@10.2.2纯虚构(PureFabrication)讨论对象的设计可以广泛的分成两组表示解析(Representationaldecomposition)行为解析(Behavioraldecomposition)优点支持高内聚增加了潜在的复用性禁忌不要过度使用它将导致非O-O的系统西安邮电学院计算机系舒新峰shuxf@10.2.3间接性(Indirection)问题为了避免两个或多个事物之间的直接耦合,应该如何分配职责?如何使对象解耦,以支持低耦合并提高复用性?解决方案将职责分配给中介对象,使其作为其他构件或服务之间的媒介,以避免它们之间的直接耦合优点组件之间的低耦合西安邮电学院计算机系舒新峰shuxf@例子TaxCalculatorAdapterPersistentStorages:Sale:TaxMasterAdaptertaxes:=getTaxes(s)t:=getTotal()theadapteractsasalevelofindirectiontoexternalsystems<<System>>:TaxMasterTCPsocketcommunicationxxx...西安邮电学院计算机系舒新峰shuxf@10.2.4防止变异(ProtectedVariations)问题如何设计对象,子系统和系统,使其内部的变化或不稳定性不会对其它元素造成不良影响解决方案识别预计变化或不稳定之处,分配职责用以在这些变化之外创建稳定接口例子外部税金计算器问题西安邮电学院计算机系舒新峰shuxf@10.2.4防止变异(Cont.)讨论PV时非常重要和基本的软件设计原则。许多软件或架构设计技巧都是防止变异的特例Dataencapsulation,interfaces,polymorphism,indirection…Data-drivendesignsSOA…禁忌如果需要灵活性和对变化的预防,那么就应用PV如果预测将来验证或者预测“复用”的可能性并不确定,则需要有克制和批评的态度西安邮电学院计算机系舒新峰shuxf@10.2.4防止变异(Cont.)初学者倾向于脆弱的设计而中等程度的开发者则倾向于过度想象的,灵活的,一般化的设计专家开发者理智地进行选择优点易于增加新变化所需的扩展可以引入新的实现而无需影响客户低耦合能够降低变化的成本或影响西安邮电学院计算机系舒新峰shuxf@10.3Gang-of-Four模式DesignPatterns,作为一本非常著名的书,是由四位作者写的,因此我们使用“Gang-of-Four”适配器(Adapter)工厂(

Factory)单实例类(

Singleton)策略(Strategy)组合模式(CompositePattern)外观(Facade)观察者/发布-订阅/委派事件模型西安邮电学院计算机系舒新峰shuxf@10.3.1适配器Adapter(GOF)问题如何解决不相容的接口问题,或者如何为具有不同接口的类似构件提供稳定的接口?解决方案通过中介适配器对象,将构件的原来的接口转换为其它接口多态模式就是该模式的例子AdaptersuseinterfacesandpolymorphismtoaddalevelofindirectiontovaryingAPIsinothercomponents.TaxMasterAdaptergetTaxes(Sale):ListofTaxLineItemsGoodAsGoldTaxProAdaptergetTaxes(Sale):ListofTaxLineItems<<interface>>ITaxCalculatorAdaptergetTaxes(Sale):ListofTaxLineItemsSAPAccountingAdapterpostReceivable(CreditPayment)postSale(Sale)...GreatNorthernAccountingAdapterpostReceivable(CreditPayment)postSale(Sale)...<<interface>>IAccountingAdapterpostReceivable(CreditPayment)postSale(Sale)...<<interface>>IInventoryAdapter...<<interface>>ICreditAuthorizationServiceAdapterrequestApproval(CreditPayment,TerminalID,MerchantID)...:Register:SAPAccountingAdapterpostSale(sale)makePayment()theAdapteradaptstointerfacesinothercomponents<<system>>:SAPSOAPoverHTTPxxx...IAccountingAdapterUMLnotationtoindicatesomethingimplementsaparticularinterface西安邮电学院计算机系舒新峰shuxf@Adapter

模式的应用是对GRASP构造块的特殊化(polymorphism,indirectionandprotectedvariations)可以找到数百种模式的说明理解本质能够使我们摒弃太多细节西安邮电学院计算机系舒新峰shuxf@两个问题命名习惯:将模式名字放在类型中设计中发现的“分析”

:领域模型西安邮电学院计算机系舒新峰shuxf@10.3.2工厂Factory(GoF)问题在适配器模式中,对外部服务有不同的接口,那么是谁创建了这些适配器,并且如何决定创建哪种类的适配器当有特殊考虑(例如存在复杂创建逻辑,为了改良内聚而分离创建职责等)时,应该由谁来负责创建对象?解决方案创建称为工厂的纯虚构对象来处理这些创建职责ServicesFactoryaccountingAdapter:IAccountingAdapterinventoryAdapter:IInventoryAdaptertaxCalculatorAdapter:ITaxCalculatorAdaptergetAccountingAdapter():IAccountingAdaptergetInventoryAdapter():IInventoryAdaptergetTaxCalculatorAdapter():ITaxCalculatorAdapter...notethatthefactorymethodsreturnobjectstypedtoaninterfaceratherthanaclass,sothatthefactorycanreturnanyimplementationoftheinterface{

if(taxCalculatorAdapter==null)

{

//areflectiveordata-drivenapproachtofindingtherightclass:readitfroman

//externalproperty

StringclassName=System.getProperty("");

taxCalculatorAdapter=(ITaxCalculatorAdapter)Class.forName(className).newInstance();

}

returntaxCalculatorAdapter;}ItmaylessentheneedforinteractiondiagramData-drivendesign西安邮电学院计算机系舒新峰shuxf@优点分离复杂的创建职责,并将其分配给内聚的帮助者对象隐藏潜在的复杂创建逻辑允许引入提高性能的内存管理策略,例如对象缓存或再生西安邮电学院计算机系舒新峰shuxf@10.3.3单实例类Singleton问题谁来创建工厂自身?如何访问工厂?将实例作为一个参数进行传递对那些需要可见性的对象在初始化时赋予一个持久引用单实例模式:只允许类的一个实例:这是一个单实例。对象需要一个全局和唯一的访问点.解决方案对类定义静态方法用以返回单实例

1ServicesFactoryinstance:ServicesFactoryaccountingAdapter:IAccountingAdapterinventoryAdapter:IInventoryAdaptertaxCalculatorAdapter:ITaxCalculatorAdaptergetInstance():ServicesFactorygetAccountingAdapter():IAccountingAdaptergetInventoryAdapter():IInventoryAdaptergetTaxCalculatorAdapter():ITaxCalculatorAdapter...singletonstaticattributesingletonstaticmethod{//staticmethodpublicstaticsynchronizedServicesFactorygetInstance(){if(instance==null)

instance:=newServicesFactory()returninstance}}UMLnotation:inaclassbox,anunderlined

attributeormethodindicatesastatic(classlevel)member,ratherthananinstancememberUMLnotation:this'1'canoptionallybeusedtoindicatethatonlyoneinstancewillbecreated(asingleton)LazyinitializationCreationworkisavoided,iftheinstanceisneveractuallyaccessedThegetInstancelazyinitializationsometimescontainscomplexandconditionalcreationlogic西安邮电学院计算机系舒新峰shuxf@开发人员通过类的静态方法getInstance

得到其唯一实例的全局可见性publicclassRegister{publicvoidinitialize(){…dosomework…//accessingthesingletonFactoryviathegetInstancecall

accountingAdapter=ServiceFactory.getInstance().getAccountingAdapter();…dosomework…}//othermtehods..}西安邮电学院计算机系舒新峰shuxf@UMLnotation:Register<<Singleton>>:ServicesFactoryaa:=getAccountingAdapter()initialize()...aUMLstereotypecanindicatethatvisibilitytothisinstancewasachievedviatheSingletonpattern西安邮电学院计算机系舒新峰shuxf@具有不同接口的外部服务问题的结论使用适配器,工厂和单实例类模式的结合,为具有不同接口的外部税金计算器,财务系统等提供防止变异:RegisteraccountingAdapter:SAPAccountingAdapterpostSale(sale)makePayment()<<System>>:SAPSOAPoverHTTPxxxIAccountingAdapter:Register<<singleton>>:ServicesFactoryaccountingAdapter:=

getAccountingAdapter():Storecreate()create()[instance==null]create():SAPAccountingAdapterIAccountingAdapter:Paymentcreate(cashTendered)西安邮电学院计算机系舒新峰shuxf@10.3.4策略(Strategy)问题提供更为复杂的定价逻辑,例如商店在某天的折扣,老年人折扣等如何设计变化但相关的算法或政策?如何设计才能使这些算法或政策具有可变更的能力解决方案在单独的类中分别定义每种算法/政策/策略,并且使其具有共同接口西安邮电学院计算机系舒新峰shuxf@例子PercentDiscountPricingStrategypercentage:floatgetTotal(s:Sale):MoneyAbsoluteDiscountOverThresholdPricingStrategydiscount:Moneythreshold:MoneygetTotal(s:Sale):Money<<interface>>ISalePricingStrategygetTotal(Sale):Money{

returns.getPreDiscountTotal()*percentage}???PricingStrategy......{pdt:=s.getPreDiscountTotal()if(pdt<threshold)

returnpdtelse

returnpdt-discount}西安邮电学院计算机系舒新峰shuxf@:PercentDiscountPricingStrategyISalePricingStrategys:Sale*:st:=getSubtotal()t:=getTotal():SalesLineItem:SalesLineItemt:=getTotal(s)pdt:=getPreDiscountTotal(){t=pdt*percentage}notethattheSalesispassedtotheStrategysothatithasparametervisibilitytoitforfurthercollaboration西安邮电学院计算机系舒新峰shuxf@语境对象需要其策略的属性可见性PercentDiscountPricingStrategypercentage:floatgetTotal(Sale):MoneyAbsoluteDiscountOverThresholdPricingStrategydiscount:Moneythreshold:MoneygetTotal(Sale):Money<<interface>>ISalePricingStrategygetTotal(Sale):MoneySaledate...getTotal()...1*SaleneedsattributevisibilitytoitsStrategypricingStrategygetTotal(){...returnpricingStrategy.getTotal(this)}西安邮电学院计算机系舒新峰shuxf@使用工厂创建策略

1PricingStrategyFactoryinstance:PricingStrategyFactorygetInstance():PricingStrategyFactorygetSalePricingStrategy():ISalePricingStrategygetSeniorPricingStrategy():ISalePricingStrategy...{

StringclassName=System.getProperty("");

strategy=(ISalePricingStrategy)Class.forName(className).newInstance();

returnstrategy;}Becauseofthefrequentlychangingpricingpolicyre-createoneeachtime西安邮电学院计算机系舒新峰shuxf@:Sale<<singleton>>:PricingStrategyFactoryps:=getSalePricingStrategy():RegistermakeNewSale()create()create(percent)ps:PercentDiscountPricingStrategyISalePricingStrategy西安邮电学院计算机系舒新峰shuxf@读取和初始化百分比值如何确定百分比或绝对值折扣的数值?这些数据将保存于某种外部数据存储中以便修改哪个对象读取这些数据,并确保将其分配给相应的策略?StrategyFactory

从外部数据源中读取数字的方法通过对其变化进行分析后来确定3.5组合模式(CompositePattern)西安邮电学院计算机系舒新峰shuxf@10.3.5组合模式(CompositePattern)问题如何处理多个互相冲突的定价策略?老年人20%的折扣对于购物金额满400元的优先客户给与折15%的折扣在星期一,购物金额满500元的享受50元的折扣买一罐印度大吉岭茶,则所有购买物品都享受15%的折扣解决方案为复合和原子对象定义一个类,以使他们实现相同的接口西安邮电学院计算机系舒新峰shuxf@解决冲突的策略对顾客最有利或者对商场最有利定价策略可能与产品类型相关,也可能与客户类型相关,这意味着:StrategyFactory

必须知道客户和产品的类型如何能够像处理非组合(原子)对象一样,(多态地)处理一组对象或具有组合结构的对象呢?西安邮电学院计算机系舒新峰shuxf@PercentageDiscountPricingStrategypercentage:floatgetTotal(Sale):MoneyAbsoluteDiscountOverThresholdPricingStrategydiscount:Moneythreshold:MoneygetTotal(Sale):Money<<interface>>ISalePricingStrategygetTotal(Sale):Money{

returnsale.getPreDiscountTotal()*percentage}CompositePricingStrategyadd(ISalePricingStrategy)getTotal(Sale):Money{lowestTotal=INTEGER.MAXforeachISalePricingStrategystratinpricingStrategies

{

total:=strat.getTotal(sale)

lowestTotal=min(total,lowestTotal)

}returnlowestTotal}1..*CompositeBestForCustomerPricingStrategygetTotal(Sale):MoneyCompositeBestForStorePricingStrategygetTotal(Sale):MoneypricingStrategiesAllcompositesmaintainalistofcontainedstrategies.Therefore,defineacommonsuperclassCompositePricingStrategythatdefinesthislist(namedpricingStrategies).Saledate...getTotal()...1*pricingStrategy{...returnpricingStrategy.getTotal(this)}Theoutercompositeobjectcontainsalistofinnerobjectsandboththeouterandinnerobjectsimplementthesameinterface西安邮电学院计算机系舒新峰shuxf@:CompositeBestForCustomerPricingStrategyISalePricingStrategys:Sale*:st:=getSubtotal()t:=getTotal():SalesLineItem:SalesLineItemt:=getTotal(s)theSaleobjecttreatsaCompositeStrategythatcontainsotherstrategiesjustlikeanyotherISalePricingStrategy*:x:=getTotal(s):SalesLineItem:ObjectISalePricingStrategyUMLnotation:thisisawaytoindicateobjectsthatimplementsomeinterface,whenwedon'twanttodeclarewhatthespecificimplementationclassesare{t=min(setofallx)}西安邮电学院计算机系舒新峰shuxf@创建多个SalePricingStrategies什么时候创建这些策略呢?在情形中有三个地方可以将定价策略加入到符合对象中:目前商店定义的折扣,可以在销售对象创建时添加顾客类型的折扣,可以在POS机获取顾客类型时添加产品类型的折扣(ifboughtDarjeelingtea,15%offtheoverallsale),可以在产品输入到销售中时添加西安邮电学院计算机系舒新峰shuxf@:Sale<<singleton>>:PricingStrategyFactoryps:=getSalePricingStrategy():RegistermakeNewSale()create()create()ps:CompositeBestForCustomerPricingStrategyISalePricingStrategycreate(percent)s:PercentageDiscountPricingStrategyISalePricingStrategyadd(s)西安邮电学院计算机系舒新峰shuxf@对于客户类型折扣的第二种情形UseCaseUC1:ProcessSale…扩展(orAlternativeFlows):5b.Customersaystheyareeligibleforadiscount(e.g.,employee,preferredcustomer)1.Cashiersignalsdiscountrequest2.CashierentersCustomeridentification3.Systempresentsdiscounttotal,basedondiscountrules西安邮电学院计算机系舒新峰shuxf@s:Sale:RegisterenterCustomerForDiscount(custID)byControllerbyExpertandIDstoObjects:Storec:=getCustomer(custID)enterCustomerForDiscount(c:Customer)continuedinanotherdiagrambyExpert西安邮电学院计算机系舒新峰shuxf@s:Sale<<singleton>>:PricingStrategyFactoryaddCustomerPricingStrategy(s)ps:CompositeBestForCustomerPricingStrategyISalePricingStrategycreate(pct)s:PercentageDiscountPricingStrategyISalePricingStrategyadd(s)byExpertenterCustomerForDiscount(c:Customer)originatesinanotherdiagramc:=getCustomer()byFactoryandHighCohesionbyExpertps:=getPricingStrategy()pct:=getCustomerPercentage(c)byHighCohesionbyFactoryandCompositePassAggregateObjectasParameter西安邮电学院计算机系舒新峰shuxf@两个通用实践IDs到对象Acommonpracticeinobjectdesign-totransformkeysandIDsforthingsintotrueobjectsTransformthecustomerIDintoaCustomerobject将聚集对象作为参数addCustomerPricingStrategy(s:Sale)messagewepassaSaletothefactory,andthenthefactoryturnsaroundandasksfortheCustomerandPricingStrategyfromtheSale西安邮电学院计算机系舒新峰shuxf@3.6外观(Facade)问题可插拔的业务规则创建新销售时,可能要识别该销售是否以礼券方式进行支付。商店可能会规定如果使用礼券只可以购买一件商品。如果销售使用礼券支付,在对该顾客找零时,除了礼券之外所有其它支付类型的找零都应该置为无效。例如,如果收银员请求现金找零或更新顾客在其商店帐户上的积分时,这些请求都应该判断为无效….如何设计一个软件对目前的软件组件影响最小呢?西安邮电学院计算机系舒新峰shuxf@解决方案定义对子系统的单一的接触点-用一个外观对象包装子系统。外观对象提供了一个唯一的统一接口,它负责与子系统的组件进行协作西安邮电学院计算机系舒新峰shuxf@子系统的外观对象被称为POSRuleEngineFacade.设计者决定在所有定义了可插拔规则的方法的开始之处调用这一外观publicclassSale{publicvoidmakeLineItem(ProductSpecificationspec,intquantity){SalesLineItemsli=newSalesLineItem(spec,quantity);//calltotheFaçadeif(POSRuleEngineFacade.getInstance().isInvalid(sli,this))return;linItems.add(sli);}//…}//endofclass西安邮电学院计算机系舒新峰shuxf@Domain+Sale+Register...POSRuleEngine<<interface>>-IRule...-Rule1...-Rule2......packagenamemaybeshowninthetabvisibilityofthepackageelement(tooutsidethepackage)canbeshownbyprecedingtheelementnamewithavisibilitysymbol+POSRuleEngineFacadeinstance:RuleEngineFacadegetInstance():RuleEngineFacadeisInvalid(SalesLineItem,Sale)isInvalid(Payment,Sale)...*1西安邮电学院计算机系舒新峰shuxf@外观一般通过单实例模式来访问外观vs.适配器适配器对外部系统的访问进行了封装,尽管它是一种外观,它强调的是对各种接口的兼容性西安邮电学院计算机系舒新峰shuxf@10.3.7观察者/发布-订阅/委派事件模型添加当总价变化时,GUI窗口能够更新其显示的能力Goal:Whenthetotalofthesalechanges,refreshthedisplaywiththenewvalueSaletotal...setTotal(newTotal)...Solution1:WhentheSalechangesthetotal,theSaleobjectsendsamessagetoawindow,askingittorefreshitsdisplayViolationofModel-ViewSeparationPrinciple西安邮电学院计算机系舒新峰shuxf@解决方案定义一个“订阅”

or“聆听者”接口.订阅者实现该接口。发布者可以动态的注册对事件感兴趣的订阅者,并在事件发生时,通知它们。西安邮电学院计算机系舒新峰shuxf@<<interface>>PropertyListeneronPropertyEvent(source,name,value)SaleFrame1onPropertyEvent(source,name,value)initialize(Salesale)...javax.swing.JFrame...setTitle()setVisible()...{

if(name.equals("sale.total"))

saleTextField.setText(value.toString());}SaleaddPropertyListener(PropertyListenerlis)publishPropertyEvent(name,value)setTotal(MoneynewTotal)...*propertyListeners{

total=newTotal;

publishPropertyEvent("sale.total",total);

}{

propertyListeners.add(lis);}{

foreachPropertyListenerplinpropertyListeners

pl.onPropertyEvent(this,name,value);

}{

sale.addPropertyListener(this)

...}西安邮电学院计算机系舒新峰shuxf@s:Salesf:SaleFrame1initialize(s:Sale)addPropertyListener(sf)PropertyListenerpropertylisteners:Objectadd(sf)PropertyListenerUMLnotation:Recallthatthereisnosuchthingasaninstanceofaninterface.Therefore,wecangeneralize(orbevague)andsimplyindicatetheinstancesastypeObject,whichisassumedtobethesuperclassofallclasses.Thisapproachcanbeusedevenifthelanguage(suchasC++)doesnotliterallydefinearootObjectsuperclass.西安邮电学院计算机系舒新峰shuxf@s:SalesetTotal(total)*:onPropertyEvent(s,"sale.total",total)UMLnotation:SincethemembersofthiscollectionaretypedtotheinterfacePropertyListener,itisnotlegaltoshowanimplementationresponse,suchasfurthermessaging,sincetheresponsecanvary,dependingontheclassimplementingthisinterface.Therefore,"stop"themessagingatthispoint,andshowimplementionsondifferentdiagrams.publishPropertyEvent("sale.total",total)propertylisteners:ObjectPropertyListener西安邮电学院计算机系舒新峰shuxf@:SaleFrame1onPropertyEvent(source,name,value)PropertyListenersaleTextField:JTextFieldsetText(value.toString())Sincethisisapolymorphicoperationimplementedbythisclass,showanewinteractiondiagramthatstartswiththispolymorphicversionUMLnotation:Notethislittleexpressionwithintheparameter.Thisislegalandconsise.西安邮电学院计算机系舒新峰shuxf@AnotherExample<<interface>>AlarmListeneronAlarmEvent(source,time)BeeperonAlarmEvent(source,time)...{

displaynotificationdialogbox}AlarmClockaddAlarmnListener(AlarmListenerlis)publishAlarmEvent(time)setTime(newTime)...*alarmListeners{

time=newTime;

if(time==alarmTime)

publishAlarmEvent(time);

}{

alarmListeners.add(lis);}{

foreachAlarmListeneralinalarmListeners

al.onAlarmEvent(this,time);

}AlarmWindowonAlarmEvent(source,time)...javax.swing.JFrame...setTitle()setVisible()...ReliabilityWatchDogonAlarmEvent(source,time)...{

beep}{

checkthatallrequiredprocesses

areexecutingnormally}Onepublishercanhavemanysubscribersforanevent西安邮电学院计算机系舒新峰shuxf@我们学习了什么InformationExpertCreatorHighCohesionLowCouplingControllerPolymorphismIndirectionPureFabricationProtectedVariationAdapter(GOF)Factory(GoF)SingletonStrategyCompositePatternFaçadeObserver/Publish-Subscribe/DelegationEventModel现代软件工程

ModernSoftwareEngineering

第一章软件工程概论课程简介课程名称:现代软件工程教学方式:授课+

讨论 课时安排:48考试类别:考试 参考资料:ApplyingUMLandPatterns(UML与模式应用),CraigLarman,机械工业出版社,第三版软件工程导论,张海藩,清华大学出版社现代软件工程,周之英,科学出版社实用软件工程,郑人杰,高等教育出版社软件工程案例教程,韩万江,机械工业出版社课程目标《现代软件工程》以当前主流的软件开发过程、面向对象技术和UML作为核心,密切结合软件开发的先进技术、最佳实践和企业案例,力求从“可实践”软件工程的角度描述需求分析、软件设计、软件测试以及软件开发管理,并对软件工程领域的最新研究热点与成果进行介绍。通过本课程的学习,使学生掌握软件工程的基本原理、开发软件项目的工程化的方法和技术及在开发过程中应遵循的流程、准则、标准和规范,具备一定的软件分析、设计能力以及有效地策划和管理软件开发活动的能力。课程安排Chap1.软件工程概述Chap2.传统软件工程方法Chap3.面向对象方法与UMLChap4.软件设计与实现Chap5.软件测试与评估Chap6.软件项目管理Chap7.形式化软件工程Chap8.案例分析与讨论第一章软件工程概论1.1软件的基本概念1.2软件危机1.3软件工程1.4软件生存周期1.5软件工程基本原理1.6软件的开发模型1.7软件工程方法学1.8关于软件工程的学习1.9小结1·1软件的基本概念生产力显著提高100倍。人们从繁重的体力劳动中解脱出来。80年代初期

BusinessWeekly“软件:新的驱动力”20年后……带翼的软件公路上的代码健康软件……计算机软件已经成为一种驱动力进行商业活动的引擎现代科学研究和工程问题解决的基础区分现代产品和服务的关键因素现代社会中不可缺少的应用于:交通、医药、通讯、军事、娱乐、办公……1·1·1软件的定义【定义】:软件是程序、数据及开发、使用和维护程序所需要的所有文档。其中 程序:计算事务的处理对象和处理规则的描述,为指令的集合;数据:程序加工、处理的对象。文档:有关计算机程序功能、设计、编制、使用的文字或图形资料。1·1·2软件的发展史早期(程序设计阶段): 【时间】:20世纪50年代初期至60年代中期

【特点】:硬件已经通用化,而软件的生产却是个体化。软件产品为专用软件,规模较小,功能单一,开发者即使用者;软件只有程序,无文档;软件设计在人们的头脑中完成,形成了错误观念“软件=程序”。【典型技术】:面向批处理、自定义软件1·1·2软件的发展史第二阶段(程序系统阶段): 【时间】:20世纪60年代中期至70年代末期

【特点】:多道程序设计技术、多用户系统、人机交互式技术、实时系统和第一代数据库管理系统的出现,使得计算机应用得到迅速。出现了专门从事软件开发的“软件作坊”,软件作为产品得到了广泛应用。但在软件业空前繁荣的同时,原始的开发与维护方法陷入了极端困境,“软件危机”产生。【典型技术】:多用户、实时、数据库、软件产品

1·1·2软件的发展史第三阶段(软件工程阶段): 【时间】:20世纪70年代中期至80年代中期

【特点】:微处理器的出现和广泛应用,使得计算机真正成为大众化的东西。以软件的产品化、系列化、工程化和标准化为特征的软件产业发展起来,软件开发有了可以遵循的软件工程化的设计准则、方法和标准。【典型技术】:分布式系统、广域网和局域网、低成本的硬件、嵌入“智能”1·1·2软件的发展史第四阶段: 【时间】:20世纪80年代中期至今

【特点】:计算机的发展不再着重与单台计算机和计算机程序、而是针对计算机和软件的综合应用。由复杂的操作系统控制的PC机、广域网、局域网、Internet,配合以先进的软件应用已经成为标准。面向对象的开发方法在许多领域迅速取代了传统的软件开发方法。【典型技术】:强大的桌面系统、面向对象技术专家系统、人工神经网络、网络计算机1·1·3软件的特点

软件是一个逻辑的而不是物理的产品:软件是一种逻辑实体,不具有直观可见性;软件是由开发或工程化而形成的,而不是传统意义上的制造产生的;软件不会“磨损”;大多数软件是自定义的,而不是通过已有构件组装的;软件的开发和运行常常受到计算机系统的限制,对计算机有着不同的依赖。(软件移植)。软件的成本相当昂贵。硬件与软件的故障曲线时间硬件的故障率曲线故障率生命初期“磨损”后软件的故障率曲线故障率时间理想曲线实际曲线修改副作用软件的成本相当昂贵软件技术的发展落后于需求时间软件复杂性软件需求差距软件技术硬、软件成本比例的变化年份成本%软件1950197019851995硬件1·1·4软件的分类基于软件功能划分:系统软件;支撑软件;应用软件基于软件工作方式划分:实时处理;分时处理;交互式;批处理基于软件规模划分:微型;小型;中型;大型……基于软件服务对象的范围划分:定制软件;通用软件基于软件失效的影响划分:关键软件;非关键软件1·1·5软件应用 软件的应用领域十分广阔:系统软件:是一组为其它软件服务的软件。如操作系统、编译软件、DBMS等。特点是与硬件交互频繁;多用户支持;多外部调用等。实时软件:管理、分析、控制现实世界种发生事件的软件。特点是必须在严格时间范围内相应。商业软件:目前最大应用领域。如管理信息系统。工程可科学计算软件:特征是“数值分析”。嵌入式软件:工业产品中用于控制之用。个人计算机软件:如字处理、多媒体、娱乐等。人工智能软件:如专家系统、虚拟现实、仿真等。1·2软件危机个体化软件环境软件作坊急剧膨胀软件危机产生SoftwareCrisis?SurveyoftheUSGovernmentAccountingOffice-19791·2软件危机【定义】:在计算机软件的开发和维护过程中所遇到的一系列严重问题。1968年,北大西洋公约组织的计算机科学家在联邦德国召开国际会议,讨论软件危机问题,正式提出并使用了“软件工程”的概念,标志软件工程正式诞生。软件危机包含两方面的问题:如何开发软件,以满足不断增长,日趋复杂的需求。如何维护数量不断膨胀的软件产品。1·2·1软件危机的表现形式对软件的开发成本和进度的估计常常很不准确;用户对“已完成”软件系统的不满意现象时常发生;软件产品的质量往往靠不住;软件常常是不可维护的;软件通常没有适当的文档资料;其他。1·2·2产生软件危机的原因软件本身的特点:逻辑部件,不具有直观可见性;规模日趋庞大,开发与管理十分复杂性。错误的软件开发与维护方法忽视软件需求分析轻视文档的重要性忽略软件维护等1·2·3解决软件危机的途径对计算机软件有一个正确的认识 (软件≠程序)必须充分认识到软件开发不是某种个体劳动的神秘技巧,而应该是一种组织良好、管理严密、各类人员协同配合、共同完成的工程项目。推广使用在实践中总结出来的开发软件的成功技术和方法。开发和使用更好的软件工具。1·2·3解决软件危机的途径1.技术措施 推广和使用在实践中总结出的好的软件开发技术和方法,并不断探索和研究更有效的技术。 开发和使用更好的软件工具,包括采用好的开发工具,系统分析和辅助设计工具等,以提高工作效率。2.管理措施 吸收和借鉴人类长期以来从事各类工程项目所积累的行之有效的原理、概念、技术和方法。水利工程建筑工程机械工程…

…软件工程传统工程新兴工程气象工程生物工程工程工程是对技术(或社会)实体的分析、设计、建造、验证和管理。1·3软件工程“软件工程”SoftwareEngineering于1968年NATO组织在德国召开的一次会议上提出是把软件当作一种工业产品,要求“采用工程化的原理与方法对软件进行计划、开发和维护”。软件工程的概念及范畴围棋与软件工程的感想围棋围棋棋谱拿过来的时候,大师问“后面应该走哪里?”十个初级爱好者选择的落点散布在棋盘各处……

十个职业棋手说的落子点都差不多,甚至包括后面的几步……

这就是高手和低手的差别……软件工程当一个小程序拿过来的时候,项目经理让大家编写……

十个中国软件工程师写出来的程序各有“特色”、千差万别,十个印度软件工程师写出来的程序差不多,以至于怀疑是“抄袭”。项目经理也不清楚中国软件业和印度软件业的差距是多少年只是觉得差了好远好远……思考:软件开发是否需要追求风格一致和代码一致软件开发是否应该抹杀个人的创造性要解决的问题是什么?用于解决该问题的实体具有什么特点?如何实现该实体(解决方案)?如何建造该实体?采用什么方法去发现该实体设计和建造过程中产生的错误?当该实体的用户要求修改、适应和增强时,如何支持这些活动?从发展的角度:硬件发展超过软件人们对新程序的需求对软件的依赖建造高质量和高可靠性的软件的努力拙劣的设计和资源的缺乏软件工程

背景(Cont.)从产业的角度:计算机发展的早期,面向硬件程序设计被看作是一门“艺术”开发成本分配发生变化管理者和开发人员:?Why

长时间?Why

成本高?Why

错误?Why

难度量软件工程

背景(Cont.)1·3软件工程【定义】

采用工程的概念、原理、技术和方法来开发与维护软件,把经过时间考验而证明正确的管理技术和当前能够得到的技术方法结合起来,来指导软件的开发与维护。软件工程技术的两个明显特点:

强调规范化强调文档化开发范型设计方法支持过程管理过程需求设计实现确认支持可用性正确性合算性软件工程活动维软件工程目标维软件工程原则维软件工程的框架是由软件工程目标、软件工程活动和软件工程原则三个方面的内容构成的。软件工程框架目标:生产具有正确性、可用性以及开销适宜的软件产品。正确性:软件产品达到预期功能的程度。可用性:软件基本结构、实现及文档为用户 可用的程度。开销适宜:软件开发、运行的整个开销满足 用户要求的程度。决定了:软件过程、过程模型和工程方法的选择。软件工程目标活动:生产一个最终满足需求且达到工程目 标的软件产品所需要的步骤。1、需求:问题分析:需求获取和定义,又称软件需求规约。

需求分析:生成软件功能规约。2、设计:概要设计:建立整个软件的体系结构,包括子系统、模块以及相关层次的说明、每一模块的接口定义等。

详细设计:产生程序员可用的模块说明,包括每一模块中数据结构说明及加工描述。3、实现:把设计结果转换为可执行的程序代码。4、确认:贯穿整个开发过程,对完成的结果进行确认,保证产品满足用户的要求。5、支持:修改和完善活动。软件工程活动软件工程的四条基本原则:采取适宜的开发模型:控制易变的需求;采用合适的设计方法:需要软件模块化、抽象与信息隐藏、局部化、一致性以及适应性等,需要合适的设计方法的支持。提供高质量的工程支持:软件工具和环境对软件过程的支持。重视开发过程的管理:有效利用可用的资源、生产满足目标的软件产品、提高软件组织的生产能力等。软件工程原则工具方法过程质量焦点1·3·1一种层次化技术Softwareengineeringlayers质量焦点:支持软件工程的根基就在于对质量的关注。过程:软件工程的过程将技术层结合在一起,使计算机软件合理和及时开发出来。方法:涵盖一系列的任务:需求分析、设计、编程、测试和维护。工具:对过程、方法提供自动或半自动的支持。例CASE集成软件、硬件或一个软件工程数据库。1·3·1一种层次化技术软件工程的基层过程定义了一组关键过程区域的框架(KPAs)关键过程区域构成了软件项目的管理控制的基础规定了技术方法的采用,工程产品(模型、文档、数据、报告等)的产生,checkpoint的设立、质量的保证以及变更的管理软件工程的过程层提供了建造软件在技术上需要“如何做”。方法涵盖了以下任务需求分析设计编程测试维护软件工程方法依赖于一组基本原则,这些原则控制了每一个技术区域,包括建模技术和其他描述技术软件工程的方法层(1)遗留(legacy)软件将继续发挥作用。(2)软件应用范围将继续扩大,成为信息社会的基础设施。(3)网络化软件将是发展重点。(4)软件的可靠性与安全性日趋重要。(5)工业化生产是必由之路。1·3·2软件发展趋势软件工业化生产时代的基础技术:软件过程技术:以软件过程改进为中心

软件过程成熟度模型CMM

个体软件过程PSP

群体(小组)软件过程TSP

建造支持软件过程的环境面向对象技术构件重用技术1·3·2软件发展趋势软件工程关注于大型程序的构造软件工程的中心课题是控制复杂性软件经常变化开发软件的效率非常重要和谐地合作是开发软件的关键软件必须有效地支持它的用户在软件工程领域中是由具有一种文化背景的人替具有另一种文化背景的人创造产品1·3·3软件工程—

本质特征【定义】

(SoftwareLifeCycle)一个软件从定义、开发、使用和维护,直到最终被废弃为止的整个过程。1·4软件生存周期软件生命周期费用效益1·4·1软件生存周期方法学基本思想

采用生命周期方法学,从时间角度对软件开发和维护的复杂问题进行分解,把软件生命的漫长周期依次分为若干阶段,每个阶段有相对独立的任务,然后逐步完成每个阶段的任务。 前阶段任务的完成是后阶段工作开始的前提与基础,后阶段任务是前阶段的具体与细化。优点:

各阶段任务相对独立,便于分工协作,降低开发工作的难度;便于科学组织与管理;保证了产品的质量,提高了可维护性。1·4·2阶段划分及基本任务阶段划分原则: 各阶段的任务彼此间尽可能的相对独立,同一阶段各项任务的性质尽可能的相同,从而降低各阶段任务的复杂程度,简化不同阶段之间的联系,有利与软件的组织管理。问题定义可行性研究需求分析总体设

温馨提示

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

评论

0/150

提交评论