版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 貴金屬鉑市場需求與消費特點分析
- 風(fēng)力發(fā)電機組產(chǎn)品市場需求分析報告
- 磁卡鎖產(chǎn)品營銷計劃書
- 轉(zhuǎn)向系統(tǒng)膠管產(chǎn)品原材料供應(yīng)與需求分析
- 眼科光學(xué)器具產(chǎn)品原材料供應(yīng)與需求分析
- 玻璃纖維制品產(chǎn)品市場需求分析報告
- 高壓氧艙產(chǎn)品營銷計劃書
- 電子計步器市場發(fā)展預(yù)測和趨勢分析
- 玻璃鋼制品產(chǎn)品原材料供應(yīng)與需求分析
- 麻將桌產(chǎn)品原材料供應(yīng)與需求分析
- 【新課標(biāo)】Unit 1 How can I get there- 單元整體教學(xué)設(shè)計(表格式共5個課時)
- 電子維修員考試題目及答案
- 2024年八年級物理上冊 2.3 測量物體運動的速度教案 (新版)教科版
- 護理人才梯隊建設(shè)方案(2篇)
- 2024版《保密法》培訓(xùn)課件
- 縣高標(biāo)準(zhǔn)農(nóng)田建設(shè)統(tǒng)一上圖入庫實施方案
- 項痹中醫(yī)護理方案優(yōu)化(2篇)
- 2024年焊工(初級)證考試題庫及答案(900題)
- 超市轉(zhuǎn)讓營業(yè)執(zhí)照和煙草證協(xié)議
- 2024年廣東省深圳市選調(diào)生考試(行政職業(yè)能力測驗)綜合能力測試題匯編
- Sketchup-入門指南-和-概念指南
評論
0/150
提交評論