




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
《計算與軟件工程II》
Ch15“面向?qū)ο蟆钡男畔㈦[藏丁二玉南京大學(xué)軟件學(xué)院InformationHidingEachmodulehidestheimplementationofanimportantdesigndecision(secrets)sothatonlytheconstituentsofthatmoduleknowthedetails3DesignSecretsneedtohide…PrimarySecret:ResponsibilityChangeHiddeninformationthatwasspecifiedtothesoftwaredesignerFromSRSSecondarySecret:ImplementationChangeTheimplementationdecisionsmadebythedesignerwhenimplementingthemoduledesignedtohidetheprimarysecret變化;MainContentsEncapsulationWhatshouldbehiding?Howtohidingchange?Encapsulation(1)EncapsulationallowstheprogrammertogroupdataandthesubroutinesthatoperateonthemtogetherinoneplaceResponsibilityEncapsulation(2)hideirrelevantdetailsfromtheuseraclasscanbedividedintotwoparts,theuserinterfaceandtheimplementation.Theinterfaceisthevisiblesurfaceofthecapsule.describestheessentialcharacteristicsofobjectsoftheclasswhicharevisibletotheexteriorworldTheimplementationishiddeninthecapsule.Theimplementationhidingmeansthatdatacanonlybemanipulated,thatisupdated,withintheclass,butitdoesnotmeanhidinginterfacedata. NewViewofEncapsulationOld/Beginner/Implementationviewofencapsulation:
hidingdatainsideanobjectNewview:hidinganything,including:Data(implementation)Structure(implementation)Otherobject(implementation)Type(derivedclasses)Change/vary(designdetails)…EncapsulationCorrectly——ADTADT=AbstractDataTypeAconcept,notanimplementationAsetof(homogeneous)objectstogetherwithasetofoperationsonthoseobjectsNomentionofhowtheoperationsareimplementedEncapsulation=dataabstraction+typedataabstraction:groupdataandoperationType:hidingimplementation,makeusagecorrectlyWhytype?Atypemaybeviewedasasetofclothes(orasuitofarmor)thatprotectsanunderlyinguntypedrepresentationfromarbitraryorunintendeduse.Itprovidesaprotectivecoveringthathidestheunderlyingrepresentationandconstrainsthewayobjectsmayinteractwithotherobjects.Inanuntypedsystemuntypedobjectsarenakedinthattheunderlyingrepresentationisexposedforalltosee.EncapsulateDataIfneeded,useAccessorsandMutators,NotPublicMembers
AccessorsandMutatorsismeaningfulbehaviorConstraints,transformation,format…publicvoidsetSpeed(doublenewSpeed){ if(newSpeed<0){ sendErrorMessage(...); newSpeed=Math.abs(newSpeed); } speed=newSpeed;}EncapsulatestructuresSeechapter16IteratorPatternReferencesandCollectionData-Type!Encapsulateotherobjects
CollaborationDesignComposition;delegationEncapsulatetype(subclass)LSPpointerstosuperclassesorinterfaces;AllderivedclassesmustbesubstituteablefortheirbaseclassEncapsulateChange(orvary)
Identifytheaspectsofyourapplicationthatmaychange(orvary)andseparatethemfromwhatstaysthesame.Takethepartsthatchange(vary)andencapsulatethem,sothatlateryoucanalterorextendthepartsthatvarywithoutaffectingthepartsthatdon’t.SeeDIPandOCPLaterEncapsulateImplementationDetailDataStructureOtherobjectTypeChange/vary…Principle#1:MinimizeTheAccessibilityofClassesandMembersAbstractionAnabstractionfocusesontheoutsideviewofanobjectandseparatesanobject’sbehaviorfromitsimplementationEncapsulationClassesshouldnotexposetheirinternalimplementationdetailsMainContentsEncapsulationHowtohidingchange?ExampleofResponsibility
ChangeCopyReadKeyboardWritePrintervoidCopy(ReadKeyboard&r,WritePrinter&w){
intc;
while((c=r.read())!=EOF)
w.write(c);}WriteDiskvoidCopy(ReadKeyboard&r,WritePrinter&wp,WriteDisk&wd,OutputDevicedev){
intc;
while((c=r.read())!=EOF)
if(dev==printer)wp.write(c);elsewd.write(c);}Howto…AbstractionisKey...usingpolymorphicdependencies(calls)ExampleofResponsibility
ChangeDiskWriter::Write(c){ WriteDisk(c);}CopyKeyboardReaderPrinterWriterDiskWritervoidCopy(ReadKeyboard&r,WritePrinter&w){
intc;
while((c=r.read())!=EOF)
w.write(c);}Principle10:
Open/ClosedPrinciple(OCP)Softwareentitiesshouldbeopenforextension,butclosedformodificationB.Meyer,1988/quotedbyR.Martin,1996Beopenforextensionmodule'sbehaviorcanbeextendedBeclosedformodificationsourcecodeforthemodulemustnotbechanges統(tǒng)計數(shù)據(jù)表明,修正bug最為頻繁,但是影響很小;新增需求數(shù)量一般,但造成了絕大多數(shù)影響Modulesshouldbe
writtensotheycanbeextended
without
requiringthemtobemodifiedOCPRTTIisuglyanddangerousRTTI=Run-TimeTypeInformationIfamoduletriestodynamicallycastabaseclasspointer
toseveralderivedclasses,anytimeyouextendthe
inheritancehierarchy,youneedtochangethemodulerecognizethembytypeswitchorif-else-ifstructuresRTTIisUglyandDangerous!//
RTTIviolating
the
//open-closed
principleandLSP
class
Shape
{}
class
Square
extends
Shape
{
void
drawSquare()
{
//
draw
}
}
class
Circle
extends
Shape
{
void
drawCircle()
{
//
draw
}
}
void
drawShapes(List<Shape>
shapes)
{
for
(Shape
shape
:
shapes)
{
if
(shapes
instanceof
Square)
{
((Square)
shapes).drawSquare();
}
else
if
(shape
instanceof
Circle)
{
((Circle)
shape).drawCircle();
}
}
}
//
AbstractionandPolymorphismthat
does
//not
violate
the
open-closed
principleandLSP
interface
Shape
{
void
draw();
}
class
Square
implements
Shape
{
void
draw()
{
//
draw
implementation
}
}
class
Circle
implements
Shape
{
void
draw()
{
//
draw
implementation
}
}
void
drawShapes(List<Shape>
shapes)
{
for
(Shape
shape
:
shapes)
{
shape.draw();
}
}
OCPSummaryUseabstractiontogainexplicitclosurePlanyourclassesbasedonwhatislikelytochange.minimizesfuturechangelocationsOCPneedsDIP&&LSPNosignificantprogramcanbe100%closed
R.Martin,“TheOpen-ClosedPrinciple,”1996Principle11:DependencyInversionPrinciple(DIP)I.High-levelmodulesshouldnot
dependonlow-levelmodules.Bothshoulddependonabstractions.II.Abstractionsshouldnotdependondetails.DetailsshoulddependonabstractionsR.Martin,1996DIP:separateinterfacefromimplementation——abstractUseinheritancetoavoiddirectbindingstoclasses:
Designtoaninterface,notanimplementation!ClientInterface
(abstractclass)Implementation
(concreteclass)DIPExampleCopyReaderWriterKeyboardReaderPrinterWriterDiskWriterclassReader{public:virtualintread()=0;};classWriter{public:virtualvoidwrite(int)=0;};voidCopy(Reader&r,Writer&w){intc;while((c=r.read())!=EOF)w.write(c);}DIPProceduralvs.OOArchitectureProceduralArchitectureObject-OrientedArchitectureDIPsummaryAbstractclasses/interfaces:tendtochangelessfrequentlyabstractionsare‘hingepoints’whereitis
easiertoextend/modifyshouldn’thavetomodifyclasses/interfaces
thatrepresenttheabstraction(OCP)ExceptionsSomeclassesareveryunlikelytochange;
thereforelittlebenefittoinserting
abstractionlayerExample:StringclassIncaseslikethiscanuseconcreteclass
directlyasinJavaorC++HowtodealwithchangeOCPstatesthegoal;DIPstatesthemechanism;LSPistheinsuranceforDIPExampleofImplementationChangeDuckquack()swim()display()//otherduck-likemethods…MallardDuckdisplay(){//lookslikeamallard}RedHeadDuckdisplay(){//lookslikea
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025空軍軍醫(yī)大學(xué)幼兒園招聘(4人)模擬試卷及答案詳解(名校卷)
- 2025年福建省福州市電子集團(tuán)有限公司招聘30人考前自測高頻考點模擬試題(含答案詳解)
- 2025湖南婁底市市直學(xué)校公開招聘教師16人考前自測高頻考點模擬試題附答案詳解(模擬題)
- 2025年寶應(yīng)縣衛(wèi)生健康系統(tǒng)事業(yè)單位公開招聘專業(yè)技術(shù)人員37人考前自測高頻考點模擬試題附答案詳解
- 2025春季浙江省自然資源集團(tuán)校園招聘考前自測高頻考點模擬試題參考答案詳解
- 2025年伊春金林區(qū)公益性崗位招聘16人考前自測高頻考點模擬試題及一套參考答案詳解
- 2025湖南省腫瘤醫(yī)院高層次人才公開招聘44人考前自測高頻考點模擬試題及答案詳解(奪冠)
- 2025年水發(fā)集團(tuán)權(quán)屬一級公司紀(jì)委副書記專項招聘考前自測高頻考點模擬試題完整參考答案詳解
- 2025年中國化妝品防篡改標(biāo)簽行業(yè)市場分析及投資價值評估前景預(yù)測報告
- 2025年河北唐山市消防救援支隊政府專職消防隊員招聘113人考前自測高頻考點模擬試題及參考答案詳解一套
- 腹膜透析基本操作技術(shù)
- 項目二任務(wù)2:選用視覺傳感器(課件)
- 《老年護(hù)理學(xué)》教學(xué)大綱全套
- 靜脈用藥安全輸注藥護(hù)專家指引
- 繪本IntotheAmazonRainforest(課件)譯林版英語六年級上冊
- 全國高中數(shù)學(xué)聯(lián)賽
- 動畫概論教程課件 第10章 動畫視聽語言
- GB/T 18742.2-2017冷熱水用聚丙烯管道系統(tǒng)第2部分:管材
- 犯罪概念及犯罪構(gòu)成課件
- 人教版培智學(xué)校生活數(shù)學(xué)一年級上冊認(rèn)識1課件
- DBJ53-T-40-2011 云南省城鎮(zhèn)園林工程施工質(zhì)量驗收規(guī)程
評論
0/150
提交評論