西北大學(xué)計算機科學(xué)系面向方面的程序設(shè)計(AOP)和面向方面的軟件開發(fā)方法(AOSD)課件_第1頁
西北大學(xué)計算機科學(xué)系面向方面的程序設(shè)計(AOP)和面向方面的軟件開發(fā)方法(AOSD)課件_第2頁
西北大學(xué)計算機科學(xué)系面向方面的程序設(shè)計(AOP)和面向方面的軟件開發(fā)方法(AOSD)課件_第3頁
西北大學(xué)計算機科學(xué)系面向方面的程序設(shè)計(AOP)和面向方面的軟件開發(fā)方法(AOSD)課件_第4頁
西北大學(xué)計算機科學(xué)系面向方面的程序設(shè)計(AOP)和面向方面的軟件開發(fā)方法(AOSD)課件_第5頁
已閱讀5頁,還剩72頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

Aspect-OrientedProgramming(AOP)

andAspect-orientedsoftware

development(AOSD)

面向方面的程序設(shè)計(AOP)

和面向方面的軟件開發(fā)方法(AOSD)

俳口克岡]西北大學(xué)計算機科學(xué)系

(為研究生們作的報告)2003.10

2009-8-271

軟件技術(shù)新動向:面向方面方法的興起

■二十年的實踐證明:面向?qū)ο蟮拈_發(fā)方法具有很強的生

命力,已為廣大的軟件業(yè)界所普遍采用。

■但是,對多數(shù)復(fù)雜的系統(tǒng),在多種需求關(guān)注點和實現(xiàn)的

模塊(構(gòu)件、類)之間的對應(yīng)中,往往出現(xiàn)交叉分割

(橫切)的現(xiàn)象。即需求關(guān)注點在實現(xiàn)中的分散和實現(xiàn)

構(gòu)件內(nèi)容的混雜。從而導(dǎo)致了軟件開發(fā)和維護的一系列

困難(Poortraceability,Lowerproductivity,Lesscode

reuse,Poorcodequality,Moredifficultevolution。)

■面向方面方法就是針對這些問題而產(chǎn)生的。它一出現(xiàn)就

得到業(yè)界的廣泛關(guān)注。很可能,它將成為軟件開發(fā)方法

發(fā)展的重要一步,引起新一輪軟件開發(fā)方法和支持工具

研究和開發(fā)的熱潮。

2009-8-272

講座大綱:

■AOPAOSD的飛速發(fā)展

■基本概念和內(nèi)容

■AspectJ的基本思路

(--語言的概念和結(jié)構(gòu))

■研究和開發(fā)的方向和課題

2009-8-273

internationalconferencesonAOP

■WorkshoponAspectOrientedProgramming(ECOOP1997)June1997

■IntiWorkshoponAspectOrientedProgramming(ICSE1998)April1998.

■WorkshoponAspectOrientedProgramming(ECOOP1998),Jan1998.

■IntiWorkshoponAspectOrientedProgramming(ECOOP1999),June1999.

■WorkshoponAdvancedSeparationsofConcerns(OOPSLA2000),Oct.2000.

■WorkshoponAspectsandDimensionsofConcerns(ECOOP2000),June2000.

■WorkshoponMulti-DimentionalSeparationofConcernsinSoftware

Engineering(ICSE2000),June2000.

■WorkshoponAdvancedSeparationsofConcerns(ECOOP2001),June.2001.

■WorkshoponAdvancedSeparationsofConcernsinObjectOrietedSystems

(OOPSLA2001),Oct.2001.

■WorkshoponAdvancedSeparationofConcernsinSoftware

Engineering(ICSE2001),May2001.

2009-8-274

internationalconferencesonAOSD

■the1stinternationalconferenceonAspect-oriented

softwaredevelopment.Enschede,TheNetherlands,on

April22-26,2002..

■2ndinternationalconferenceonAspect-oriented

softwaredevelopment.Boston,Massachusetts,USA,

March17-21,2003.

■the3rdInternationalConferenceonAspect-Oriented

SoftwareDevelopment.LancasterUK,March22-26

2004.

2009-8-275

WorkshoponAspect-Orientation(German)

■AOP-GI200):

WorkshoponAspect-Orientation,May3-4,2001,

UniversityofPaderborn.(Germanonly)

■AOSD-GI2002:

SecondWorkshoponAspect-OrientedSoftware

DevelopmentoftheGI,February21-22,2002,

UniversityofBonn.

■AOSD?G12003:

ThirdWorkshoponAspect-OrientedSoftware

DevelopmentoftheGI,March4-52003,

UniversityofEssen.

2009-8-276

ResearchProjects:

■SupportedSystems:

AspectC++,AspectJ,AspectR,Aspects,...

■ResearchPrototypes:

■Applications:

■Methods&Foundations:

2009-8-277

Websites:

■/

■XeroxPARC'sresearchonAOP:

■/csl/groups/sda

2009-8-278

ABibliographyofAspect-Oriented

SoftwareDevelopment

■Version1.0(502)RIACSTechnicalReport

02.06August2002

■Version1.1(694)RIACSTechnicalReport

03.01January2003

■Version1.22

{ResearchInstituteforAdvancedComputer

Science},

2009-8-279

ThefundamentalgoalofAOSD

■ThefundamentalgoalofAOSD--effective

separationofconcerns—wasenunciatedabout

30yearsago,mostnotablybyDijkstraand

Parnas.

■Thefirsttwodecadesorsoofresearchon

separationofconcernsfocusedprimarilyon

providingnewkindsofmodules,ableto

separateconcernsinnewways.Thisledtosome

keyadvances,includingabstractdatatypesand

object-orientedprogramming,whichhavehad

dramaticimpactonsoftwareengineering

researchandpractice.

2009-8-2710

Thetimeisrightforpractitionerstobeginusing

AOSDtechnology

■Theapproachessufferedfromalimitation,however:they

couldencapsulateconcernsthatalignedwiththedominant

decompositionofthesoftwareintomodulessuchas

objectsorclasses,butnotconcernsthatcutacross

multiplemodules.

■Theadventandpromulgationofaspect-oriented

programmingawakenedbroaderinterestinthearea,on

thepartofresearchersandpractitionersalike.

■ThetimeisrightforpractitionerstobeginusingAOSD

technology,forresearcherstosolvesomeofthe

challengingproblemsthatremain,andforresearchersand

practitionerstoworktogethertomakeAOSDa

mainstreamsoftwaredevelopmenttechnology.

2009-8-2711

Evolutionofsoftwareprogrammingmethodology

■machine-levelcoding

■higher-levellanguages

■structuredlanguages

■Object-orientedprogramming(OOP)

■Eachnewmethodologypresentsnewwaystodecompose

problems:machinecode,machine-independentcode,procedures,

classes,andsoon.

■Eachnewmethodologyallowedamorenaturalmappingof

systemrequirementstoprogrammingconstructs.

2009-8-2712

thenextbigstep

■OOPhasshownitsstrengthwhenitcomes

tomodelingcommonbehavior.

■However,OOPdoesnotadequatelyaddress

behaviorsthatspanovermany—often

unrelated—modules.

■Incontrast,AOPmethodologyfillsthisvoid.

AOPquitepossiblyrepresentsthenextbig

stepintheevolutionofprogramming

methodologies.

2009-8-2713

Viewthesystemasasetofconcerns

(關(guān)注點,考慮)

■Atypicalsystemmay

consistofseveralkindsof

concerns,including:

businesslogic,performance,

datapersistence,loggingand

debugging,authentication,

security,multithreadsafety,

errorchecking,andsoon.

■development-process

concerns,suchas:

comprehensibility,

maintainability,traceability,

andevolutionease.

2009-8-2714

Concerndecomposition:

Theprism(棱鏡)analogy

2009-8-2715

Modularityproblems

■Scatter(分散)

■tangle(混雜)

■crosscut(橫切、交叉分割)

2009-8-2716

badmodularity

scattering-spreadaround

(分散)

tangling-codeinoneregion

addressesmultipleconcerns

(混雜)

scatteringandtangling(S&T)

tendtoappeartogether;they

describedifferentfacetsof

thesameproblem

2009-8-2717

goodmodularity

separated-implementation

ofaconcerncanbetreated

^>eparateentity

localized-implementation

ofaconcernappearsinone

partofprogram

modular-above+hasa

clear,welldefined

torestofsystem

2009-8-2718

Crosscuttingconcernsinasystem

(橫切、交叉劃分、跨斷)

■coremodule-levelrequirementsandsystem-level

requirements.

■Manysystem-levelrequirementstendtobeorthogonal

(mutuallyindependent)toeachotherandtothe

module-levelrequirements.

■System-levelrequirementsalsotendtocrosscutmany

coremodules.

■Forexample,authentication,logging,resourcepooling,

administration,performance,andstoragemanagement.

■Eachcrosscutsseveralsubsystems.

■Forexample,astorage-managementconcernaffects

everystatefulbusinessobject.

2009-8-2719

Crosscuttingconcernproblems

■therequirementspaceisann-dimensional

space,whereastheimplementationspaceis

one-dimensional.

■Suchamismatchresultsinanawkward

requirements-to-implementationmap.

■Symptoms(癥狀):Codetangling;Code

scattering.

■Implications(導(dǎo)致):Poortraceability,

Lowerproductivity,Lesscodereuse,Poor

codequality,Moredifficultevolution.

■Thecurrentresponse:mix-inclasses,

designpatterns,anddomain-specific

solutions.

2009-8-2720

ThefundamentalsofAOP

■ThemodularizationunitinAOPiscalledanaspect,justasa

commonconcern'simplementationinOOPiscalledaclass.

■AOPinvolvesthreedistinctdevelopmentsteps:Aspectual

decomposition,Concernimplementation,Aspectual

recomposition.

2009-8-2721

example

■publicclassCreditCardProcessor{

publicvoiddebit(CreditCardcard,Currencyamount)

throwsInvalidCardException,NotEnoughAmountException,

CardExpiredException{

//Debitinglogic(取款)

}

publicvoidcredit(CreditCardcard,Currencyamount)

throwsInvalidCardException{

//Creditinglogic(存款)

}

}

■publicinterfaceLogger{

publicvoidlog(Stringmessage);

}

2009-8-2722

weavingrules

■Logeachpublicoperation'sbeginning

■Logeachpublicoperation'scompletion

■Loganyexceptionthrownbyeach

publicoperation

2009-8-2723

theweaverwouldproducecomposedcode:

publicclassCreditCardProcessorWithLogging{

LoggerJogger;

publicvoiddebit(CreditCardcard,Moneyamount)

throwsInvalidCardException,NotEnoughAmountException,

CardExpiredException{

_logger.log("StartingreditCardProcessor.credit(CreditCard,

Money)"+"Card:"+card+"Amount:"+amount);

//Debitinglogic

_logger.log("CompletingCreditCardProcessor.credit(CreditCard,

Money)"+"Card:"+card+"Amount:"+amount);

}

2009-8-2724

publicvoidcredit(CreditCardcard,Moneyamount)

throwsInvalidCardException{

System.out.println("Debiting");

_logger.log("StartingCreditCardProcessor.debit

(CreditCard,Money)''+"Card:"+card+"Amount:"+

amount);

//Creditinglogic

_logger.log("CompletingCreditCardProcessor.credit

(CreditCard,Money)''+"Card:"+card+"Amount:"+

amount);

}

}

2009-8-2725

Anatomy(解剖)ofAOPlanguages

■TheAOPlanguagespecification

■Implementationofconcerns

■Weavingrulesspecificationn:alanguagefor

specifyingrulesforcomposingdifferent

implementationpiecestoformthefinalsystem.

■AOPlanguageimplementation

■Combinetheindividualconcerns

■Converttheresultinginformationintoexecutable

code

2009-8-2726

implementtheweaverinvariousways

■source-to-sourcetranslation

■preprocesssourcecodeforindividualaspectsto

produceweavedsourcecode

■feedthisconvertedcodetothebaselanguage

compilertoproducefinalexecutablecode.

■aJava-basedAOPimplementation

■convertindividualaspectsfirstintoJavasourcecode,

thenlettheJavacompilerconvertitintobytecode.

■Thesameapproachcanperformweavingatthebyte

codeleve

■aVMimplementation

2009-8-2727

AOPbenefits

AOPhelpsovercometheproblemscausedbycodetangling

andcodescattering.HereareotherspecificbenefitsAOP

offers:

■Modularizedimplementationofcrosscuttingconcerns

■Easier-to-evolvesystems

■Latebindingofdesigndecisions

■Morecodereuse

Ingeneral,alooselycoupledimplementationrepresentsthe

keytohighercodereuse.AOPenablesmoreloosely

coupledimplementationsthanOOP.

2009-8-2728

AspectJ

LearnAspectJtobetter

understandaspect-

orientedprogramming

2009-8-2729

AspectJ:AnAOPimplementationforJava

■AspectJ,fromXeroxPARC,isageneral-purpose

aspect-orientedJavaextension.

■AspectJusesJavaasthelanguageforimplementing

individualconcerns,anditspecifiesextensionstoJava

forweavingrules.Theserulesarespecifiedinterms

of:

1.(聯(lián)結(jié)點、交匯點)definespecificpointsina

program'sexecution,

2.Pointcuts(切入點、指定切入點)isthelanguageconstruct

thatspecifiesjoinpoints,

3.Advice(告知)definespiecesofanaspectimplementation

tobeexecutedatpointcuts,

4.aspects(方面)combinestheseprimitives.

■AspectJ'sweaver-anaspectcompiler-combines

differentaspectstogether.

2009-8-2730

AspectJoverview

■AspectJisalanguagespecificationaswellasanAOP

languageimplementation.

■Thelanguagespecificationdefinesvariousconstructs

andtheirsemanticstosupportaspect-orientedconcepts.

AspectJ'slanguageconstructsextendtheJava

programminglanguage.

■Thelanguageimplementationofferstoolsforcompiling,

debugging,anddocumentingcode.AspectJprovides

anaspectweaverintheformofacompiler,anaspect-

awaredebuggeranddocumentationgenerator,anda

standaloneaspectbrowsertovisualizehowanadvice

crosscutsasystem'sparts.

2009-8-2731

AspectJlanguageoverview

TosupportAOP,AspectJaddstotheJavalanguage

concepts:

■Joinpoints:Pointsinaprogram'sexecution.For

example,joinpointscoulddefinecallstospecific

methodsinaclass

■Pointcuts:Programconstructstodesignate

joinpointsandcollectspecificcontextatthose

points

■Advices:Codethatrunsuponmeetingcertain

conditions.Forexample,anadvicecouldloga

messagebeforeexecutingajoinpoint

2009-8-2732

asimpleclasscontainingmethodsto

printamessage:HelloWorld

■〃HelloWorld.java

publicclassHelloWorld{

publicstaticvoidsay(Stringmessage){

System.out.println(message);

}

publicstaticvoidsayToPerson(Stringmessage,

Stringname){

System.out.println(name+","+message);

}

}

2009-8-2733

addinggreetingandgratitude

manners.

■〃MannersAspect.java

publicaspectMannersAspect{

pointcutcallSayMessage():call(publicstatic

voidHelloWorld.say*(..));

before():callSayMessage(){

System.out.println("Goodday!");

}

after():callSayMessage(){

System.out.println("Thankyou!");

}

}

2009-8-2734

addinggreetingandgrgj31^

/TheMannersAspect.java

manners.filedeclaresa

MannersAspectaspect.

■〃MannersAspect.javaTheaspectdefinesa

callSayMessage()pointcut

publicaspectMannersAspethatcapturescallstoall

pointcutcallSayMessage(publicstaticmethodswith

namesthatstartwithsay.

voidHelloWorld.ScItwouldcapturesay()and

before():callSayMessagsayToPerson()ina

System.out.println("GoHelloWorldclass.

)Thenyoudefinetwo

advicesforbeforeand

afterreachingthe

after():callSayMessage(callSayMessage()pointcut:

System.out.printin("Thprinting"Goodday!"and

}"Thankyou!"

}

2009-8-2735

AspectJlanguageconceptsand

constructs--1

■JoinpointsJoinpoints,acentralconceptinAspectJ,are

well-definedpointsinaprogram'sexecution.

■Candidatejoinpointsinclude

■callstoamethod,

■aconditionalcheck,

■aloop'sbeginning,

■oranassignment.

■Joinpointsalsohaveacontextassociatedwiththem.For

example,amethod-calljoinpointcouldhavethetarget

objectanditsargumentaspartofthecontext.

2009-8-2736

AspectJlanguageconceptsand

constructs--2

■Pointcuts,programconstructstodesignatejoinpoints,

letyouspecifyajoinpointcollection.Pointcutsalsolet

youexposecontextatthejoinpointtoanadvice

implementation.

■AspectJmakesthefollowingpointcutsavailable:

■Methodcallandexecution

■Constructorcallandexecution

■Read/writeaccesstoafield

■Exceptionhandlerexecution

■Objectandclassinitializationexecution

■H一iioWoridexample:pointcutcallSayMessage():

call(publicstaticvoidHelloWorld.say*(..));

2009-8-2737

Table1.Calltomethodsandconstructors

pointcuts—callpointcuts

call(publicvoidCalltomyMethod()inMyClass

MyClass.myMethod(String))takingastringargument,

returningvoid,andwithpublic

access

call(voidCalltomyMethod()inMyClass

MyClass.myMethod(..))takinganyarguments,withvoid

returntype,andanyaccess

modifiers

call(*CalltomyMethod()inMyClass

MyClass.myMethod(..))takinganyargumentsreturning

anytype

call(*Calltoanymethodwithname

MyClass.myMethod*(..))Startingin"myMethod"inMyClass

call(夫Calltoanymethodwithname

MyClass.myMethod*(StringStartingin"myMethod"inMyClass

,??))andthefirstargumentisof

Stringtype

zuuy-?-z/38

call(**.myM一thod(??))CalltomyM一thod()inany

classindefaultpackage

call(MyClass.n一w())CalltoanyMyClass'

constructortakingno

arguments

call(MyClass.naw(..))CalltoanyMyClass'

constructorwithany

arguments

call(MyClass+.naw(..))CalltoanyMyClassorits

subclass'sconstructor.

(Subclassindicatedbyuse

ofwildcard)

call(public*Allpublicmethodsinall

com.mycompany,?文?*(??))classesinanypackagewith

com.mycompanytheroot

package

2009-8-2739

Table2.Executionofmethodsandconstructors

pointcuts—executionpointcuts

execution(publicvoidExecutionOfmyMethod()inMyClass

MyClass.myMethod(Strintakingastringargument,returning

g))void,andwithpublicaccess

execution(voidExecutionOfmyMethod()inMyClass

MyClass.myM一thoci(..))takinganyarguments,withvoid

returntype,andanyaccessmodifiers

execution(*ExecutionOfmyMethod()inMyClass

MyClass.myMethod(..))takinganyargumentsreturningany

type

execution(*Executionofanymethodwithname

MyClass.myMethod*(..))Startingin"myMethod"inMyClass

execution(*Executionofanymethodwithname

MyClass.myMethod*(Stristartingin"myMethod"inMyClassand

ng,..))thefirstargumentisofstringtype

2009-8-2740

一x一cution(*ExecutionofmyMethodOin

*.mybfethod(..))anyclassindefaultpackage

一x一cution(MyClass.n一ExecutionofanyMyClass'

w())constructortakingno

arguments

一x一cution(MyClass.n一ExecutionofanyMyClass'

w(..))constructorwithany

arguments

一x一cution(MyClass+.nExecutionofanyMyClassor

一w(..))itssubclass'sconstructor.

(Subclassindicatedbyuse

of'+'wildcard)

一x一cution(public*Allpublicmethodsinall

com.mycompany..*.*(.classesinanypackagewith

.))com.mycompanytheroot

package

2009-8-2741

Table3.Field-accesspointcuts

gat(PrintStr一amExecutionofread-accesstofield

Syst一m.out)outoftypePrintStr一amin

Syst一mclass

s一t(intMyClass.x)Executionofwrite-accesstofieldx

OftypeintinMyClass

Table4.Exception-handlerpointcuts

hander(R一mot一Exc一ptiExecutionofcatch-block

on)handlingR一mot一Exceptiontype

hander(工OExc一ption+)Executionofcatch-block

handlinglOExceptionorits

subclasses

handl一r(Cr一ditCard*)Executionofcatch-block

handlingexceptiontypeswith

namesthatstartwith

Cr一ditCard

2009-8-2742

Table5.Class-initializationpointcuts

staticinitialization(Executionofstaticblockof

MyClass)MyClass

Staticinitialization(Executionofstaticblock

MyClass+)ofMyClassorits

subclass一s

Table6.Lexical-structure-basedpointcuts

ithin(MyClass)AnypointcutinsideMyciass's

lexicalscope

ithin(MyClass*)Anypointcutinsidelexicalscope

ofclasseswithanamethat

startswith"MyClass"

withincod一(*Anypointcutinsidelexicalscope

MyClass.myM一thod(??))ofanymyM一thod()ofMyClass

2009-8-2743

Table7.Control-flow-basedpointcuts

cflow(call(火Allthejoinpointsincontrolflowofcallto

MyClass.myMethod(anymyMethod()inMyClassincludingcall

..))tothespecifiedmethoditself

cflowbelow(call(大Allthejoinpointsincontrolflowofcallto

MyClass.myMethod(anymyMethod()inMyClassexcludingcall

?.))tothespecifiedmethoditself

Table8.Self-,target",andarguments-typepointcuts

this(JComponentAllthejoinpointswherethisisinstanceof

+)JComponent

target(MyClass)Allthejoinpointswheretheobjectonwhich

themethodiscalledisoftypeMyClass

args(String,..,Allthejoinpointswherethefirstargumentis

int)ofStringtypeandthelastargumentisofint

type

args(RemoteExceAllthejoinpointswherethetypeofargument

ption)orexceptionhandlertypeisRemoteException

2009-8-271:-^4

Table9.Conditional-testpointcuts

Lf(EventQueue.isDispatAllthejoinpointswhere

(^hThread())EventQueue.isDispatchThread()

evaluatestotrue

?Namedandanonymouspointcuts

?Use11,&&,and!operatorswithpointcuts

Forexample,

call(*MyClass.ml())||call(*MyClass.m2())

call(*MyClass.ml())&&cflow(call(*MyClass.m2())

!call(*MyClass.ml())

2009-8-2745

Exposingcontext

■AspectJofferstarget(),this(),and

args()pointcutstocollectthecontext,

■Forexample,

pointcut

publicOperationCardAmountArgs(Credi

tCardcard,Moneyamount):

execution(public火

CreditCardProcessor?*(??))&&

args(card,amount);

2009-8-2746

AspectJlanguageconceptsand

constructs-3

?Advicesspecifytheexecutablecodewhenreaching

certainpointcuts.

?AspectJprovidesthreewaystoassociateanadvicewith

ajoinpoint:

?Abeforeadvicerunsjustbeforethejoinpoint,

?whereasanafteradvicerunsjustafter.

?Anaroundadvicesurroundsajoinpointandhas

controlifthejoinpoint'sexecutionshouldproceed.

2009-8-2747

before():call(public*MyClass.*(..)){

System.out.println(nBefore:''+thisJoinPoint+''''+

System.currentTimeMillisO);

}

after():call(public*MyClass.*(..)){

System.out.println(nAfter:''+thisJoinPoint+"”+

System.currentTimeMillisQ);

voidaround(Connectionconn):calI(Connection.close())&&target(conn){

if(enablePooling){

connectionPool.put(conn);

}else{

proceedQ;

2009-8-2748

AspectJlanguageconceptsand

constructs-4

?AspectsactasAspectJ'sunitofmodularization.Itputs

togetherpointcutsandadvices.

?Aspectsresembleclasses:anaspectcancontain

methodsandfields,extendotherclassesoraspects,and

implementinterfaces.However;youcannotcreatean

objectforanaspectusingn一w.

?AspectJdoesnotallowclassestocontainadvices;only

aspectscancontainadvices.

?Aconcreteaspectextendinganabstractaspectcanthen

provideconcretedefinitionsofabstractpointcuts.

2009-8-27

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論