翻譯文獻(xiàn)-第二章 架構(gòu)_第1頁
翻譯文獻(xiàn)-第二章 架構(gòu)_第2頁
翻譯文獻(xiàn)-第二章 架構(gòu)_第3頁
翻譯文獻(xiàn)-第二章 架構(gòu)_第4頁
翻譯文獻(xiàn)-第二章 架構(gòu)_第5頁
已閱讀5頁,還剩8頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

外文原文CHAPTER2ARCHITECTUREINTHEORYTHEREISNODIFFERENCEBETWEENTHEORYANDPRACTICEBUT,INPRACTICE,THEREISJANLAVANDESNEPSCHEUTARCHITECTUREITSTHATLEVELABOVEDESIGNWHEREWEGETOURFIRSTGLIMPSEOFWHATTHESYSTEMWILLULTIMATELYRESEMBLE,HOWITWILLBEBUILT,THEVISIONOFTHEAPPLICATIONANDSYSTEMASAWHOLEBYKEEPINGTHEADVICECONTAINEDINTHEITEMSTHATFOLLOWINMINDWHENLAYINGOUTTHEBASICFLOWANDDESIGNOFYOURENTERPRISEAPPLICATIONSANDSYSTEMS,YOULLMAKEPROGRESSTOWARDANOBLEGOALESTABLISHINGANARCHITECTURETHATENABLESAHIGHPERFORMANCE,HIGHSCALABILITYENTERPRISESYSTEMITEM1PREFERCOMPONENTSASTHEKEYELEMENTOFDEVELOPMENT,DEPLOYMENT,ANDREUSEONEOFTHEDIFFICULTIESMANYJAVADEVELOPERSFACEWHENATTEMPTINGTHEIRFIRSTJ2EEBASEDPROJECTISTHATJ2EEAPPLICATIONSAREBUILTDIFFERENTLYTHANTRADITIONALJAVAAPPLICATIONSRATHERTHANBUILDINGAPPLICATIONS,J2EEMANDATESTHECONSTRUCTIONOFCOMPONENTSTHATPLUGINTOANALREADYEXISTINGAPPLICATION,THATBEINGTHEJ2EECONTAINERITSELFTHISMAYNOTSEEMLIKEALARGEDIFFERENCEATFIRST,BUTITSIMPLICATIONSAREHUGE,INTWODIFFERENTDIRECTIONSFIRSTOFALL,THISMEANSTHATDEVELOPERSARENTREALLYINTERESTEDINCONSTRUCTINGOBJECTSPERSEBUTINCREATINGSTRONGLYENCAPSULATEDCOMPONENTSTHATINTHECASEOFJ2EEAREMADEUPOFTIGHTLYCOUPLEDCONSTITUENTOBJECTSSECOND,ITMEANSTHATTHEREAREASETOFSTRINGENTRULESTHATMUSTBEOBEYEDOVERWHICHWE,ASTHECOMPONENTBUILDER,HAVELITTLETONOINFLUENCEDEVELOPERSSTUDYINGTHEOBJECTORIENTEDPARADIGMHAVE,SINCETHEVERYEARLYDAYS,BEENREPEATEDLYTAUGHTTOPROMOTEENCAPSULATIONANDDATAHIDINGWEVEALLMEMORIZEDNUGGETSOFWISDOMHANDEDDOWNFROMONHIGH,SUCHAS“NEVERUSEPUBLICFIELDSINSTEADALWAYSCREATEACCESSORANDMUTATORMETHODSGETTERSANDSETTERS,INJAVABEANSLINGO,“FOREXAMPLE,OR“HIDEYOURIMPLEMENTATIONFROMCLIENTVIEW,“ANDSOONASARESULT,FOREVERYCLASSEVERWRITTEN,WEFAITHFULLYCREATEGET/SETMETHODPAIRSFOREVERYPRIVATEDATAFIELD,CREATEADEFAULTCONSTRUCTOR,ANDSOONUNFORTUNATELY,THISISHARDLYWHATTHEORIGINALPROPONENTSOFOBJECTORIENTATIONHADINMINDMERELYFORCINGCLIENTSTOGOTHROUGHAGETMETHODTOGETAREFERENCETOSOMEINTERNALLYHELDDATASTRUCTUREDOESNTCREATEENCAPSULATIONTHISHASLONGBEENDOCUMENTEDINSUCHBOOKSASEFFECTIVECMEYERS95AND,MORERECENTLY,EFFECTIVEJAVABLOCH,ITEM24MOREIMPORTANTLY,ITUNFORTUNATELYLEADSDEVELOPERSTOTHINKATASCALETOOSMALLFOREFFECTIVEREUSE,THATOFOBJECTSANDCLASSES,RATHERTHANTHINKINGATALARGERSCALE,SUCHASWHATWASORIGINALLYINTENDEDBYTHEJAVABEANSSPECIFICATIONNOTCONVINCEDCONSIDERATRADITIONALCOLLECTIONCLASS,SAY,ANARRAYLISTWECANUSETHEARRAYLISTASANINDEPENDENTOBJECT,BUTWHENITCOMESTIMETOWALKOVERTHECONTENTSOFTHECOLLECTIONITSELF,ANOTHEROBJECT,ANITERATORIMPLEMENTINGOBJECT,BECOMESDESIRABLE,IFNOTOUTRIGHTNECESSARYTHINKINGABOUTREUSEATTHECLASS/OBJECTLEVELMEANSWESERIOUSLYCONSIDERREUSINGTHEITERATORIMPLEMENTINGCLASSINDEPENDENTLYOFTHEARRAYLISTITSBOUNDTO,WHICHMAKESNOSENSEINSTEAD,BECAUSETHETWOAREINTENDEDTOBEUSEDASAPAIR,ITMEANSTHATWERELOOKINGATREUSEATAHIGHERLEVEL,WHATWEREFERTOASACOMPONENTINPRACTICALTERMS,THISUSUALLYMEANSASTANDALONEJARFILETHATCONTAINS,INTHISCASE,THEPAIROFCLASSESFORARRAYLISTANDITSINTERNALITERATORSUBTYPEINTHECOLLECTIONSCASE,ITWOULDALSOINCLUDERELEVANTINTERFACESLIKEITERATOR,COLLECTION,ANDLISTBECAUSETHEYALLHELPDEFINETHECONTRACTCLIENTSCANPLACEFAITHINTHISGETSUSINTOADISCUSSIONOFCOUPLINGTHEDEFINITIONOFTIGHTCOUPLINGSTATESTHATAGIVEN“THING“ISTIGHTLYCOUPLEDTOANOTHER“THING“IFONEHASTOCHANGEINRESPONSETOCHANGESINTHEOTHERINOTHERWORDS,CONSIDERARRAYLISTIFICHANGETHEDEFINITIONOFTHECOLLECTIONINTERFACE,WILLARRAYLISTNEEDTOCHANGEABSOLUTELY,SINCEITIMPLEMENTSCOLLECTIONTHROUGHLISTIFICHANGEARRAYLISTSINTERNALIMPLEMENTATION,WILLITSINTERNALITERATORIMPLEMENTATIONNEEDTOCHANGEABSOLUTELYHOWEVER,WILLCLIENTSNEEDTOCHANGENOTSOLONGASTHEYTREATTHEITERATORASAGENERALPURPOSEITERATORANDDONTDOWNCASTARRAYLISTISTIGHTLYCOUPLEDTOITSINTERNALITERATOR,ANDVICEVERSA,BUTCLIENTSCANREMAINLOOSELYCOUPLEDBYSTICKINGTOTHEINTERFACESLOOSECOUPLINGISEXPLAINEDINGREATERDETAILINITEM2,BUTINEEDTOFORWARDREFERENCEITHEREDONTSEETHERELEVANCERUNONOVERTOTHESERVLETBASEDWEBAPPLICATIONSIFWEOBEYTHETRADITIONALMODELVIEWCONTROLLERABSTRACTION,1THENWEREBUILDINGAMINIMUMOFTWOCLASSESTHATAREMOREORLESSTIGHTLYCOUPLEDTOONEANOTHERTHECONTROLLERSERVLETTHATDOESTHEINPUTPROCESSINGONANINCOMINGHTTPREQUEST,ANDTHEVIEWJSPTHATITFORWARDSTOTHECONTROLLERNEEDSTOKNOWWHATDATAELEMENTSTHEVIEWDEPENDSON,THEVIEWNEEDSTOKNOWWHATPROCESSINGHASALREADYBEENDONEBYTHECONTROLLERSOASNOTTODUPLICATETHATWORK,ANDTHETWOHAVETOAGREEONTHENAMESUNDERWHICHTHEDATAELEMENTSTHEVIEWDEPENDSONWILLBEBOUNDTHENAMEVALUEATTRIBUTESOFHTTPSESSIONPROVIDELATEBINDINGBUTNOTLOOSECOUPLINGAGAIN,SEEITEM2FORMOREINADDITION,BOTHCONTROLLERANDVIEWARETHEMSELVESTIGHTLYCOUPLEDAGAINSTTHEMODELCLASSES,SINCETHEYWILLNEEDTOKNOWWHATDATAELEMENTSAREPRESENTASPARTOFTHEMODELSUSEDASKYOURSELFTHESEQUESTIONSISITREALLYFEASIBLETOCONSIDERREUSINGTHECONTROLLERWITHOUTTHECORRESPONDINGVIEWAND/ORMODELCLASSESCOULDTHEVIEWEXECUTESUCCESSFULLYWITHOUTGOINGTHROUGHTHECONTROLLERSERVLETFIRST1THISISACTUALLYAMISNOMERTHEAPPROPRIATEPATTERNINQUESTIONISREALLYTHEPRESENTATIONABSTRACTIONCONTROLLERPOSA1,145,SINCETHEMODELVIEWCONTROLLERDEALSWITHMULTIPLEVIEWSANDTHEIRUPDATESIMULTANEOUSLY,SUCHASISCOMMONLYFOUNDINAGUIAPPLICATIONLIKEEXCELORWORDBECAUSETHEANSWERTOTHISQUESTIONISALMOSTUNIVERSALLY“NO,“ITMEANSTHATYOURCLASSESWITHINAGIVENCOMPONENT,INTHISCASEYOURPRESENTATIONLAYERCOMPONENT,AREIMPLICITLYTIGHTLYCOUPLEDTOONEANOTHERTHATINTURNYIELDSAREALIZATIONWHERETIGHTCOUPLINGALREADYEXISTS,WECANENJOYACERTAINAMOUNTOFRELAXATIONOFTHETRADITIONAL“ENCAPSULATEEVERYTHING“RULETHATWEOBEYSOMINDLESSLYIMNOTSUGGESTINGTHATYOUIMMEDIATELYRUNOUTANDREMOVEALLYOURGET/SETMETHODSINFAVOROFDIRECTFIELDACCESS,BUTIRECOMMENDTHATYOUTHINKLONGANDHARDABOUTWHATYOUREREALLYPROTECTINGAGAINSTFOREXAMPLE,IFYOURMODELOBJECTSARENTUSEDOUTSIDEOFTHEPRESENTATIONLAYERNOTETHETERMINOLOGYSEEITEM3ITSELF,DOESITREALLYMAKESENSETOPUTGET/SETMETHODSINFRONTOFEACHFIELD,PARTICULARLYWHERETHEMODELOBJECTSAREJUSTTHINWRAPPERSOVERACOLLECTIONOFDATA,ASWITHDATATRANSFEROBJECTSFOWLER,401REMEMBERTHATENCAPSULATIONWASDESIGNEDTOPROTECTCLIENTSAGAINSTIMPLEMENTATIONCHANGES,NOTTHECOMPONENTAGAINSTCHANGESWITHINITSELFFEWDEVELOPERSEVERSAWBENEFITSINTRYINGTOENCAPSULATEACLASSAGAINSTITSELFTHINKOFTHECOMPONENTASALARGER,MORECOARSEGRAINEDCLASS,ANDYOURENOTTOOFAROFFTHEMARKGIVENTHATWEHAVECLASSESTHATTIGHTLYCOOPERATEWITHONEANOTHERTOACHIEVESOMEUSEFULWORK,ANDTHATTHOSECLASSESNEEDTOBEDEPLOYEDTOGETHERATOMICALLYORELSENOTATALL,WERELOOKINGFORSOMETHING“LARGERTHANOBJECTS“ASTHEPRINCIPALUNITOFDEPLOYMENTINOTHERWORDS,WERELOOKINGFORCOMPONENTSTHESERVLETSPECIFICATIONHASMOVEDAWAYFROMTHEIDEAOFSTANDALONESERVLETSBEINGDEPLOYEDINDIVIDUALLYINTOTHESERVLETCONTAINERANDINSTEADEMBRACESTHEIDEAOFAWEBAPPLICATION,ACOLLECTIONOFRESOURCESLIKESERVLETS,JSPS,MODELCLASSES,UTILITYLIBRARIES,ANDSTATICRESOURCESLIKEHTML,IMAGES,AUDIOFILES,ANDSOONTHATCOLLECTIVELYWORKTOGETHERTOPROVIDEDESIREDFUNCTIONALITYTHEWEBAPPLICATIONISDEPLOYEDCOLLECTIVELYUNDERASINGLEWARFILE,SOTHATTHEREISNOPOSSIBLEWAYFORAONLYPARTOFTHEAPPLICATIONTOBEDEPLOYED,ORBTHEAPPLICATIONTOBEVERSIONMISMATCHEDBETWEENITSCOLLECTIVEPARTSINESSENCE,THEWARFILESERVESTHESAMEPURPOSETHATTHEJAVAJARFILEDIDINMAKINGJAVAAPPLICATIONDEPLOYMENTSEASIERIFYOUDIDJAVAINTHE10DAYS,YOULLREMEMBERTHE“UNZIPTHECLASSESONTOYOURCLASSPATH“STYLEOFDEPLOYMENTANDAGREETHATTRYINGTODEPLOYJAVAAPPLICATIONSINTHOSEDAYSWASLESSTHANELEGANTINSTEAD,THEATOMICDEPLOYMENTPROVIDEDBYTHEWARFILEMEANSTHATONLYTHOSERESOURCESTHATARESUPPOSEDTOBEPARTOFTHEWEBAPPLICATIONACTUALLYSHOWUPINTHEDEPLOYEDAPPLICATIONTHATIS,UNLESSYOUDELIBERATELYSCREWTHATUPBYDOINGPARTIALFILEBASEDDEPLOYMENTSBYCOPYINGINDIVIDUALFILESOVERINTOTHEDEPLOYEDAPPLICATIONDIRECTORYTHERESACOUPLEOFREASONSWHYTHISISABADIDEA,NOTTHELEASTOFWHICHISTHEPOSSIBILITYOFINTRODUCINGVERSIONMISMATCHESWHILEITMAYSEEMTEMPTINGTO“ONLYCOPYTHESTUFFTHATCHANGED“INTOTHEDEPLOYMENTDIRECTORY,ITSTOOEASYFORHUMANSTOLOSETRACKOFEXACTLYWHATHASCHANGEDAND,MOREIMPORTANTLY,TOFORGETTHATTHESERVLETCONTAINERDOESNTNECESSARILYTAKETHESAMEVIEWOFWHATHASCHANGEDASWEDOENTERTHECLASSLOADERREMEMBERHIMHESESTABLISHEDBYTHESERVLETCONTAINERTOLOADYOURWEBAPPLICATIONFROMDISKINTOTHEJVMTHESERVLETCONTAINERISREQUIREDTOSTARTANEWCLASSLOADEREACHTIMETHEWEBAPPLICATION“CHANGES,“WHICHUSUALLYMEANS“CHANGESONDISKINTHEDEPLOYMENTDIRECTORY“BUTIFYOUREADTHESERVLETSPECIFICATIONCAREFULLY,YOULLNOTICETHATWHENANEWCLASSLOADERISSTARTED,ITSESTABLISHEDOVERTHEENTIREWEBAPPLICATION,NOTANINDIVIDUALSERVLETITDOESTHISSOTHATEACHOFTHOSECLASSESTHATFORMTHEWEBAPPLICATIONAREALLLOADEDBYTHESAMECLASSLOADER,SINCETHECONTAINERSEESTHESEASASINGLECOMPONENTSOITSENTIRELYCONCEIVABLETHATEACHFILECOPIEDINTOTHEDEPLOYMENTDIRECTORYWILLYIELDANEWCLASSLOADERINSTANCE,CREATINGAWHOLETONOFEXTRAWORKFORTHECONTAINERANDYIELDINGNOTANGIBLEBENEFITBYTHEWAY,MAKESUREYOUUNDERSTANDWHATTANGIBLEEFFECTSTHISCLASSLOADINGPOLICYWILLYIELDTOYOUDIRECTLYBYREADINGITEM70THEPOINTOFALLTHISISTHATTHESERVLETANDOTHERJ2EESPECIFICATIONSEXPECTYOUTOBUILDWEBAPPLICATIONSTHATCOMBINETOFORMCOMPONENTS,NOTINDIVIDUALCLASSESTHEJSPSPECIFICATIONGOESONESTEPFURTHERITPROMOTESTHECONSTRUCTIONANDUSEOFSMALLERCOMPONENTSWITHINANDACROSSWEBAPPLICATIONSBYFOSTERINGTHECONCEPTOFREUSABLETAGLIBRARIESTHESPECIFICATIONSCOULDCARELESSWHATOBJECTSYOUCREATEANDUSE,SOLONGASTHOSEOBJECTSTHATAREHANDEDBACKTOTHECONTAINERITSELFOBEYCERTAINCONTRACTS,ASCONVEYEDVIAINTERFACES,ANDCERTAINOUTOFBANDRESTRICTIONSDESCRIBEDINTHESPECIFICATIONITSELFITSMORETHANJUSTIMPLEMENTINGEXISTINGINTERFACES,HOWEVERPARTOFBEINGACOMPONENTMEANSTHATBECAUSEYOUDIDNTWRITEMAIN,YOUDONTNECESSARILYKNOWTHEENVIRONMENTINWHICHYOURCODEISBEINGEXECUTEDONECLASSICMISTAKETHATBITESSERVLETDEVELOPERSTHEWORLDOVERASTHEYMOVEFROMONESERVLETCONTAINERTOTHENEXTISTHESIMPLEASSUMPTIONREGARDING“THECURRENTDIRECTORY“FORSOMESERVLETCONTAINERS,ITSTHEDIRECTORYINWHICHTHECONTAINERSEXECUTABLEFILESARELOCATEDTOMCAT/BIN,FOREXAMPLEFOROTHERCONTAINERS,HOWEVER,THEYSETA“WORK“DIRECTORYINWHICHBITSANDPIECESOFTHEWEBAPPLICATIONAREASSEMBLEDANDCALLEDTHENETRESULTISTHATIFYOUTRYTOLOADATEXTFILEFROMYOURWEBAPPLICATIONSDEPLOYMENTDIRECTORYBYCREATINGAFILEINPUTSTREAMWITHANARGUMENTOF/WEBAPPS/MYAPP/DATAXML,WHATWORKSONONESYSTEMWILLHORRIBLYBREAKONANOTHERFORTHISREASON,THESERVLETSPECIFICATIONSUGGESTSUSINGEITHERTHESERVLETCONTEXTGETRESOURCEORSERVLETCONTEXTGETRESOURCEASSTREAMMETHODS,BOTHOFWHICHAREALSOAVAILABLEONTHECLASSLOADERFORTHEWEBAPPLICATIONINFACT,THISCONCEPTOF“CONTEXT“TAKESONANIMPORTANTMEANINGINCOMPONENTBASEDENVIRONMENTSTHECONTEXT,SUCHASTHESERVLETCONTEXTINSERVLETAPPLICATIONS,ORTHEENTERPRISEBEANCONTEXTSESSIONCONTEXT,ENTITYCONTEXT,ORMESSAGEDRIVENCONTEXTINEJB,ISTHECOMPONENTSOFFICIAL“WINDOWTOTHEOUTSIDEWORLD,“ANDANYANDALLACCESSTOTHATOUTSIDEWORLDSHOULDTAKEPLACETHROUGHTHECONTEXTTHISGIVESTHECONTAINERTHEOPPORTUNITYTOINTERCEPTANDREDIRECTAPPLICATIONREQUESTSTOTHEAPPROPRIATEPLACE,IFTHECONTAINERISDOINGSOMETHINGTRICKYUNDERTHEHOODHIDDENFROMTHECODESVIEWFOREXAMPLE,WHENYOUWANTTODOAFORWARDFROMASERVLETTOAJSP,YOUAREREQUIREDTOGOTHROUGHTHESERVLETCONTEXTTOGETAREQUESTDISPATCHERTODOTHEACTUALFORWARDBECAUSEACLUSTERINGCONTAINERMAYHAVEDECIDEDTOPUTTHEJSPPAGEONADIFFERENTMACHINETHANTHEONEEXECUTINGTHESERVLETASARESULT,IFYOUWERETODIRECTLYTRYTOACCESSTHESERVLETINSTANCEINSIDETHEJVM,SUCHASWEUSEDTOVIATHEGETSERVLETCALL,THEREQUESTWOULDFAILMISERABLYINSOMERESPECTS,THISISALSOWHYTHEJAVANAMINGANDDIRECTORYINTERFACEJNDIWASINVENTEDTOPROVIDEACOMMONAPIFORLOOKINGUPRESOURCESRATHERTHANHAVINGTOUSEPERSPECIFICATIONAPISSUCHASTHATPROVIDEDBYTHERMINAMINGCLASSITSNOACCIDENTTHATTHEJNDISTARTINGPOINTISCALLEDANINITIALCONTEXTASMAYNOWBEAPPARENTTOYOU,WRITINGCOMPONENTSISDIFFERENTFROMWHATYOUMAYHAVEEXPECTEDFROMAPPLICATIONDEVELOPMENTINFACT,WHENWRITINGCOMPONENTSYOURENOTDOINGAPPLICATIONDEVELOPMENTATALLYOUREWRITINGLIBRARIESTHATAREBEINGCALLEDBYANEXISTINGAPPLICATIONPARTOFBEINGACOMPONENTINSTEADOFANAPPLICATIONISTHATYOURCODEMUSTTAKEONTHESAMEKINDSOFCHARACTERISTICSTHATMAKEWRITINGLIBRARIESAGAIN,ASOPPOSEDTOAPPLICATIONSSOMUCHFUNFOREXAMPLE,INORDERTOBESTPROMOTEINDIVIDUALCOMPONENTFLEXIBILITY,ITSUSUALLYBETTERTODEFINETYPESEXPOSEDTOTHELIBRARYCLIENTINTERMSOFINTERFACES,RATHERTHANACTUALCONCRETEOBJECTSBLOCH,ITEM16,PARTICULARLYSINCETHATENABLESYOURCOMPONENTSTOPROVIDEANINTERESTING“HOOKPOINT“SEEITEM6FORFUTUREUSEOFCOURSE,INLARGEMEASURETHISISALREADYTRUEFORBUILDINGCOMPONENTSDIRECTLYACCESSEDBYTHEJ2EECONTAINER,SUCHASSERVLETSREMEMBERJAVAXSERVLETSERVLETANDEJBSJAVAXEJBSESSIONBEAN,JAVAXEJBENTITYBEAN,ANDJAVAXEJBMESSAGEDRIVENBEANBUTTHISCANALSOBETRUEFORYOUROWNDOMAINCLASSES,SUCHASYOURHTTPSESSIONBOUNDMODELOBJECTS,FORTHESAMEREASONSTOWARDTHISEND,YOULLALSOWANTTOPAYCAREFULATTENTIONTOHOWCLIENTSCONSTRUCTYOURDOMAINOBJECTSBLOCH,ITEM1,WHETHERYOUPERMITOTHERSTOINHERITFROMYOURDOMAINOBJECTSBLOCH,ITEM15,ANDWHATKINDSOFTYPESYOUHANDBACKFROMYOURCOMPONENTSBLOCH,ITEM34ONEIMPORTANTREALIZATIONFROMTHISISTHEFACTTHATJ2EECOMPONENTS,WITHVERYLITTLEEXCEPTION,AREENTIRELYPASSIVEENTITIESINOTHERWORDS,J2EECOMPONENTSMUSTBORROWALOGICALTHREADOFCONTROLFROMTHECONTAINERINORDERTOCARRYOUTANYMEANINGFULWORKTHISNOTIONOFTHELOGICALTHREADOFCONTROL,USUALLYEXPRESSEDASANACTUALTHREADITSELFINOTHERWORDS,THECONTAINERCALLSINTOYOURCODEUSINGATHREADTHATITCREATED,USUALLYINRESPONSETOANENDUSERREQUESTSOMEWHEREBACKUPTHECHAIN,ISOFTENCALLEDANACTIVITYORCAUSALITY,ANDITMEANSTHATYOUSHOULDNTWRITECOMPONENTSTHATEXPECTTODOANYTHINGTOOOBSESSIVEWITHTHATBORROWEDTHREADDONTGOOFFANDCALCULATEPITOTHEHUNDREDTHDIGIT,FOREXAMPLEBECAUSETHECONTAINEREXPECTSTOGETTHATLOGICALTHREADOFCONTROLBACKATSOMEPOINTIFITDOESNT,ITCOULDVERYWELLCONSIDERTHATYOURCOMPONENTHASHUNGANDDECIDETOUNLOADYOURCOMPONENTINSTANCEENTIRELYTHISCREATESABITOFAQUANDARYWITHINTHEJ2EESPECIFICATIONBECAUSEFREQUENTLYTASKSCANTBEACCOMPLISHEDINANYREASONABLEFASHIONEXCEPTBYHAVINGATHREADUNDERPERSONALCONTROLCLASSICEXAMPLESARETHEDESIRETOPOLLSOMEEXTERNALRESOURCEEVERYNSECONDS,TOPERFORMSOMEKINDOFMAINTENANCEORNIGHTLYOPERATIONATMIDNIGHTEVERYNIGHT,ANDSOONTHISFUNCTIONALITYISCOMINGASPARTOFTHEEJB21SPECIFICATIONINTHEFORMOFTHETIMERSERVICE,BUTFORTHOSEWORKINGWITHCONTAINERSTHATPREDATETHATSPECIFICATION,NOSTANDARDJ2EESOLUTIONEXISTS,EXCEPTTOWRITEASTANDALONEAPPLICATIONTHATCALLSINTOTHECONTAINERVIAHTTPREQUEST,EJBSESSIONBEANCALL,ORJMSMESSAGEQUEUEDELIVERY,THEREBYGIVINGTHECONTAINERTHATLOGICALTHREADOFCONTROLULTIMATELY,AGAIN,THEKEYCHARACTERIZATIONOFTHEJ2EEAPPLICATIONISITSCOMPONENTCENTRICNATURE,ANDASAJ2EEDEVELOPER,YOUHAVETOPLAYINTOTHATMODELYOURSELFFAILURETODOSOMEANSSWIMMINGUPSTREAMAGAINSTTHEDECISIONSESTABLISHEDBYTHEJ2EECONTAINER,ANDINMANYCASESTHISRESULTSINALARGEAMOUNTOFCODETHATCONTRADICTSTHEPOLICIESESTABLISHEDBYTHECONTAINERWHILEYOUMAYBEABLETOGETAWAYWITHITINTODAYSVERSIONOFTHECONTAINER,DONTBESURPRISEDIFTOMORROWSVERSIONSUDDENLYBREAKSYOURCODEINSTEAD,GOWITHTHECURRENTBYEMBRACINGTHECOMPONENTCONCEPT,ANDWHEREYOUNEEDTOESCAPETHECONTAINERFORSOMEREASON,DOSOBYWRITINGASTANDALONEDAEMONPROCESSORAPPLICATION中文翻譯第二章架構(gòu)理論與實踐之間,從理論的角度來看沒有差異;然而,從實踐的角度來看,差異確實存在。JANLAVANDESNEPSCHEUT架構(gòu)這是一個位于設(shè)計之上的層次,在此我們能夠瞥見系統(tǒng)的最終輪廓、它將如何被構(gòu)建,以及整個應(yīng)用和系統(tǒng)的總體視圖。當(dāng)你為企業(yè)級應(yīng)用和系統(tǒng)規(guī)劃基本流程和設(shè)計的時候,牢記以下項中包含的建議,你就能向優(yōu)雅的目標(biāo)邁進(jìn)建立一個能夠?qū)Ω咝阅?、高可擴(kuò)展性的企業(yè)級系統(tǒng)提供支撐的架構(gòu)。第1項優(yōu)先采用構(gòu)件作為開發(fā)、部署和重用的核心元素許多JAVA開發(fā)者在首次嘗試構(gòu)建基于J2EE的項目時,面臨的諸多困難之一,就是J2EE應(yīng)用的構(gòu)建方式不同于傳統(tǒng)的JAVA應(yīng)用J2EE不是構(gòu)建應(yīng)用,而是委托現(xiàn)有的應(yīng)用來生成要插入的構(gòu)件的結(jié)構(gòu),這個現(xiàn)有的應(yīng)用即J2EE容器自身。乍一看似乎區(qū)別不大,但從兩個不同的方面來看,其實隱含了巨大區(qū)別。首先,這表明開發(fā)者不再對構(gòu)建對象本身感興趣,而是專注于創(chuàng)建嚴(yán)密封裝的構(gòu)件,在J2EE環(huán)境中,構(gòu)件由構(gòu)成其的互相緊耦合的對象組成。第二,這表明我們必須遵守一系列嚴(yán)苛的規(guī)則,即使是作為構(gòu)件的開發(fā)者,我們也不能違反這一點。學(xué)習(xí)面向?qū)ο蠹夹g(shù)的開發(fā)者,從很早的時候起,就不斷地被告誡,要提倡封裝和數(shù)據(jù)隱藏。我們都還記得大師們教導(dǎo)的金玉良言。例如,“絕不使用公有域(PUBLICFIELD);而是編寫讀取器(ACCESSOR)和修改器(MUTATOR)方法(用JAVABEAN術(shù)語表示,就是GETTER和SETTER方法)”,或是“對客戶的視圖隱藏你的實現(xiàn)”。因此,對曾經(jīng)寫過的每個類,我們都忠實地為每個私有字段加上GET/SET方法對,以及編寫缺省構(gòu)造器等等。遺憾的是,這樣就幾乎偏離了面向?qū)ο筇岢邆冊瓉淼南敕?。僅僅強迫客戶使用GET方法,以得到對某個內(nèi)部持有的數(shù)據(jù)結(jié)構(gòu)的引用,并不能稱為封裝。這個問題很久之前就已經(jīng)在EFFECTIVECMEYERS95一書里指出了,更近一點的,EFFECTIVEJAVABLOCH,第24項也同樣指出了這個問題。更嚴(yán)重的是,這會誤導(dǎo)開發(fā)者在過于小的規(guī)模下(類和對象)考慮有效重用問題,而不是像JAVABEAN規(guī)范最初的意圖那樣,在較大的規(guī)模下去考慮重用。還不相信讓我們考慮一個常見的集合類,比如ARRAYLIST。我們可以把ARRAYLIST作為單獨對象使用。不過要是想遍歷集合的內(nèi)容,如果不是明顯地必需的話,至少也是希望能夠用另一個對象,也就是ITERATOR實現(xiàn)類的對象。在類/對象的層次考慮重用,意味著我們要著重于考慮對“獨立于ARRAYLIST綁定的ITERATOR實現(xiàn)類”進(jìn)行重用,這顯然沒有意義。由于這兩個類本來就應(yīng)該成對使用,所以這意味著我們應(yīng)該在更高層次去考慮重用,這也就是我們稱為構(gòu)件(COMPONENT)的層次。在實際環(huán)境下,它通常是一個單獨的JAR文件,在本例中它里面包含了兩個類ARRAYLIST及其內(nèi)部的ITERATOR子類型。在使用COLLECTION接口的情況下,還要包括像ITERATOR、COLLECTION和LIST這樣的相關(guān)接口,因為它們作為一個整體共同定義了客戶能夠信任的契約。這把我們帶入了對耦合的討論。緊耦合的定義是,如果一個給定的“事物”必須做出變化,以適應(yīng)另一“事物”的變化,我們就稱前者緊耦合于后者。換句話說,考慮ARRAYLIST,如果我改變了COLLECTION接口的定義,ARRAYLIST需要改變嗎當(dāng)然要,因為ARRAYLIST通過LIST也實現(xiàn)了COLLECTION接口。如果我改變ARRAYLIST的內(nèi)部實現(xiàn),那么其內(nèi)部的ITERATOR實現(xiàn)需要改變嗎當(dāng)然要。不過,客戶端代碼需要改變嗎不久之前客戶端代碼還把ITERATOR當(dāng)作通用類型的ITERATOR(并且沒有向下轉(zhuǎn)型)。盡管ARRAYLIST與其內(nèi)部的ITERATOR緊密耦合(反之亦然),不過只要客戶端代碼嚴(yán)格遵循接口編程,就能與ARRAYLIST保持松耦合關(guān)系。(松耦合將在第2項中進(jìn)行詳細(xì)討論,不過這里我要提前引用一下。)還沒看到聯(lián)系嗎我們考慮一個基于SERVLET的WEB應(yīng)用程序。如果我們遵循傳統(tǒng)的模型視圖控制器模式(MVC)1,那么至少要編寫兩個類,它們或多或少是緊耦合關(guān)系控制器SERVLET用來對進(jìn)入的HTTP請求進(jìn)行處理,然后把請求轉(zhuǎn)發(fā)到視圖JSP??刂破餍枰酪晥D。1這里其實有點用詞不當(dāng)符合題意的恰當(dāng)模式是表示抽象控制器模式的這些過程,除此之外還可以參考(PRESENTATIONABSTRACTIONCONTROLLER)POSA1,145,因為MVC用來處理多個視圖,并且視圖能同步更新,這種方式在EXCEL或WORD這樣的GUI應(yīng)用中很常見。所依賴的數(shù)據(jù)元素,視圖需要知道控制器已經(jīng)做了哪些處理,以免重復(fù)工作。二者必須對視圖所依賴的數(shù)據(jù)元素被綁定的名稱達(dá)成一致。(HTTPSESSION的“名稱值”屬性提供了延遲綁定,而不是松耦合;詳細(xì)討論請參閱第2項)此外,控制器和視圖都緊耦合于模型類,因為它們需要知道組成模型所使用的數(shù)據(jù)元素。問問你自己單單重用控制器而不管相應(yīng)的視圖類/模型類,真的可行嗎視圖能夠在不先進(jìn)入控制器SERVLET的情況下被成功執(zhí)行嗎對這個問題的回答一般總是“不行”。這表明,對于給定構(gòu)件里的類,本例中就是你的表示層構(gòu)件,相互之間暗含著緊耦合。這就產(chǎn)生了這樣一種現(xiàn)實狀況對于緊耦合已經(jīng)存在的地方,我們可以對傳統(tǒng)的“全面封裝”規(guī)則稍微放松一些,盡管我們曾經(jīng)如此盲目地遵守這個規(guī)則。當(dāng)然我并不是在建議,為了方便對字段進(jìn)行訪問立刻刪除所有GET/SET方法,我的建議是,你應(yīng)該對真正要保護(hù)的東西深思熟慮。例如,如果你的模型對象并不在表示層(注意這個術(shù)語;請參閱第3項)之外使用,尤其是當(dāng)這些模型對象只是對數(shù)據(jù)的簡單包裝時,比如“數(shù)據(jù)傳輸對象”(DATATRANSFEROBJECT)FOWLER,401,還要為每個字段加上GET/SET方法,真的有意義嗎請記住,封裝是用來在具體實現(xiàn)發(fā)生變化的時候,為了保護(hù)客戶端代碼而設(shè)計的,其目的并不是在構(gòu)件自身發(fā)生改變時,來保護(hù)構(gòu)件。(開發(fā)者幾乎不能從對單個的類進(jìn)行封裝中得到益處,因此只要把構(gòu)件想象成更大、粒度更粗的類,你就離目標(biāo)不遠(yuǎn)了。)假定我們有幾個類,它們相互之間緊密協(xié)作,以完成一些有用的工作。這些類要么被一起部署,要么就都不被部署。我們在尋找某種“大于對象”的東西,作為部署的核心單元。換句話說,我們要尋求的正是構(gòu)件。SERVLET規(guī)范已經(jīng)拋棄了把單個SERVLET部署到SERVLET容器中的作法,而是采用WEB應(yīng)用的思想。WEB應(yīng)用是一系列資源,諸如SERVLET、JSP、模型類、工具類、以及靜態(tài)資源(HTML、圖像、聲音文件等),它們共同地相互協(xié)作以提供所需功能。WEB應(yīng)用采用單一的WAR文件部署,所以不可能出現(xiàn)(A)只部署了部分應(yīng)用;或(B)應(yīng)用的各個部件之間的版本不匹配。實際上,WAR文件和JAVA的JAR文件目的相同,都是為了使應(yīng)用的部署更加容易;如果你曾經(jīng)使用過JAVA10,那么你一定還記得“把CLASS文件解壓縮到CLASSPATH指定的路徑下”這種部署風(fēng)格,同時你也會認(rèn)同,那時候的JAVA應(yīng)用的部署方式不那么優(yōu)雅。WAR文件提供的原子性部署意味著,只有那些被認(rèn)為是WEB應(yīng)用的組成部分的資源才會真正出現(xiàn)在部署之后的應(yīng)用里。也就是說,只有你故意強行拷貝單獨的文件到部署后的應(yīng)用目錄中,才會出現(xiàn)局部的基于“替換文件”的部署。這么做并不好,原因很多。一個重要原因是可能會引入版本不匹配的問題?!爸豢截惏l(fā)生變化的文件到部署目錄”看起來很有誘惑力,但是人們太容易忘記什么發(fā)生了改變,更重要的是,SERVLET容器并不能以我們的觀點去看待應(yīng)用發(fā)生了什么樣的變化??紤]一下CLASSLOADER。還記得嗎它由SERVLET容器創(chuàng)建,用來把你的WEB應(yīng)用從硬盤加載到JAVA虛擬機。每當(dāng)WEB應(yīng)用發(fā)生“改變”,通常是“硬盤部署目錄的內(nèi)容發(fā)生變化”的時候,SERVLET容器需要創(chuàng)建一個新的CLASSLOADER。但你要是仔細(xì)閱讀SERVLET規(guī)范就會發(fā)現(xiàn),當(dāng)新的CLASSLOADER被啟動時,它加載的是整個WEB應(yīng)用,而不是某個單獨的SERVLET。因為容器把整個WEB應(yīng)用當(dāng)作單個構(gòu)件,所以組成WEB應(yīng)用的所有CLASS都要由同一個CLASSLOADER加載。因此我們完全可以想象每當(dāng)有一個文件被拷貝到部署目錄時,就會產(chǎn)生一個新的CLASSLOADER實例,從而要執(zhí)行加載整個WEB程序的所有額外工作,這并不會帶來任何實際效益。順便提一下,要確保理解類加載策略所產(chǎn)生的切實效果,請閱讀第70項。這些問題的關(guān)鍵是,SERVLET(或J2EE中的其它)規(guī)范希望你使用構(gòu)件來構(gòu)造WEB應(yīng)用,而不是使用單獨的類。JSP規(guī)范則更進(jìn)一步通過鼓勵“可重用標(biāo)記庫”的概念,促進(jìn)了較小規(guī)模構(gòu)件在WEB應(yīng)用內(nèi)部以及跨越WEB應(yīng)用中的開發(fā)和使用。規(guī)范并不關(guān)心你

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論