05面向?qū)ο笕筇卣鱛第1頁
05面向?qū)ο笕筇卣鱛第2頁
05面向?qū)ο笕筇卣鱛第3頁
05面向?qū)ο笕筇卣鱛第4頁
05面向?qū)ο笕筇卣鱛第5頁
已閱讀5頁,還剩174頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、面向?qū)ο笕筇匦悦嫦驅(qū)ο笕筇匦愿攀鏊姓Z言編程基本都是針對這三個特性進(jìn)行編程:所以三大特性基本成為每種語言的核心面試題大學(xué)的面向?qū)ο笳n程也是圍繞這三個展開的封裝繼承多態(tài)隔離分段心法課程到了尾聲 更應(yīng)該有始有終,和你剛來的時候一樣,即使你內(nèi)心真的波動很大即使你內(nèi)心真的再為未來擔(dān)憂,即使可能面臨刀山火海。但是在這一刻。我靜下心來。教學(xué)目標(biāo)理解繼承會用代碼實現(xiàn)繼承理解繼承的原型鏈機(jī)制理解封裝性理解多態(tài)理解接口理解重載理解繼承現(xiàn)實世界的繼承現(xiàn)實世界繼承的特點(diǎn)兒子女兒和父親母親長得很像包含兩層含義:兒子女兒擁有了父親母親的某些特性比如:雙眼皮,單眼皮,身高,柳葉眉,刀眉,劍眉,聰明(主要是繼承在母親)

2、同時,兒子,女兒還有自己的一些特性,也就是兒子,女兒并不是和父親或者母親長得一模一樣編程世界的繼承問題普通產(chǎn)品,比如手機(jī)和服務(wù)類產(chǎn)品,比如保險,QQ虛擬幣,話費(fèi)充值等有什么相同,有什么不同圖書理財產(chǎn)品如何讓一個程序適應(yīng)多個含有不同屬性,不同方法的產(chǎn)品對象呢減少重復(fù)相同點(diǎn):都有名稱,價格,都需要購買,圖片,描述等不同點(diǎn):一個看得見,一個看不見一個購買之后需要物流,一個購買之后不需要物流一個購買之后可以看到具體的實物,一個購買之后可能需要你親自上門服務(wù),比如團(tuán)購的理發(fā),虛擬電影票,訂餐,培訓(xùn)等等。購買方式:一個購買直接物流,一個購買系統(tǒng)會發(fā)送給你一個二維碼,你用手機(jī)拿著二維碼去電影院,電影院服務(wù)人

3、員會拿著手機(jī)掃描你的二維碼,你就可以看電影了所以服務(wù)類產(chǎn)品比普通類產(chǎn)品多了一個二維碼屬性,多了一些方法:比如顯示二維碼,掃描二維碼等方法編程世界的繼承-兩層含義含義1:擁有父類的屬性方法(特性)含義2:擁有自己的屬性和方法繼承的定義之前我們講了人類發(fā)展 單細(xì)胞多細(xì)胞-人繼承的理念同樣來源于現(xiàn)實:兒子繼承父親的特點(diǎn)父親母親身高高,子女可能也高父親母親都是雙眼皮,子女絕對是雙眼皮在面向?qū)ο罄锩?繼承的特點(diǎn)方法屬性一個對象繼承了另一個對象,就擁有了另一個對象的特性高級語言演示如何實現(xiàn)繼承用C#/java實現(xiàn)產(chǎn)品服務(wù)演示VS使用定義產(chǎn)品對象定義服務(wù)類產(chǎn)品對象并繼承繼承的屬性:名稱,圖片,描述繼承的方法

4、:購買,放入購物車,查看詳細(xì)信息不同的屬性:二維碼屬性不同的方法:讀取二維碼,掃描二維碼方法重寫購買方法為什么需要重寫購買方法引出多態(tài)都是購買,但是執(zhí)行的內(nèi)容不一樣列舉出哪些不一樣總結(jié)三大特性術(shù)語繼承多態(tài)封裝 人的心臟就是封裝類 繼承 派生覆寫商城實戰(zhàn) JS實現(xiàn)繼承面向?qū)ο笕筇匦跃胖鼐辰缋^承的九重境界 九陽神功 九陰真經(jīng)Object中的繼承 最簡單的繼承內(nèi)置對象的繼承自定義對象的繼承多種繼承實現(xiàn)方式第三方框架實現(xiàn)繼承面向?qū)ο笕筇匦院屠^承面向未來變化編程和繼承面向接口編程和繼承設(shè)計模式 忘記模式 無招勝有招第一層從繼承的角度理解原型創(chuàng)建對象第一層繼承就是定義一個新的對象,繼承另一個對象的方法

5、和屬性前面通過原型方式創(chuàng)建一個對象A,其可以使用Object中的所有屬性和方法,這里我們就說A對象繼承了Object對象。案例創(chuàng)建一個對象,繼承Objectvar o =new Object(); var o = new Object();/這里其實就是繼承,我新創(chuàng)建的一個對象,然后繼承Object的所有屬性和方法,也就是可以使用Object的所有屬性和方法/這里繼承并不是新的概念,只是前面我們沒講這個玩意有個學(xué)名叫做繼承alert(o.toString();內(nèi)部實現(xiàn)機(jī)制繼承的本質(zhì)就是通過_proto_指針指向某個對象,系統(tǒng)能夠自動鏈?zhǔn)皆L問所指向的對象的屬性方法實例化對象oObject原型對象

6、_proto_proto_null_proto_復(fù)習(xí)函數(shù)的屬性之一對象都是函數(shù)其實就是地址繼承中的定義:基類 子類這里我們稱o對象為兒子,又稱子類,派生類Object為父親,又稱分類,基類祖先整個js世界都繼承自O(shè)bject,都可以訪問Object中的方法和屬性。所以,Object是所有對象的祖先,是生命誕生的鼻祖繼承第一層的特性在不破話原有代碼結(jié)構(gòu)情況下重寫基類在不破話原有代碼結(jié)構(gòu)情況下擴(kuò)展基類前面我們已經(jīng)講過該部分功能。第二層內(nèi)置對象的繼承關(guān)系所有的內(nèi)置對象都繼承在Object,除了擁有自身的方法和屬性之外,還擁有Object的所有屬性和方法Object對象constructor對一個Ja

7、vascript函數(shù)的引用,該函數(shù)是對象的構(gòu)造函數(shù)。hasOwnProperty()檢查對象是否有局部定義的(非繼承的)、具有特定名字的屬性。isPrototypeOf()檢查對象是否是指定對象的原型。propertyIsEnumerable()檢查指定的屬性是否存在,以及是否能用for/in循環(huán)枚舉。toLocaleString()返回對象地方化的字符串表示。toString()返回對象的字符串表示。valueOf()返回對象的原始值(如果存在)。Arguments對象callee對當(dāng)前正在執(zhí)行函數(shù)的引用。length傳遞給函數(shù)的實際參數(shù)個數(shù)Arguments對象(只在函數(shù)內(nèi)部定義) 總結(jié)萬

8、物皆繼承自O(shè)bject更準(zhǔn)確的說:萬物皆繼承自O(shè)totype第三層自定義對象的繼承復(fù)習(xí):繼承的本質(zhì)就是通過_proto_指針指向某個對象,系統(tǒng)能夠自動鏈?zhǔn)皆L問所指向的對象的屬性方法。那么對于自定義對象的繼承,只需要讓第二個對象的_proto_指向另一個對象即可通過C#演示繼承產(chǎn)品基礎(chǔ)產(chǎn)品服務(wù)類產(chǎn)品爺爺 父親兒子Class SuperFatherClass Father : SuperFatherClass Child: Father 用js實現(xiàn)上述繼承 父類function SuperParent() = mike; 子類繼承父親:function Parent() this.age = 12

9、; Ptotype = new SuperParent(); / 父親繼承爺爺,通過原型,形成鏈條 var test = new Parent(); alert(test.age); alert();/得到被繼承的屬性 三次繼承繼續(xù)原型鏈繼承 function Child() this.weight = 60; Ctotype = new Parent();/繼續(xù)原型鏈繼承 var child= new Child(); alert();/繼承了Parent和Child,彈出mike alert(child.age);/彈出12繼承當(dāng)中的原

10、型鏈父實例(包含父親屬性方法)兒子類/對象兒子原型對象_proto_proto_父對象原型對象_proto_這里能夠訪問父對象所有的屬性 方法這里能夠保證訪問父對象原型中的所有屬性和方法Object原型Object對象_proto_null繼承中的屬性搜索法則演示1爺爺使用所有人祖先Obect中屬性方法var test = new SuperParent();/alert();/alert(test.toString();訪問鏈: SuperParent構(gòu)造對象 SuperParent原型對象 Object對象- Obect原型對象(找到toString方法) null50繼承中的屬性搜索法則

11、演示2兒子使用爺爺中的屬性var child = new Child();alert();繼承中的原型鏈核心知識點(diǎn) 鏈?zhǔn)剿阉鳈C(jī)制:首先訪問Child構(gòu)造函數(shù),發(fā)現(xiàn)沒有name屬性尋找_proto_,判斷起指針是否為空指向Child原型函數(shù),尋找有沒有name屬性沒有找到,則判斷其_proto_屬性是否為null,如果不為null,繼續(xù)搜索-找到parent實例對象,檢查是否有name屬性,沒有。繼承和面向?qū)ο缶幊虒⒅貜?fù)的代碼放在基類練習(xí)計算周長第四層其他繼承方式構(gòu)造函數(shù)繼承用于繼承屬性原型繼承存在的問題無法傳參在Student的構(gòu)造方法中,無法使用new Student(00001 , 張三

12、, 12) ;創(chuàng)建對象,并初始化name和age屬性,必須, stu.age進(jìn)行賦值構(gòu)造函數(shù)繼承語法使用call方法,第一個參數(shù)為上下文functionPerson(name,age,test,test2)Ptotype.say=function()functionStudent(name,age,no)Person.call(this, age,test2); /自己的屬性this.no=no; Stotype=newPerson();varstu1=newStudent(0001,張三,11);組合繼承實現(xiàn)了繼承屬性和方法組合繼承 最佳組合原理:屬性使用構(gòu)造函數(shù)繼承方法使用原型繼承寄生繼承

13、寄生式繼承原理:通過工廠方法在函數(shù)中繼承一個類(對象)并將新的類(對象)返回這種繼承方式是把原型式+工廠方法模式結(jié)合起來,目的是為了封裝創(chuàng)建的過程。工廠方法定義就是一個專門制造“方法”的工廠語法規(guī)則首先定義只包含基本屬性的對象定義方法工廠將屬性寄生給方法工廠“重新組裝”對象也就是方法通過方法工廠來“制造”寄生語法案例 定義屬性var person = name: Nicholas,friends: Shelby, Court, Van;案例2定義方法工廠function createPerson(original)var clone = new Object(original); /通過調(diào)用函

14、數(shù)創(chuàng)建一個新對象var clone =function(original)clone.sayHi = function() /以某種方式來增強(qiáng)這個對象alert(hi);return clone; /返回這個對象案例3 組裝和制造var anotherPerson = createPerson(person);anotherPerson.sayHi(); /hi拷貝繼承問題var Chinese = nation:中國;var Doctor =career:醫(yī)生請問怎樣才能讓醫(yī)生去繼承中國人,也就是說,我怎樣才能生成一個中國醫(yī)生的對象?這里要注意,這兩個對象都是普通對象,不是構(gòu)造函數(shù),無法使用

15、構(gòu)造函數(shù)方法實現(xiàn)繼承。除了使用prototype鏈以外,還有另一種思路:把父對象的屬性,全部拷貝給子對象,也能實現(xiàn)繼承。多繼承第五層第三方框架Class.jsCanvas 第三方框架Extend()我們真正開發(fā)的時候 用的就是第三方框架使用第三方框架改造案例第六層封裝性 多態(tài)性面向?qū)ο罄斫饣仡櫳钪幸磺惺挛锝詫ο螅@個如果你能理解,你就理解了面向?qū)ο蟆C嫦驅(qū)ο缶褪悄M現(xiàn)實。和現(xiàn)實一樣,面向?qū)ο笥腥筇卣鳎悍庋b性,繼承性,多態(tài)性現(xiàn)實世界的三大特性現(xiàn)實生活人,雞,鴨,建筑,山,河,湖,海等等都可以理解為一個對象。我們可以把和人相關(guān)的一些屬性,動作封裝在人這個對象里面。比如人的屬性:年齡。人的動作:

16、吃飯,走路,睡覺。機(jī)器:為我所用。 - 使用石器。繼承:祖先,父親,兒子。多態(tài):動物的多態(tài)性。植物的多態(tài)性。封裝性 先形成對象思維轉(zhuǎn)變-函數(shù)思維到面向?qū)ο笏季S拿到一個案例如何做 第一種方式: 函數(shù),將所有的功能放在一個函數(shù)里面第二種方式:面向?qū)ο笏季S顛覆思維1 封裝性 - 淘寶案例拿到一個需求: 比如淘寶用戶對象登陸方法注冊方法產(chǎn)品對象查看方法搜索方法購買方法訂單對象購物車對象采用函數(shù)的方法登陸函數(shù)注冊函數(shù)查看所有產(chǎn)品函數(shù)思維1 封裝性:我們可以將方法屬性歸類到一個對象當(dāng)中,比如產(chǎn)品對象放置和產(chǎn)品有關(guān)的方法,屬性,這就是封裝性電腦世界的面向?qū)ο驝PU 英特爾 ADM 臺灣 龍芯。內(nèi)存顯卡電源主

17、板鼠標(biāo)鍵盤新浪體育世界的面向?qū)ο笄騿T教練球隊新聞一場比賽排名賽程封裝性好處將屬性方法歸類,條理清晰當(dāng)出現(xiàn)錯誤,容易發(fā)現(xiàn)問題,先找到其屬于哪個對象隔離作用,當(dāng)代碼出現(xiàn)錯誤,不會影響其他對象封裝變化,對于一個需求經(jīng)常變動的地方,封裝起來,這樣當(dāng)代碼需要經(jīng)常修改,只需要修改單一方法封裝復(fù)雜:將一些復(fù)雜的功能封裝起來,方便使用面向?qū)ο蠛痛罘e木封裝性和搭積木理解面向?qū)ο缶皖愃粕w房子,先把蓋房子需要的各種對象實現(xiàn)出來或者制造出來,比如水泥,鋼筋,磚頭等然后再用這些對象組裝房子函數(shù)式編程:將所有功能放在一個函數(shù)里面 - 漿糊編程面向?qū)ο缶幊蹋簝?yōu)雅編程。function Build(水泥,鋼筋混凝土,磚頭)建

18、筑設(shè)計師.設(shè)計(建筑圖紙);建筑工人.堆砌(磚頭) 狹義封裝性定義封裝就是保護(hù)內(nèi)容,保證類的某些屬性或者是方法不被外部看見。封裝的實現(xiàn):為屬性封裝:private 屬性類型 屬性名稱為方法封裝:private 方法返回值 方法名稱(參數(shù)列表);functionPerson(name,age)=name;/定義一個公有變量this.age=age;this.show=function()/定義一個公有函數(shù)alert(name:+name+;age:+age);varbill=newPerson(Bill,20);alert();/通過可以訪問,證明其公有性bill.show();Var fn =

19、 fucntion() return add:fucntion()Window.$= winow.jquery問題怎么聲明一個私有變量呢?事實上就像前面說的,JavaScript根本沒有私有作用域這一說變相解決方法其實對象就是一個函數(shù),函數(shù)內(nèi)定義的變量只在函數(shù)內(nèi)可見代碼和上面一樣,只是把this改成varfunctionPerson(name,age)varname=name;/私有屬性varage=age;varshow=function()/私有函數(shù)alert(name:+name+;age:+age);varbill=newPerson(Bill,20);alert();/無法訪問 -

20、undefinedbill.show();/error,不存在訪問私有變量和公有變量訪問私有變量:使用變量的名字訪問公有變量:使用this關(guān)鍵字。functionPerson(name,age)this.myName=name; /公有屬性varmyAge=age; /私有變量 /公有方法this.show=function()alert(show=name:+this.myName+;age:+myAge); /私有方法varshowAll=function()alert(showAll=name:+this.myName+;age:+myAge);varbill=newPerson(Bil

21、l,20);bill.show();全局變量 靜態(tài)變量多個實例可以共享數(shù)據(jù)Person.num=0;/靜態(tài)屬性functionPerson()this.show=function()alert(num:+Person.num);Person.num+;varbill=newPerson();bill.show();/1vartom=newPerson();tom.show();/2bill.show();/2廣義封裝性廣義封裝定義封裝某些功能成一個函數(shù),對象講一個系統(tǒng)拆分成不同的模塊,然后組裝成系統(tǒng)比如計算機(jī)分成 cpu 硬盤 計算機(jī)是有cpu 硬盤組裝起來的開發(fā): cpu對象, 硬盤對象.廣

22、義封裝的原則封裝變化點(diǎn)封裝單個功能 單一職責(zé)原則封裝復(fù)雜點(diǎn)封裝功能成多個模塊 模塊化編程 框架設(shè)計中已經(jīng)講過 命名空間 閉包 對象 函數(shù)等都可以實現(xiàn)模塊封裝成組件 框架幻燈片組件,tab組件,瀑布流組件基于框架封裝業(yè)務(wù)邏輯 基于框架,組件,比如幻燈片和ajax結(jié)合多態(tài)世界多態(tài)是一種思想 多態(tài)不是一種技術(shù),是你解決問題的方針,指導(dǎo)思想。多態(tài)通俗定義同類事物,多種形態(tài)人的多態(tài):男人,女人動物的多態(tài):鴨子,鵝,雞,豬。,動物叫聲多態(tài):雖然動物都會叫,但是叫聲也是多態(tài)的鳥鳴,豬吼,虎嘯,狼嚎,龍吟,猿鳴,馬嘶,獅吼,犬吠,鳥啼多態(tài)和詩意世界都是叫聲,但是叫聲是多態(tài)的1、鵝 曲項向天歌 2、稻花香里說豐

23、年,聽取蛙聲一片 3、月出驚山鳥,時鳴春澗中.多態(tài)通俗定義總結(jié)世界之所以多彩,詩意,源于多態(tài)官方定義多態(tài)(英語:Polymorphism),是指面向?qū)ο蟪绦蜻\(yùn)行時,相同的消息可能會送給多個不同的類之對象,而系統(tǒng)可依據(jù)對象所屬類,引發(fā)對應(yīng)類的方法,而有不同的行為多態(tài)生活場景理解拍電影 action主角表演照明師燈光 對主角補(bǔ)光攝影師 跟蹤主角拍攝道具師撒上雪飛JS中的多態(tài)世界從新浪體育板塊開始談起假如我們要實現(xiàn)如下功能:比賽完一場比賽之后,如下需要更新:比賽結(jié)果更新球隊信息更新教練信息更新球員信息更新賽程信息更新排名信息更新如果將球隊,教練,球員,賽程,排名等各自用一個對象表示,其都有一個方法更

24、新,雖然都是更新,但是更新的內(nèi)容不一樣,這就是多態(tài)多態(tài)多態(tài)和觀察者模式實現(xiàn)一處變化,所有皆變。相關(guān)課程會在設(shè)計模式觀察者模式詳細(xì)展開。敬請期待。繼承實現(xiàn)多態(tài)繼承本身就是多態(tài)的一種實現(xiàn)。同類事物-多態(tài)。通過淘寶理解繼承場景以產(chǎn)品購買為例電器,手機(jī)類(需要郵寄)充值業(yè)務(wù),陪聊(不需要郵寄)這兩個產(chǎn)品只有購買這個方法實現(xiàn)不一樣但是其余都是一樣的,我們沒有必要全部重寫我們可以這樣做:基類名稱服務(wù)類產(chǎn)品購買方法普通產(chǎn)品購買方法繼承多態(tài)實戰(zhàn) - 計算周長通過商城例子理解多態(tài)通過周長例子理解多態(tài)多態(tài)的多種實現(xiàn)方式前面繼承可以實現(xiàn)多態(tài)重載也是多態(tài)的一種體現(xiàn)多態(tài)的實現(xiàn)方式方法重載定義:一個方法,名稱相同,通過參

25、數(shù)個數(shù)不同或者參數(shù)的類型不同執(zhí)行不同的功能高級語言是支持重載多態(tài)的,但是JavaScript不支持在.Net中有方法的重載,方法名稱相同,參數(shù)不同或者參數(shù)類型不同,被視為不同的方法。但是在Javascript中,如果函數(shù)名稱相同,無論參數(shù)怎么不相同,調(diào)用 的時候始終會以最后一個函數(shù)為有效函數(shù),怎么解決這個問題呢,下面就介紹一下函數(shù)的重載:C#等高級語言的多態(tài)function Add(a,b)function Add(a,b,c)JS不支持方法重載。比如在其他高級語言中,比如C#,java等。如上兩個函數(shù)會被視為不同的函數(shù)調(diào)用:Add(2,3);Add(2,3,4)但是在JavaScript中,

26、不支持函數(shù)重載實現(xiàn)通過函數(shù)參數(shù)個數(shù)區(qū)分重載實現(xiàn)方式 類型不同var MyClass=function() var AddNum=function(a,b) return a+b; var AddString=function(a,b) return I am here+a+b; this.Add=function(a,b) if(typeof(a)=number) return AddNum(a,b); else return AddString(a,b); var MyObj = new MyClass(); var X = MyObj.Add(5,6); var Y = MyObj.Add

27、(A,FFFFFF); alert(X); /結(jié)果:11 alert(Y); /結(jié)果:I am hereAFFFFFF通過函數(shù)的arguments屬性實現(xiàn)重載function add() var sum = 0 ; for ( var i = 0 ; i arguments.length; i + ) sum += argumentsi; return sum; function test() alert(add(); alert(add( 1 , 2 ); alert(add( 1 , 2 , 3 ); 第七層面向接口編程面向抽象編程面向未來編程現(xiàn)實生活中的接口接口是什么接口就是一個協(xié)議,規(guī)

28、定大家都必須遵守的協(xié)議接口連接整個世界電腦是由不同公司生產(chǎn)的零部件組裝成的聯(lián)想,戴爾,惠普,華碩等只是一個組裝公司CPU英特爾 AMD 龍芯 硬盤-希捷 西部數(shù)據(jù) 日立鼠標(biāo)鍵盤優(yōu)盤為什么他們之間可以彼此獨(dú)立生產(chǎn)因為業(yè)界標(biāo)準(zhǔn)化組織規(guī)定了通用接口:比如USB 接口:用于連接優(yōu)盤和計算機(jī)。所有的優(yōu)盤生產(chǎn)廠商,電腦組裝廠商都必須遵循這個接口。采用接口(協(xié)議)的好處實現(xiàn)了模塊化制造,各個模塊通過接口聯(lián)系起來英特爾專門研究CPU(必須滿足接口)硬盤廠商專門生產(chǎn)硬盤由于模塊化,導(dǎo)致分工明細(xì),從而保證大規(guī)模項目團(tuán)隊化制造,多團(tuán)隊制造。我們常見的汽車制造,飛機(jī)制造,電器制造都是模塊化多團(tuán)隊制造出來的。復(fù)雜的網(wǎng)站

29、比如淘寶,京東,騰訊,百度都是至少100個團(tuán)隊一起開發(fā)出來的。面向接口制造 - 靈活組裝,替換容易子模塊比如優(yōu)盤再制造的時候,不管內(nèi)部如何復(fù)雜,但是對外提供的接口都是USB,這正好滿足了封裝性。CPU也是一樣,不管內(nèi)部CPU如何復(fù)雜,但是接口都是一樣的。再組裝電腦的時候,聯(lián)想公司不用關(guān)心CPU,硬盤,內(nèi)存如何制造的,它只需要知道接口即可。即使未來出現(xiàn)新的cpu,新的優(yōu)盤,只要接口不變,那么整體功能也不用任何修改。比如我們換個優(yōu)盤。換個CPU。這樣即使對方還沒制造出來子模塊,依舊可以同步進(jìn)行組裝接口思想遍布整個世界團(tuán)隊1 function animate()Animate.add(left:10

30、0px);接口的重要性整個世界都是通過接口連接在一起的。是萬物聯(lián)系的根本,很難用語言描述其重要性。制造行業(yè)汽車制造電腦制造輪船制造飛機(jī)制造。互聯(lián)網(wǎng)世界HTTP協(xié)議 TCP協(xié)議Web Service編程世界中的接口協(xié)議種類1 前后臺通信協(xié)議前后臺通信協(xié)議:json xml前后臺開發(fā)人員如何合作:通過接口首先前后后臺人員坐下來商量前臺需要什么json,后臺人員需要什么參數(shù)。比如登陸,前臺人員需要后臺返回登陸成功的狀態(tài),如果成功,顯示登陸成功,如果失敗提示登陸失敗。后臺人員需要前臺人員返回登陸的用戶名和密碼。講解:這些其實就屬于協(xié)議,大家規(guī)定好協(xié)議之后,彼此獨(dú)立開發(fā),互不影響,都按照這個規(guī)定的協(xié)議各

31、自開發(fā)各自的功能。前臺不用關(guān)心后臺人員如何操縱數(shù)據(jù)庫,如何使用PHP鏈接數(shù)據(jù)庫等各種復(fù)雜知識,只需要關(guān)注json這個協(xié)議即可。后臺人員也不用關(guān)心登陸成功如何顯示,只需要把json字符串傳遞給前臺即可。協(xié)議2 不同開發(fā)人員之間的協(xié)議多人開發(fā)項目中,一般都是每個人負(fù)責(zé)編寫不同的模塊(對象),當(dāng)別人需要使用你寫的對象的時候,你們可以坐下來溝通下接口,讓對方先去使用你寫的功能,至于有沒有實現(xiàn),如何實現(xiàn),對方不關(guān)心,最簡單的方法就是定義一個對象,定義一個空方法。或者方法中暫時返回假數(shù)據(jù)。先讓其他人能夠使用。協(xié)議3 不用系統(tǒng)之間的協(xié)議多系統(tǒng)開發(fā)一般使用web Service 作為溝通橋梁,代理模式或者中介

32、模式處理不同系統(tǒng)之間的通信。面向?qū)ο蠼涌谒季S接口一般用于規(guī)定某個對象必須實現(xiàn)的方法對于大型網(wǎng)站開發(fā)。如果采用面向?qū)ο箝_發(fā)。將系統(tǒng)分成多個模塊(對象),我們可以像搭積木一樣構(gòu)建整個功能。構(gòu)建的時候我們面向接口編程。首先每個模塊提供一個接口。這個接口是恒定的,不變的。我們不關(guān)心內(nèi)部是如何實現(xiàn)的。只關(guān)心這個接口如何使用的。面向接口編程步驟規(guī)定接口 電腦usb接口,串行接口,并行接口按照接口編寫子模塊 制造零件面向接口編程組裝電腦看看高級語言如何使用接口編程必須有后臺語言的基礎(chǔ)第一步:規(guī)定接口接口一般由架構(gòu)師定義。架構(gòu)師會將系統(tǒng)拆分成多個模塊(對象)-零部件每個對象都封裝一些方法和屬性,同時通過接口暴

33、露出來使用方法(和對象的公有方法有些類似,只不過接口暫時不用實現(xiàn),只是告訴團(tuán)隊成員如何使用這個對象)使用接口:以后編程的時候,各個團(tuán)隊直接使用接口,而不用關(guān)心每個對象(模塊實現(xiàn)細(xì)節(jié))。這樣以后不管對象如何變化,只要對外暴露的接口不變,整體功能就不會影響。高級語言定義接口比如新浪體育 定義接口Interface IUpdateUpdate()第二步:實現(xiàn)模塊這里模塊除了要包含自身的功能(屬性,方法)之外,還需要實現(xiàn)接口。就類似CPU,除了要實現(xiàn)自身的功能,還要實現(xiàn)接口,接口是給別人使用的。定義子模塊(對象)并實現(xiàn)接口比如新浪體育Player: IUpdateUpdate();/實現(xiàn)update方

34、法Jiaolian: IupdateUpdate();/實現(xiàn)update方法所有團(tuán)隊都知道這些對象含有update方法第三步:面向接口編程組裝電腦的過程,比如一個函數(shù):function Test()Yaoming.update();Kebe.update(); JS實現(xiàn)接口JS無法強(qiáng)制實現(xiàn)某接口,故我們一般采用口頭約束或者注釋約束再次重申:我們學(xué)習(xí)的重點(diǎn)不是代碼,不要關(guān)注是否支持接口,而是這種編程思維,多人合作編程思維。大型項目多團(tuán)隊編程思維。一切道理都是相通的,制造業(yè)的模塊化制造,編程的模塊化編程,建筑的模塊化建設(shè)等等本質(zhì)都是相通的。這里要求同學(xué)了解面向?qū)ο笏季S的基礎(chǔ)理論。后面的設(shè)計模式我們

35、會重點(diǎn)講述面向?qū)ο笏季S。面向?qū)ο蠼鉀Q的問題封裝世界,應(yīng)對變化應(yīng)對變化需求變化代碼需要不斷的完善,每次變化差的架構(gòu)需要改動很多代碼,而好的代碼只需要修改最少的代碼面向未來(變化)編程什么叫面向未來編程由于用戶的需求時刻變化,導(dǎo)致我們開發(fā)好的代碼也不是一成不變的,也是需要不斷修改的。為了應(yīng)對這些可能的變化,必須讓代碼模塊化。這樣就算變化也只會影響某個模塊而不會影響全局。如何更好應(yīng)對變化一群軟件大師根據(jù)建筑學(xué)等理論得出了如下幾個原則:開放封閉原則(有變化,盡量不修改原來的代碼,擴(kuò)充功能)單一職責(zé)原則 這樣變化了,容易找到問題通俗講解:單一職責(zé)原則:每個對象只有一個引起他變化的原因,這樣需求變化的時候

36、,很快定位到是哪個對象需要修改,而不是修改多個對象,如果剛開始架構(gòu)合理,是可以完美應(yīng)對需求變化的好的架構(gòu)師從容應(yīng)對需求變化封裝變化分離算法分層 設(shè)計 前端 后臺 數(shù)據(jù)庫 服務(wù)好的架構(gòu)師可以讓新人寫的代碼再差,也不會影響大局,因為采用了模塊化,低耦合,讓你寫的代碼盡量和別人寫的聯(lián)系少,或者通過中間橋梁來溝通,你寫的再差,頂多會影響到橋梁學(xué)習(xí)思維而不是代碼應(yīng)對變化有多種解決方案,繼承只是其中一種,甚至只用函數(shù)也能解決。重要的不是代碼,而是這種思維。只要你懂得這些思想,不管是用函數(shù),還是用面向?qū)ο?,不管用不用繼承都可以解決問題。比如我們就將變化點(diǎn)封裝在一個函數(shù)里面,也能實現(xiàn)我們需要的功能。用多個文件

37、來隔離多個功能也能實現(xiàn)重點(diǎn)是你要有這種解決問題的思維。有些人學(xué)面向?qū)ο髮W(xué)了很多年也就不會用,關(guān)鍵是不理解。繼承和開放封閉原則比如目前淘寶產(chǎn)品有 普通產(chǎn)品和服務(wù)類產(chǎn)品,如果未來淘寶需要新增一種產(chǎn)品,比如理財產(chǎn)品,那么不需要修改原有代碼,只需要用繼承的方式新增代碼,而無需改動。但是前提:你作為架構(gòu)師再剛開始架構(gòu)產(chǎn)品模塊的時候能夠憑借你的經(jīng)驗感覺到這里未來可能會變化。這個需要大量的經(jīng)驗。這也是為什么大家有理論而無法成為架構(gòu)師的原因,實踐太少。繼承和單一職責(zé)原則雖然都是產(chǎn)品類,但是產(chǎn)品也是多態(tài)的,雖然都含有購買方法,但是購買的流程未必一樣。同樣是產(chǎn)品,虛擬貨幣,保險類產(chǎn)品和電器,手機(jī)都產(chǎn)品的屬性有些是

38、不一樣的。所以:共性放在基類中,特性通過繼承的方式繼承的對象只含有某類產(chǎn)品的方法屬性總結(jié)繼承作用繼承不是一種技術(shù),是你解決問題的方針,指導(dǎo)思想。定義一個新的對象 ,使得其擁有另一個對象的功能(屬性和方法)減少拷貝和代碼相同(如果一個地方出錯,代碼相同的話,需要修改很多地方,不知道大家有沒有遇到這種情況,可以將一樣的地方用函數(shù)封裝)模塊化降低系統(tǒng)之間的耦合,從而更好應(yīng)對未來需求變化帶來的代碼修改,有經(jīng)驗的人知道,很多項目失敗是因為架構(gòu)查,到了最后,用戶隨便一個不滿意,都會導(dǎo)致代碼全部改動,進(jìn)而加班瘋狂改動。繼承的好處核心:模塊化編程,降低耦合應(yīng)對需求變化:隨著時間流逝,產(chǎn)品需求可能對你類的行為有

39、更多的要求(案例:計算周長)其他好處擴(kuò)展功能修改功能通過繼承實現(xiàn)代碼重用第八層設(shè)計模式23種設(shè)計模式概述第九層忘記模式 揮灑自如 無招勝有招繼承和設(shè)計模式忘記模式 自創(chuàng)模式揮灑自如,靈活運(yùn)動無招勝有招隨著開發(fā)經(jīng)驗提高,很自然的就會根據(jù)需求,場景創(chuàng)造適合當(dāng)前開發(fā)場景的最佳模式基礎(chǔ):必須修煉完成前四層中級:第五層,第六層,第七層高級:第八層,第九層 知識補(bǔ)充從js發(fā)展歷程理解原型的出現(xiàn)的歷史原因從古代說起要理解Javascript的設(shè)計思想,必須從它的誕生說起。1994年,網(wǎng)景公司(Netscape)發(fā)布了Navigator瀏覽器0.9版。這是歷史上第一個比較成熟的網(wǎng)絡(luò)瀏覽器,轟動一時。但是,這個

40、 版本的瀏覽器只能用來瀏覽,不具備與訪問者互動的能力。比如,如果網(wǎng)頁上有一欄用戶名要求填寫,瀏覽器就無法判斷訪問者是否真的填寫了,只有讓服務(wù)器 端判斷。如果沒有填寫,服務(wù)器端就返回錯誤,要求用戶重新填寫,這太浪費(fèi)時間和服務(wù)器資源了早期版本js因此,網(wǎng)景公司急需一種網(wǎng)頁腳本語言,使得瀏覽器可以與網(wǎng)頁互動。工程師Brendan Eich負(fù)責(zé)開發(fā)這種新語言。他覺得,沒必要設(shè)計得很復(fù)雜,這種語言只要能夠完成一些簡單操作就夠了,比如判斷用戶有沒有填寫表單。第二階段 面向?qū)ο笈d起1994年正是面向?qū)ο缶幊蹋╫bject-oriented programming)最興盛的時期C+是當(dāng)時最流行的語言,而Java語言的1.0版即將于第二年推出,Sun公司正在大肆造勢。Brendan Eich無疑受到了影響,由于java對世界的影響,js以java命名開頭,其實只是利用java來提

溫馨提示

  • 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

提交評論